public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "msebor at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug c++/98753] -Wfree-nonheap-object on Bison generated code
Date: Wed, 20 Jan 2021 16:48:41 +0000	[thread overview]
Message-ID: <bug-98753-4-FhZMsTtJtl@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-98753-4@http.gcc.gnu.org/bugzilla/>

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98753

--- Comment #5 from Martin Sebor <msebor at gcc dot gnu.org> ---
I can't reproduce the warning with the default options.  There are just two
calls to free() in the dump.  In each instance its argument resolves to the
yymsg pointer and not to the yyssa array as in the warning message in comment
#0.  We would also need to see the command line options you use to compile the
file (please review https://gcc.gnu.org/bugs/#need for the full details we ask
for).

In GCC 11, -Wfree-nonheap-object was enhanced to validate every argument to
every deallocation function.  Prior to GCC 11 it only considered a negligible
subset of arguments (basically just straight addresses of variables).  The
warning was prone to false positives then (as is evident from pr54202), and the
enhancement hasn't changed that.

Different optimization options produce different intermediate representation. 
Some result in constants substituted for what would otherwise be variables. 
When a constant is substituted into an expression that it's not valid for it
might trigger a warning because in the IL it's indistinguishable from a bug in
the original source code.  There's nothing a warning designed to detect such
invalid expressions can do about it.  Changing this message alone to say
"free() may be called with non-heap object" wouldn't be appropriate without
also changing all the other messages that are subject to the same problem (all
flow-sensitive warnings are).

At least two solutions are theoretically possible: a) make the warning
"smarter" than the optimization it depends on that does the substitution, and
have it figure out that the invalid code was synthesized by it, doesn't occur
in the source code, and cannot be reached in the program given the
preconditions, or b) make the optimizations "smarter" either by not
substituting constants into contexts where they're invalid, or by figuring out
that these invalid expressions cannot be reached based on their preconditions. 
The two sets of preconditions need not be the same.  Both approaches are worth
exploring but both are hard and neither will ever be perfect.  Which is partly
why GCC documents that "Warnings are diagnostic messages that report
constructions that are not inherently erroneous but that are risky or suggest
there may have been an error."  If the warning gets it wrong #pragma GCC
diagnostic can be used to avoid the false positive.

  parent reply	other threads:[~2021-01-20 16:48 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-19 20:18 [Bug c++/98753] New: " foss at grueninger dot de
2021-01-19 20:55 ` [Bug c++/98753] " msebor at gcc dot gnu.org
2021-01-20  5:22 ` akim.demaille at gmail dot com
2021-01-20  7:31 ` rguenth at gcc dot gnu.org
2021-01-20  7:40 ` foss at grueninger dot de
2021-01-20 16:48 ` msebor at gcc dot gnu.org [this message]
2021-01-20 17:00 ` foss at grueninger dot de
2021-01-20 17:34 ` [Bug middle-end/98753] -Wfree-nonheap-object on unreachable code with -O0 msebor at gcc dot gnu.org
2021-01-20 17:34 ` akim.demaille at gmail dot com
2021-01-20 17:40 ` akim.demaille at gmail dot com
2021-01-26 19:37 ` slyfox at gcc dot gnu.org
2021-01-29 11:29 ` boris at kolpackov dot net
2021-01-29 11:30 ` boris at kolpackov dot net
2021-01-29 11:30 ` boris at kolpackov dot net
2021-01-29 11:36 ` boris at kolpackov dot net
2021-01-29 16:48 ` msebor at gcc dot gnu.org
2024-01-02 16:08 ` stefan at bytereef dot org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-98753-4-FhZMsTtJtl@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).