https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119251
Bug ID: 119251
Summary: New diagnostic: -Wcompound-literal-address
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: alx at kernel dot org
Target Milestone: ---
Taking the address of a compound literal is dangerous, as their lifetime is
scoped to a block.
It would be good to have a diagnostic when one takes the address of one,
because chances are high that the address will leak the block, and result in
UB.
alx@devuan:~/tmp$ cat cl.c | grep -Tn ^
1: #include <stdlib.h>
2: #include <string.h>
3:
4: int *
5: f(void)
6: {
7: int *p;
8:
9: // Correctly diagnosed.
10: p = memcpy(malloc(sizeof(int) * 3),
11: ({ (int [3]){1, 2, 3}; }),
12: sizeof(int) * 3);
13:
14: // Correctly diagnosed (probably only because
the compiler knows memset(3).
15: p = ({ memset((int [3]){}, 0, sizeof(int) * 3);
});
16:
17: // It might be interesting to be able to
diagnose this?
18: p = memset((int [3]){}, 0, sizeof(int) * 3);
19:
20: return p;
21: }
alx@devuan:~/tmp$ gcc -Wall -Wextra -S cl.c
cl.c: In function âfâ:
cl.c:10:13: warning: using a dangling pointer to an unnamed temporary
[-Wdangling-pointer=]
10 | p = memcpy(malloc(sizeof(int) * 3),
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
11 | ({ (int [3]){1, 2, 3}; }),
| ~~~~~~~~~~~~~~~~~~~~~~~~~~
12 | sizeof(int) * 3);
| ~~~~~~~~~~~~~~~~
cl.c:11:29: note: unnamed temporary defined here
11 | ({ (int [3]){1, 2, 3}; }),
| ^
cl.c:15:11: warning: using a dangling pointer to an unnamed temporary
[-Wdangling-pointer=]
15 | p = ({ memset((int [3]){}, 0, sizeof(int) * 3); });
| ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cl.c:15:32: note: unnamed temporary defined here
15 | p = ({ memset((int [3]){}, 0, sizeof(int) * 3); });
| ^