https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116304
Bug ID: 116304
Summary: False negative from -fanalyzer on "return NULL"; due
to NULL being in a system header
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: analyzer
Assignee: dmalcolm at gcc dot gnu.org
Reporter: dmalcolm at gcc dot gnu.org
Target Milestone: ---
gcc/testsuite/c-c++-common/analyzer/malloc-CWE-401-example.c has:
return NULL; /* TODO: should complain that "buf" is leaked on this path.
*/
I'm filing this bug to track that issue.
Debugging Arsen's patch
[PATCH v2] c++: improve diagnostic of 'return's in coroutines
https://gcc.gnu.org/pipermail/gcc-patches/2024-August/659933.html
showed that the diagnostics subsystem seems to be rejecting the diagnostic here
due to the "NULL" of return NULL being in a system header:
Breakpoint 8, diagnostic_context::report_diagnostic (this=0x4b00e80
<global_diagnostic_context>, diagnostic=0x7fffffff7d20)
at ../../src/gcc/diagnostic.cc:1477
1477 return false;
(gdb) list
1472 && ((!m_warn_system_headers
1473 && diagnostic->m_iinfo.m_allsyslocs)
1474 || m_inhibit_warnings))
1475 /* Bail if the warning is not to be reported because all locations
in the
1476 inlining stack (if there is one) are in system headers. */
1477 return false;
1478
1479 if (diagnostic->kind != DK_NOTE && diagnostic->kind != DK_ICE)
1480 diagnostic_check_max_errors (this);
1481
(gdb) list 1470
1465 /* Check to see if the diagnostic is enabled at the location and
1466 not disabled by #pragma GCC diagnostic anywhere along the inlining
1467 stack. . */
1468 if (!diagnostic_enabled (diagnostic))
1469 return false;
1470
1471 if ((was_warning || diagnostic->kind == DK_WARNING)
1472 && ((!m_warn_system_headers
1473 && diagnostic->m_iinfo.m_allsyslocs)
1474 || m_inhibit_warnings))
(gdb)
1475 /* Bail if the warning is not to be reported because all locations
in the
1476 inlining stack (if there is one) are in system headers. */
1477 return false;
1478
1479 if (diagnostic->kind != DK_NOTE && diagnostic->kind != DK_ICE)
1480 diagnostic_check_max_errors (this);
1481
1482 m_lock++;
1483
1484 if (diagnostic->kind == DK_ICE || diagnostic->kind == DK_ICE_NOBT)
(gdb) p was_warning
$8 = true
(gdb) p m_warn_system_headers
$9 = false
(gdb) p diagnostic->m_iinfo.m_allsyslocs
$10 = true