This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/80528] reimplement gnulib's "useless-if-before-free" script as a compiler warning
- From: "msebor at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 18 Aug 2017 15:51:12 +0000
- Subject: [Bug c/80528] reimplement gnulib's "useless-if-before-free" script as a compiler warning
- Auto-submitted: auto-generated
- References: <bug-80528-4@http.gcc.gnu.org/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80528
Martin Sebor <msebor at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2017-08-18
CC| |msebor at gcc dot gnu.org
Ever confirmed|0 |1
--- Comment #2 from Martin Sebor <msebor at gcc dot gnu.org> ---
I think a warning like this might be useful, although I probably wouldn't want
to enable under -Wall or -Wextra. (GCC could also use branch probabilities to
decide whether or not to warn.)
That said, I would expect GCC to get rid of the tests with
-fdelete-null-pointer-checks. As it is, it eliminates the call to free when
the pointer is known to be null but not the test itself (see below). That
seems quite suboptimal to me since in the absence of any other information a
pointer being passed to free is far more likely to be non-null than not. Clang
and ICC both optimize the function below into an unconditional jump to free.
So while I think implementing the optimization is the better solution here, the
warning could also help improve the efficiency of the emitted code in its
absence.
$ cat b.c && gcc -O2 -S -Wall -Wextra -fdump-tree-optimized=/dev/stdout b.c
void free (void*);
void g (void *p)
{
if (p) // test retained
free (p);
else
free (p); // eliminated
}
;; Function g (g, funcdef_no=0, decl_uid=1817, cgraph_uid=0, symbol_order=0)
Removing basic block 5
g (void * p)
{
<bb 2> [100.00%] [count: INV]:
if (p_2(D) != 0B)
goto <bb 3>; [53.47%] [count: INV]
else
goto <bb 4>; [46.53%] [count: INV]
<bb 3> [53.47%] [count: INV]:
free (p_2(D)); [tail call]
<bb 4> [100.00%] [count: INV]:
return;
}