From: Paul Eggert Date: Wed, 19 Dec 2012 04:36:22 +0000 (-0800) Subject: build: new configure option --enable-gcc-warnings X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Ftar;a=commitdiff_plain;h=cbc51277aa4de1f41434ba073f2e4546ead63005 build: new configure option --enable-gcc-warnings This has a similar meaning as in other GNU applications such as coreutils and Emacs. * NEWS: Document it. * .gitignore: Remove redundant build-aux. Remove gnu, since gnu/Makefile.am is now in git. Add gnu/.gitignore, gnu/charset.alias, gnu/*.h, gnu/*/ to cover autogenerated files. * bootstrap.conf (gnulib_mk): Remove. * configure.ac: Add support for --enable-gcc-warnings, taken from coreutils and simplified. * gnu/Makefile.am: New file. Formerly this was autogenerated, but the autogenerated file has been renamed to gnulib.mk, its usual name when bootstrapping from gnulib. This way, AM_CFLAGS can incorporate warning options. * gnulib.modules: Add manywarnings. * lib/Makefile.am, src/Makefile.am (AM_CFLAGS): New macro, incorporating warning options. * lib/attr-xattr.in.h (ENOATTR): New macro, if not already defined. * src/buffer.c (magic): Don't rely on incomplete initializers. * src/common.h (report_difference): Add printf format attribute. * src/system.c (sys_exec_command, sys_exec_info_script) (sys_exec_checkpoint_script): * src/tar.c (update_argv): Add casts to char * to pacify GCC warnings about using string literals in a char * context. * src/xattrs.c, src/xattrs.h (xattrs_clear_setup): Declare parameters as (void), not (). * src/xheader.c (xheader_format_name): Initialize pptr to null, to pacify GCC. Remove unnecessary test of nptr versus null. --- diff --git a/.gitignore b/.gitignore index 1abb25e..d9bb48b 100644 --- a/.gitignore +++ b/.gitignore @@ -16,14 +16,16 @@ Makefile Makefile.in aclocal.m4 autom4te.cache -build-aux build-aux/ config.h config.h.in config.log config.status configure -gnu +gnu/.gitignore +gnu/charset.alias +gnu/*.h +gnu/*/ gnulib libtool m4 diff --git a/NEWS b/NEWS index 749bb3b..25a175e 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,4 @@ -GNU tar NEWS - User visible changes. 2012-11-19 +GNU tar NEWS - User visible changes. 2012-12-18 Please send GNU tar bug reports to @@ -11,9 +11,7 @@ adjusted to quote 'like this' (with apostrophes) instead of `like this' (with an accent grave character and an apostrophe). This tracks recent changes to the GNU coding standards. -* New features - -** --owner and --group names and numbers +* --owner and --group names and numbers The --owner and --group options now accept operands of the form NAME:NUM, so that you can specify both symbolic name and numeric ID @@ -45,6 +43,8 @@ Additionally, the options --xattrs-include and --xattrs-exclude allow you to selectively control for which files to store (or extract) the extended attributes. +* New configure option --enable-gcc-warnings, intended for debugging. + version 1.26 - Sergey Poznyakoff, 2011-03-12 diff --git a/bootstrap.conf b/bootstrap.conf index e0bca02..2935693 100644 --- a/bootstrap.conf +++ b/bootstrap.conf @@ -19,7 +19,6 @@ source_base=gnu gnulib_name=libgnu -gnulib_mk=Makefile.am # We don't need these modules, even though gnulib-tool mistakenly # includes them because of gettext dependencies. diff --git a/configure.ac b/configure.ac index 8225031..35edb08 100644 --- a/configure.ac +++ b/configure.ac @@ -113,6 +113,86 @@ gl_INIT # paxutils modules tar_PAXUTILS +AC_ARG_ENABLE([gcc-warnings], + [AS_HELP_STRING([--enable-gcc-warnings], + [turn on many GCC warnings (for developers; best with GNU make)])], + [case $enableval in + yes|no) ;; + *) AC_MSG_ERROR([bad value $enableval for gcc-warnings option]) ;; + esac + gl_gcc_warnings=$enableval], + [if test -d "$srcdir"/.git; then + gl_gcc_warnings=yes + else + gl_gcc_warnings=no + fi] +) + +if test "$gl_gcc_warnings" = yes; then + gl_WARN_ADD([-Werror], [WERROR_CFLAGS]) + AC_SUBST([WERROR_CFLAGS]) + + nw= + # This, $nw, is the list of warnings we disable. + nw="$nw -Wformat-nonliteral" # warnings in Fedora 17 stdio.h + nw="$nw -Wvla" # warnings in gettext.h + nw="$nw -Wswitch-default" # Too many warnings for now + nw="$nw -Wunsafe-loop-optimizations" # It's OK to omit unsafe optimizations. + nw="$nw -Winline" # It's OK to not inline. + nw="$nw -Wstrict-overflow" # It's OK to optimize strictly. + nw="$nw -Wsuggest-attribute=pure" # Too many warnings for now. + + gl_MANYWARN_ALL_GCC([ws]) + gl_MANYWARN_COMPLEMENT([ws], [$ws], [$nw]) + for w in $ws; do + gl_WARN_ADD([$w]) + done + gl_WARN_ADD([-Wno-sign-compare]) # Too many warnings for now + gl_WARN_ADD([-Wno-type-limits]) # It's OK to optimize based on types. + gl_WARN_ADD([-Wno-unused-parameter]) # Too many warnings for now + gl_WARN_ADD([-Wno-format-nonliteral]) + + gl_WARN_ADD([-fdiagnostics-show-option]) + gl_WARN_ADD([-funit-at-a-time]) + + AC_SUBST([WARN_CFLAGS]) + + AC_DEFINE([lint], [1], [Define to 1 if the compiler is checking for lint.]) + AH_VERBATIM([FORTIFY_SOURCE], + [/* Enable compile-time and run-time bounds-checking, and some warnings, + without upsetting glibc 2.15+. */ + #if !defined _FORTIFY_SOURCE && defined __OPTIMIZE__ && __OPTIMIZE__ + # define _FORTIFY_SOURCE 2 + #endif + ]) + AC_DEFINE([GNULIB_PORTCHECK], [1], [enable some gnulib portability checks]) + + # Use a slightly smaller set of warning options for lib/. + # Remove the following and save the result in GNULIB_WARN_CFLAGS. + nw= + nw="$nw -Wmissing-prototypes" + nw="$nw -Wunused-macros" + # + # These are for argp. + nw="$nw -Wmissing-field-initializers" + nw="$nw -Wshadow" + # + gl_MANYWARN_COMPLEMENT([GNULIB_WARN_CFLAGS], [$WARN_CFLAGS], [$nw]) + + # This is also for argp. + gl_WARN_ADD([-Wno-missing-field-initializers], [GNULIB_WARN_CFLAGS]) + + AC_SUBST([GNULIB_WARN_CFLAGS]) + + # For gnulib-tests, the set is slightly smaller still. + nw= + # It's not worth being this picky about test programs. + nw="$nw -Wsuggest-attribute=const" + gl_MANYWARN_COMPLEMENT([GNULIB_TEST_WARN_CFLAGS], + [$GNULIB_WARN_CFLAGS], [$nw]) + AC_SUBST([GNULIB_TEST_WARN_CFLAGS]) +fi + TAR_HEADERS_ATTR_XATTR_H AC_CHECK_FUNCS_ONCE([fchmod fchown fsync lstat mkfifo readlink symlink]) diff --git a/gnu/Makefile.am b/gnu/Makefile.am new file mode 100644 index 0000000..299bb0e --- /dev/null +++ b/gnu/Makefile.am @@ -0,0 +1,3 @@ +# Make the subset of Gnulib that GNU tar needs. +include gnulib.mk +AM_CFLAGS += $(GNULIB_WARN_CFLAGS) $(WERROR_CFLAGS) diff --git a/gnulib.modules b/gnulib.modules index a3e0f25..b1f0c88 100644 --- a/gnulib.modules +++ b/gnulib.modules @@ -34,6 +34,7 @@ inttypes lchown linkat localcharset +manywarnings mkdtemp mkfifoat modechange diff --git a/lib/Makefile.am b/lib/Makefile.am index a484fcd..08e7fd7 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -27,6 +27,7 @@ rmt-command.h : Makefile BUILT_SOURCES = rmt-command.h CLEANFILES = rmt-command.h rmt-command.h-t AM_CPPFLAGS = -I$(top_srcdir)/gnu -I../ -I../gnu +AM_CFLAGS = $(GNULIB_WARN_CFLAGS) $(WERROR_CFLAGS) noinst_HEADERS = system.h system-ioctl.h rmt.h paxlib.h stdopen.h xattr-at.h libtar_a_SOURCES = \ @@ -44,8 +45,8 @@ attr/xattr.h: attr-xattr.in.h $(top_builddir)/config.status $(AM_V_at)$(MKDIR_P) attr $(AM_V_GEN)rm -f $@-t $@ && \ cp $(srcdir)/attr-xattr.in.h attr/xattr.h - -MOSTLYCLEANFILES = attr/xattr.h attr/xattr.h endif +MOSTLYCLEANFILES = attr/xattr.h + EXTRA_DIST = attr-xattr.in.h diff --git a/lib/attr-xattr.in.h b/lib/attr-xattr.in.h index b5796fe..3890b5e 100644 --- a/lib/attr-xattr.in.h +++ b/lib/attr-xattr.in.h @@ -17,6 +17,9 @@ #ifndef TAR_ATTR_XATTR_H #define TAR_ATTR_XATTR_H #include +#ifndef ENOATTR +# define ENOATTR ENODATA /* No such attribute */ +#endif /* setting */ static inline int setxattr (const char *path, const char *name, const void @@ -55,4 +58,3 @@ static inline ssize_t flistxattr (int filedes, char *list, size_t size) { errno = ENOTSUP; return -1; } #endif - diff --git a/src/Makefile.am b/src/Makefile.am index ce9b369..52222b6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -46,6 +46,7 @@ tar_SOURCES = \ xattrs.c AM_CPPFLAGS = -I$(top_srcdir)/gnu -I../ -I../gnu -I$(top_srcdir)/lib -I../lib +AM_CFLAGS = $(WARN_CFLAGS) $(WERROR_CFLAGS) LDADD = ../lib/libtar.a ../gnu/libgnu.a $(LIBINTL) $(LIBICONV) diff --git a/src/buffer.c b/src/buffer.c index 7638bb1..422798e 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -289,8 +289,8 @@ struct zip_program }; static struct zip_magic const magic[] = { - { ct_none, }, - { ct_tar }, + { ct_none, 0, 0 }, + { ct_tar, 0, 0 }, { ct_compress, 2, "\037\235" }, { ct_gzip, 2, "\037\213" }, { ct_bzip2, 3, "BZh" }, diff --git a/src/common.h b/src/common.h index a78e50f..eba3bb4 100644 --- a/src/common.h +++ b/src/common.h @@ -781,7 +781,8 @@ void sys_exec_checkpoint_script (const char *script_name, int checkpoint_number); /* Module compare.c */ -void report_difference (struct tar_stat_info *st, const char *message, ...); +void report_difference (struct tar_stat_info *st, const char *message, ...) + __attribute__ ((format (printf, 2, 3))); /* Module sparse.c */ bool sparse_member_p (struct tar_stat_info *st); diff --git a/src/system.c b/src/system.c index ba4ac2d..e985462 100644 --- a/src/system.c +++ b/src/system.c @@ -722,8 +722,8 @@ sys_exec_command (char *file_name, int typechar, struct tar_stat_info *st) stat_to_env (file_name, typechar, st); - argv[0] = "/bin/sh"; - argv[1] = "-c"; + argv[0] = (char *) "/bin/sh"; + argv[1] = (char *) "-c"; argv[2] = to_command_option; argv[3] = NULL; @@ -837,8 +837,8 @@ sys_exec_info_script (const char **archive_name, int volume_number) xclose (p[PREAD]); - argv[0] = "/bin/sh"; - argv[1] = "-c"; + argv[0] = (char *) "/bin/sh"; + argv[1] = (char *) "-c"; argv[2] = (char *) info_script_option; argv[3] = NULL; @@ -885,8 +885,8 @@ sys_exec_checkpoint_script (const char *script_name, setenv ("TAR_FORMAT", archive_format_string (current_format == DEFAULT_FORMAT ? archive_format : current_format), 1); - argv[0] = "/bin/sh"; - argv[1] = "-c"; + argv[0] = (char *) "/bin/sh"; + argv[1] = (char *) "-c"; argv[2] = (char *) script_name; argv[3] = NULL; diff --git a/src/tar.c b/src/tar.c index e8813de..cbb6c68 100644 --- a/src/tar.c +++ b/src/tar.c @@ -1287,7 +1287,7 @@ update_argv (const char *filename, struct argp_state *state) for (i = state->next, p = start; *p; p += strlen (p) + 1, i++) { if (term == 0 && p[0] == '-') - state->argv[i++] = "--add-file"; + state->argv[i++] = (char *) "--add-file"; state->argv[i] = p; } } @@ -2013,7 +2013,7 @@ parse_opt (int key, char *arg, struct argp_state *state) case OLD_ARCHIVE_OPTION: set_archive_format ("v7"); break; - + case OVERWRITE_DIR_OPTION: old_files_option = DEFAULT_OLD_FILES; break; diff --git a/src/xattrs.c b/src/xattrs.c index 5a4bf72..2ddd1af 100644 --- a/src/xattrs.c +++ b/src/xattrs.c @@ -137,7 +137,7 @@ static char * skip_to_ext_fields (char *ptr) { /* skip tag name (user/group/default/mask) */ - ptr += strcspn (ptr, ":,\n"); + ptr += strcspn (ptr, ":,\n"); if (*ptr != ':') return ptr; @@ -192,7 +192,7 @@ static void xattrs__acls_set (struct tar_stat_info const *st, char const *file_name, int type, char *ptr, size_t len, bool def) -{ +{ acl_t acl; if (ptr) @@ -229,7 +229,7 @@ static void xattrs__acls_get_a (int parentfd, const char *file_name, struct tar_stat_info *st, char **ret_ptr, size_t * ret_len) -{ +{ char *val = NULL; ssize_t len; acl_t acl; @@ -261,7 +261,7 @@ static void xattrs__acls_get_d (int parentfd, char const *file_name, struct tar_stat_info *st, char **ret_ptr, size_t * ret_len) -{ +{ char *val = NULL; ssize_t len; acl_t acl; @@ -407,7 +407,7 @@ clear_mask_map (struct xattrs_mask_map *mask_map) } void -xattrs_clear_setup () +xattrs_clear_setup (void) { clear_mask_map (&xattrs_setup.incl); clear_mask_map (&xattrs_setup.excl); @@ -614,7 +614,7 @@ static bool xattrs_masked_out (const char *kw, bool archiving) { return xattrs_kw_included (kw, archiving) ? - xattrs_kw_excluded (kw, archiving) : true; + xattrs_kw_excluded (kw, archiving) : true; } void @@ -720,7 +720,7 @@ xattrs_print (struct tar_stat_info const *st) if (xattrs_option && st->xattr_map_size) { int i; - + for (i = 0; i < st->xattr_map_size; ++i) { char *keyword = st->xattr_map[i].xkey + strlen ("SCHILY.xattr."); diff --git a/src/xattrs.h b/src/xattrs.h index bfef466..139cbfb 100644 --- a/src/xattrs.h +++ b/src/xattrs.h @@ -28,7 +28,7 @@ extern void xattrs_mask_add (const char *mask, bool incl); /* clear helping structures when tar finishes */ -extern void xattrs_clear_setup (); +extern void xattrs_clear_setup (void); extern void xattrs_acls_get (int parentfd, char const *file_name, struct tar_stat_info *st, int fd, int xisfile); diff --git a/src/xheader.c b/src/xheader.c index 50fd3e7..291d995 100644 --- a/src/xheader.c +++ b/src/xheader.c @@ -262,7 +262,7 @@ xheader_format_name (struct tar_stat_info *st, const char *fmt, size_t n) char *dir = NULL; char *base = NULL; char pidbuf[UINTMAX_STRSIZE_BOUND]; - char const *pptr; + char const *pptr = NULL; char nbuf[UINTMAX_STRSIZE_BOUND]; char const *nptr = NULL; @@ -335,13 +335,10 @@ xheader_format_name (struct tar_stat_info *st, const char *fmt, size_t n) break; case 'n': - if (nptr) - { - q = stpcpy (q, nptr); - p += 2; - break; - } - /* else fall through */ + q = stpcpy (q, nptr); + p += 2; + break; + default: *q++ = *p++;