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