https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102559
Bug ID: 102559 Summary: missing warning comparing result of a nonnull function to null Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: msebor at gcc dot gnu.org Target Milestone: --- GCC folds equality comparisons of nonnull function and null to zero but it fails to issue any warning for doing so. In contrast, comparing the value of a pointer parameter and null in a nonnull function triggers a -Wnonnull-compare. Clang is more consistent and issues warnings for all such (likely) misues. $ cat z.c && gcc -O -S -Wall -fdump-tree-optimized=/dev/stdout z.c __attribute__ ((returns_nonnull)) void* f (void); int g (void) { return f () == 0; // missing warning (return folded to zero) } int h (void *p, const void *q, int n) { return !__builtin_memcpy (p, q, n); // missing warning (folded to zero) } ;; Function g (g, funcdef_no=0, decl_uid=1980, cgraph_uid=1, symbol_order=0) int g () { <bb 2> [local count: 1073741824]: f (); return 0; } ;; Function h (h, funcdef_no=1, decl_uid=1985, cgraph_uid=2, symbol_order=1) int h (void * p, const void * q, int n) { long unsigned int _1; <bb 2> [local count: 1073741824]: _1 = (long unsigned int) n_4(D); __builtin_memcpy (p_6(D), q_7(D), _1); return 0; }