https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118500
--- Comment #4 from Alejandro Colomar <alx at kernel dot org> ---
(In reply to Andrew Pinski from comment #1)
> I think this need analyzer to handle really.
We get a -Wfree-nonheap-object if I change the strsep(3) call by s++.
I think we should treat any call that gets the address of the pointer
(non-const) as potentially (most likely) modifying it, and thus trigger a
warning.
alx@devuan:~/tmp/gcc$ cat strsep3.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
[[gnu::malloc(free)]]
char *my_strdup(const char *s)
{
return strdup(s);
}
[[gnu::noipa]]
int
g(void)
{
char *s;
s = my_strdup("f,oo");
if (s == NULL)
return -1;
s++; //strsep(&s, ",");
puts(s);
free(s);
return 0;
}
int
main(void)
{
return g();
}
alx@devuan:~/tmp/gcc$ gcc-15 -Wall -Wextra -O3 strsep3.c
strsep3.c: In function ‘g’:
strsep3.c:23:9: warning: ‘free’ called on pointer ‘<unknown>’ with nonzero
offset 1 [-Wfree-nonheap-object]
23 | free(s);
| ^~~~~~~
In function ‘my_strdup’,
inlined from ‘g’ at strsep3.c:17:6:
strsep3.c:8:16: note: returned from ‘strdup’
8 | return strdup(s);
| ^~~~~~~~~