From 2d331c0d507cb64fa7fd449582fdc0c144cce9c4 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Tue, 18 Jun 2019 19:07:24 +0200 Subject: [PATCH 1/1] com_stats(): Work around bogus gcc warning. For some versions of gcc (7.4.0, 8.3.0, and 8.3.0-7 as shipped with Debian-11, but not gcc-7.4.0-1ubuntu1~18.04.1), the previous patch introduced the following warning: tfortune.c:912:3: warning: 'lh_stats' may be used uninitialized in this function [-Wmaybe-uninitialized] free(lh_stats); ^~~~~~~~~~~~~~ We only assign to lh_stats when --verbose is given, and only free the memory if --verbose is given. Apparently gcc has started to believe that the value of the "verbose" boolean variable might change, which is impossible. Therefore, the warning is believed to be a false positive. However, gcc has a point: There is no need to check for --verbose twice, as a single branch is sufficient. This not only gets rid of the warning but also makes the boolean variable pointless and removes more lines than it adds. --- tfortune.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/tfortune.c b/tfortune.c index ec4c323..724b8ba 100644 --- a/tfortune.c +++ b/tfortune.c @@ -863,9 +863,8 @@ static int com_stats(void) struct linhash_item *itemp; unsigned num_epi_files, num_epis, num_unique_tags, num_x = 0; long unsigned num_tags = 0; - char *xdir, *lh_stats; + char *xdir; struct regfile_iter *riter; - bool verbose = OPT_GIVEN(STATS, VERBOSE); tagtab = hash_tags(&num_epi_files, &num_epis); for ( @@ -876,10 +875,6 @@ static int com_stats(void) num_tags += (long unsigned)itemp->object; num_unique_tags = linhash_num_items(tagtab); linhash_iterator_free(liter); - if (verbose) - lh_stats = linhash_statistics(tagtab); - linhash_free(tagtab); - xdir = get_xdir(); for ( regfile_iter_new(xdir, &riter); @@ -900,10 +895,12 @@ static int com_stats(void) (float)num_tags / num_epis : 0); printf("average number of tag recurrence... %8.02f\n", num_unique_tags > 0? (float)num_tags / num_unique_tags : 0); - if (verbose) { + if (OPT_GIVEN(STATS, VERBOSE)) { + char *lh_stats = linhash_statistics(tagtab); printf("\nlinear hashing statistics:\n%s\n", lh_stats); free(lh_stats); } + linhash_free(tagtab); return 1; } EXPORT_CMD_HANDLER(stats); -- 2.39.2