public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/108646] New: nonnull attribute does not detect variables that are NULL being passed
@ 2023-02-02 21:00 jg at jguk dot org
  2023-02-02 22:26 ` [Bug c++/108646] " pinskia at gcc dot gnu.org
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: jg at jguk dot org @ 2023-02-02 21:00 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 108646
           Summary: nonnull attribute does not detect variables that are
                    NULL being passed
           Product: gcc
           Version: 12.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jg at jguk dot org
  Target Milestone: ---

If we pass NULL directly, there is a good warning (pasted below from today on
Godblot.org latest gcc trunk)

However, there is no error if passing a variable set to NULL.
Could gcc detect this situation?



#include <cstddef>
void * mem2(void *dest) __attribute__((nonnull));
void test(void)
{
 char *dest = NULL;
 mem2(dest); 
 }



This is the warning when NULL is passed directly:

<source>: In function 'void test()':
<source>:6:6: warning: argument 1 null where non-null expected [-Wnonnull]
    6 |  mem2(NULL);
      |  ~~~~^~~~~~
<source>:2:8: note: in a call to function 'void* mem2(void*)' declared
'nonnull'
    2 | void * mem2(void *dest) __attribute__((nonnull));
      |        ^~~~
Compiler returned: 0

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug c++/108646] nonnull attribute does not detect variables that are NULL being passed
  2023-02-02 21:00 [Bug c++/108646] New: nonnull attribute does not detect variables that are NULL being passed jg at jguk dot org
@ 2023-02-02 22:26 ` pinskia at gcc dot gnu.org
  2023-02-03  9:23 ` redi at gcc dot gnu.org
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: pinskia at gcc dot gnu.org @ 2023-02-02 22:26 UTC (permalink / raw)
  To: gcc-bugs

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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         Resolution|---                         |DUPLICATE
             Status|UNCONFIRMED                 |RESOLVED

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Dup of bug 95515.

*** This bug has been marked as a duplicate of bug 95515 ***

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug c++/108646] nonnull attribute does not detect variables that are NULL being passed
  2023-02-02 21:00 [Bug c++/108646] New: nonnull attribute does not detect variables that are NULL being passed jg at jguk dot org
  2023-02-02 22:26 ` [Bug c++/108646] " pinskia at gcc dot gnu.org
@ 2023-02-03  9:23 ` redi at gcc dot gnu.org
  2023-02-03 12:08 ` jg at jguk dot org
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: redi at gcc dot gnu.org @ 2023-02-03  9:23 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> ---
It already does detect it:

n.c: In function ‘test’:
n.c:6:2: warning: argument 1 null where non-null expected [-Wnonnull]
    6 |  mem2(dest);
      |  ^~~~~~~~~~
n.c:2:8: note: in a call to function ‘mem2’ declared ‘nonnull’
    2 | void * mem2(void *dest) __attribute__((nonnull));
      |        ^~~~

You need to enable optimization, otherwise there is no data flow analysis.

Without optimization, it detects it with -fanalyzer

n.c: In function ‘void test()’:
n.c:6:6: warning: use of NULL ‘dest’ where non-null expected [CWE-476]
[-Wanalyzer-null-argument]
    6 |  mem2(dest);
      |  ~~~~^~~~~~
  ‘void test()’: events 1-2
    |
    |    5 |  char *dest = NULL;
    |      |        ^~~~
    |      |        |
    |      |        (1) ‘dest’ is NULL
    |    6 |  mem2(dest);
    |      |  ~~~~~~~~~~
    |      |      |
    |      |      (2) argument 1 (‘dest’) NULL where non-null expected
    |
n.c:2:8: note: argument 1 of ‘void* mem2(void*)’ must be non-null
    2 | void * mem2(void *dest) __attribute__((nonnull));
      |        ^~~~


And it's also detected at runtime using -fsanitize=undefined:

n.c:6:6: runtime error: null pointer passed as argument 1, which is declared to
never be null

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug c++/108646] nonnull attribute does not detect variables that are NULL being passed
  2023-02-02 21:00 [Bug c++/108646] New: nonnull attribute does not detect variables that are NULL being passed jg at jguk dot org
  2023-02-02 22:26 ` [Bug c++/108646] " pinskia at gcc dot gnu.org
  2023-02-03  9:23 ` redi at gcc dot gnu.org
@ 2023-02-03 12:08 ` jg at jguk dot org
  2023-02-03 17:58 ` redi at gcc dot gnu.org
  2023-02-07 12:19 ` jg at jguk dot org
  4 siblings, 0 replies; 6+ messages in thread
From: jg at jguk dot org @ 2023-02-03 12:08 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #3 from Jonny Grant <jg at jguk dot org> ---
(In reply to Jonathan Wakely from comment #2)
> It already does detect it:
> 
> n.c: In function ‘test’:
> n.c:6:2: warning: argument 1 null where non-null expected [-Wnonnull]
>     6 |  mem2(dest);
>       |  ^~~~~~~~~~
> n.c:2:8: note: in a call to function ‘mem2’ declared ‘nonnull’
>     2 | void * mem2(void *dest) __attribute__((nonnull));
>       |        ^~~~
> 
> You need to enable optimization, otherwise there is no data flow analysis.
> 
> Without optimization, it detects it with -fanalyzer
> 
> n.c: In function ‘void test()’:
> n.c:6:6: warning: use of NULL ‘dest’ where non-null expected [CWE-476]
> [-Wanalyzer-null-argument]
>     6 |  mem2(dest);
>       |  ~~~~^~~~~~
>   ‘void test()’: events 1-2
>     |
>     |    5 |  char *dest = NULL;
>     |      |        ^~~~
>     |      |        |
>     |      |        (1) ‘dest’ is NULL
>     |    6 |  mem2(dest);
>     |      |  ~~~~~~~~~~
>     |      |      |
>     |      |      (2) argument 1 (‘dest’) NULL where non-null expected
>     |
> n.c:2:8: note: argument 1 of ‘void* mem2(void*)’ must be non-null
>     2 | void * mem2(void *dest) __attribute__((nonnull));
>       |        ^~~~
> 
> 
> And it's also detected at runtime using -fsanitize=undefined:
> 
> n.c:6:6: runtime error: null pointer passed as argument 1, which is declared
> to never be null


That's great it works with optimization, I should remember to always do
that.(In reply to Jonathan Wakely from comment #2)
> It already does detect it:
> 
> n.c: In function ‘test’:
> n.c:6:2: warning: argument 1 null where non-null expected [-Wnonnull]
>     6 |  mem2(dest);
>       |  ^~~~~~~~~~
> n.c:2:8: note: in a call to function ‘mem2’ declared ‘nonnull’
>     2 | void * mem2(void *dest) __attribute__((nonnull));
>       |        ^~~~
> 
> You need to enable optimization, otherwise there is no data flow analysis.
> 
> Without optimization, it detects it with -fanalyzer
> 
> n.c: In function ‘void test()’:
> n.c:6:6: warning: use of NULL ‘dest’ where non-null expected [CWE-476]
> [-Wanalyzer-null-argument]
>     6 |  mem2(dest);
>       |  ~~~~^~~~~~
>   ‘void test()’: events 1-2
>     |
>     |    5 |  char *dest = NULL;
>     |      |        ^~~~
>     |      |        |
>     |      |        (1) ‘dest’ is NULL
>     |    6 |  mem2(dest);
>     |      |  ~~~~~~~~~~
>     |      |      |
>     |      |      (2) argument 1 (‘dest’) NULL where non-null expected
>     |
> n.c:2:8: note: argument 1 of ‘void* mem2(void*)’ must be non-null
>     2 | void * mem2(void *dest) __attribute__((nonnull));
>       |        ^~~~
> 
> 
> And it's also detected at runtime using -fsanitize=undefined:
> 
> n.c:6:6: runtime error: null pointer passed as argument 1, which is declared
> to never be null


That's great. I should have remembered to add -O2

Is it worth -Wnonnull emitting a warning message that it needs optimization to
get the needed data flow analysis?

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug c++/108646] nonnull attribute does not detect variables that are NULL being passed
  2023-02-02 21:00 [Bug c++/108646] New: nonnull attribute does not detect variables that are NULL being passed jg at jguk dot org
                   ` (2 preceding siblings ...)
  2023-02-03 12:08 ` jg at jguk dot org
@ 2023-02-03 17:58 ` redi at gcc dot gnu.org
  2023-02-07 12:19 ` jg at jguk dot org
  4 siblings, 0 replies; 6+ messages in thread
From: redi at gcc dot gnu.org @ 2023-02-03 17:58 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Jonny Grant from comment #3)
> Is it worth -Wnonnull emitting a warning message that it needs optimization
> to get the needed data flow analysis?

No, there are dozens of warnings that work poorly, or not at all, unless
optimization is enabled. It's in the manual.

"The effectiveness of some warnings depends on optimizations also being
enabled. For example -Wsuggest-final-types is more effective with link-time
optimization and some instances of other warnings may not be issued at all
unless optimization is enabled. While optimization in general improves the
efficacy of control and data flow sensitive warnings, in some cases it may also
cause false positives."

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug c++/108646] nonnull attribute does not detect variables that are NULL being passed
  2023-02-02 21:00 [Bug c++/108646] New: nonnull attribute does not detect variables that are NULL being passed jg at jguk dot org
                   ` (3 preceding siblings ...)
  2023-02-03 17:58 ` redi at gcc dot gnu.org
@ 2023-02-07 12:19 ` jg at jguk dot org
  4 siblings, 0 replies; 6+ messages in thread
From: jg at jguk dot org @ 2023-02-07 12:19 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #5 from Jonny Grant <jg at jguk dot org> ---
(In reply to Jonathan Wakely from comment #4)
> (In reply to Jonny Grant from comment #3)
> > Is it worth -Wnonnull emitting a warning message that it needs optimization
> > to get the needed data flow analysis?
> 
> No, there are dozens of warnings that work poorly, or not at all, unless
> optimization is enabled. It's in the manual.
> 
> "The effectiveness of some warnings depends on optimizations also being
> enabled. For example -Wsuggest-final-types is more effective with link-time
> optimization and some instances of other warnings may not be issued at all
> unless optimization is enabled. While optimization in general improves the
> efficacy of control and data flow sensitive warnings, in some cases it may
> also cause false positives."

Ok I see. Thank you for clarifying.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2023-02-07 12:20 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-02 21:00 [Bug c++/108646] New: nonnull attribute does not detect variables that are NULL being passed jg at jguk dot org
2023-02-02 22:26 ` [Bug c++/108646] " pinskia at gcc dot gnu.org
2023-02-03  9:23 ` redi at gcc dot gnu.org
2023-02-03 12:08 ` jg at jguk dot org
2023-02-03 17:58 ` redi at gcc dot gnu.org
2023-02-07 12:19 ` jg at jguk dot org

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).