[Bug c/91395] New: Report an uninitialized variable on its initialization statement (setjmp)
ali at pivotal dot io
gcc-bugzilla@gcc.gnu.org
Thu Aug 8 06:21:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91395
Bug ID: 91395
Summary: Report an uninitialized variable on its initialization
statement (setjmp)
Product: gcc
Version: 9.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: ali at pivotal dot io
Target Milestone: ---
Version:
$ gcc-9 --version
gcc-9 (Ubuntu 9.1.0-2ubuntu2~19.04) 9.1.0
(Actually from gcc 7)
Reproducer:
```
#include <setjmp.h>
extern int other(void);
extern void trigger(int *cond1);
extern sigjmp_buf *global_exception_stack;
void
trigger(int *cond1)
{
while (1)
{
if (*cond1 == 0)
*cond1 = other();
while (*cond1)
{
sigjmp_buf *save_exception_stack =
global_exception_stack;
sigjmp_buf local_sigjmp_buf;
if (sigsetjmp(local_sigjmp_buf, 0) == 0)
global_exception_stack = &local_sigjmp_buf;
else
global_exception_stack = (sigjmp_buf *)
save_exception_stack;
global_exception_stack = (sigjmp_buf *)
save_exception_stack;
}
}
}
```
```
$ gcc-9 -O1 -Werror=uninitialized -fexpensive-optimizations -ftree-pre -c -o
/dev/null reproducer.c
reproducer.c: In function 'trigger':
reproducer.c:17:16: error: 'save_exception_stack' is used uninitialized in this
function [-Werror=uninitialized]
17 | sigjmp_buf *save_exception_stack = global_exception_stack;
| ^~~~~~~~~~~~~~~~~~~~
cc1: some warnings being treated as errors
```
Observation:
1, asm code re-ordering matters.
2, when it reports warning, initializing asm codes are before the setjmp().
When it warns:
```
sigjmp_buf *save_exception_stack = PG_exception_stack;
2f: 48 8b 1d 00 00 00 00 mov 0x0(%rip),%rbx # 36
<trigger+0x36>
36: 48 89 5c 24 18 mov %rbx,0x18(%rsp)
sigjmp_buf local_sigjmp_buf;
if (sigsetjmp(local_sigjmp_buf, 0) == 0)
```
When it doesn't complain:
```
sigjmp_buf *save_exception_stack = PG_exception_stack;
sigjmp_buf local_sigjmp_buf;
if (sigsetjmp(local_sigjmp_buf, 0) == 0)
29: 48 8d 44 24 20 lea 0x20(%rsp),%rax
2e: 48 89 44 24 08 mov %rax,0x8(%rsp)
...
sigjmp_buf *save_exception_stack = PG_exception_stack;
3c: 48 8b 1d 00 00 00 00 mov 0x0(%rip),%rbx # 43
<trigger+0x43>
43: 48 89 5c 24 18 mov %rbx,0x18(%rsp)
```
I guess it might be an optimization regression of gcc, it was always smart
enough to reorder the local variables to avoid this issue (initializing them
after setjmp() obviously has no such issue because it will be initialized as we
wish after longjmp() wherever anyway), but higher version gcc's updates lost
the optimization in some cases.
More information about the Gcc-bugs
mailing list