public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "redi at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug analyzer/94355] support for C++ new expression
Date: Sat, 05 Nov 2022 21:31:43 +0000	[thread overview]
Message-ID: <bug-94355-4-17Bxf5W9xk@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-94355-4@http.gcc.gnu.org/bugzilla/>

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

--- Comment #14 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to David Malcolm from comment #13)
> (In reply to Jonathan Wakely from comment #10)
> 
> [...snip...]
> 
> > As already noted above, new can't return null here, and there is no
> > dereference anyway. And the pointer isn't leaked, but it seems maybe the
> > analyzer doesn't know about destructors?
> 
> FWIW the analyzer (presumably incorrectly) considers the case where operator
> new returns NULL, and then attempts to write 0 to it.

Yeah, that's incorrect, the write is guaranteed to be OK because if new fails
it throws an exception before the write ever happens.

If a non-throwing form of new is used, e.g. p = new(std::nothrow) int(), then
the compiler *does* insert a null check before writing to it. So in the case
where a null check is necessary, the compiler inserts one.

See the -fcheck-new option:

  Check that the pointer returned by "operator new" is non-null before
attempting to modify the storage allocated.  This check is normally unnecessary
because the C++ standard specifies that "operator new" only returns 0 if it is
declared "throw()", in which case the compiler always checks the return value
even without this option.  In all other cases, when "operator new" has a
non-empty exception specification, memory exhaustion is signalled by throwing
"std::bad_alloc".  See also new (nothrow).

  parent reply	other threads:[~2022-11-05 21:31 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-27 11:36 [Bug analyzer/94355] New: " vanyacpp at gmail dot com
2020-03-27 11:59 ` [Bug analyzer/94355] " redi at gcc dot gnu.org
2020-09-09 21:24 ` cvs-commit at gcc dot gnu.org
2020-09-09 21:44 ` dmalcolm at gcc dot gnu.org
2020-09-09 21:50 ` dmalcolm at gcc dot gnu.org
2020-09-26  1:35 ` cvs-commit at gcc dot gnu.org
2021-04-12  7:46 ` vanyacpp at gmail dot com
2021-04-12  8:04 ` vanyacpp at gmail dot com
2021-07-22 21:14 ` navarre.gcc.bugs at gmail dot com
2021-07-22 21:35 ` redi at gcc dot gnu.org
2022-11-05  9:21 ` redi at gcc dot gnu.org
2022-11-05  9:28 ` redi at gcc dot gnu.org
2022-11-05  9:59 ` redi at gcc dot gnu.org
2022-11-05 16:44 ` dmalcolm at gcc dot gnu.org
2022-11-05 21:31 ` redi at gcc dot gnu.org [this message]
2023-06-29 20:01 ` [Bug analyzer/94355] analyzer " vultkayn at gcc dot gnu.org
2023-09-01 20:06 ` cvs-commit at gcc dot gnu.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-94355-4-17Bxf5W9xk@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).