https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109059
Bug ID: 109059
Summary: -Wanalyzer-malloc-leak false +ve seen on haproxy's
cfgparse.c: cfg_register_postparser
Product: gcc
Version: 13.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: analyzer
Assignee: dmalcolm at gcc dot gnu.org
Reporter: dmalcolm at gcc dot gnu.org
Target Milestone: ---
Given:
----------------------------------------------------------------------------
/* Reduced from haproxy-2.7.1's cfgparse.c. */
typedef __SIZE_TYPE__ size_t;
extern void*
calloc(size_t __nmemb, size_t __size)
__attribute__((__nothrow__, __leaf__))
__attribute__((__malloc__)) __attribute__((__alloc_size__(1, 2)));
struct list
{
struct list* n;
struct list* p;
};
struct cfg_postparser
{
struct list list;
char* name;
int (*func)();
};
extern struct list postparsers;
int
cfg_register_postparser(char* name, int (*func)())
{
struct cfg_postparser* cp;
cp = calloc(1, sizeof(*cp));
if (!cp) {
/* [...snip...] */
return 0;
}
cp->name = name;
cp->func = func;
({
(&cp->list)->p = (&postparsers)->p;
(&cp->list)->p->n = (&postparsers)->p = (&cp->list);
(&cp->list)->n = (&postparsers);
(&cp->list);
});
return 1;
}
----------------------------------------------------------------------------
...we currently emit this false positive:
----------------------------------------------------------------------------
../../src/haproxy-cfgparse-leak.c: In function ‘cfg_register_postparser’:
../../src/haproxy-cfgparse-leak.c:45:10: warning: leak of ‘cp’ [CWE-401]
[-Wanalyzer-malloc-leak] [num_events: 5]
45 | return 1;
| ^
‘cfg_register_postparser’: events 1-5
|
| 30 | cp = calloc(1, sizeof(*cp));
| | ^~~~~~~~~~~~~~~~~~~~~~
| | |
| | (1) allocated here
| 31 | if (!cp) {
| | ~
| | |
| | (2) assuming ‘cp’ is non-NULL
| | (3) following ‘false’ branch (when ‘cp’ is non-NULL)...
|......
| 35 | cp->name = name;
| | ~~~~~~~~~~~~~~~
| | |
| | (4) ...to here
|......
| 45 | return 1;
| | ~
| | |
| | (5) ‘cp’ leaks here; was allocated at (1)
|
----------------------------------------------------------------------------
Trunk: https://godbolt.org/z/WG6W16r1d
GCC 12.2: https://godbolt.org/z/d9afTcKqx
GCC 11.3: https://godbolt.org/z/aoaM7Mcze
GCC 10.4: https://godbolt.org/z/jY65dTccE