https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106843
Bug ID: 106843
Summary: gcc with -O2 corrupt data on stack
Product: gcc
Version: 11.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: gcc at linuxmotors dot com
Target Milestone: ---
Compile the following file named t.c with
gcc -O2 t.c -o t
Then run with ./t
it will print out
0 0 401060 0
or some other unexpected data. Without -O2 it prints out the correct
1 2 3 4
gcc 7.5.0 also handles this code fine with or without -O2
#include <stdio.h>
struct rect {
int x,y,w,h;
};
void test(struct rect *r) {
if(!r) r=&(struct rect){1,2,3,4};
printf("%x %x %x %x\n", r->x, r->y, r->w, r->h);
}
int main(int argc, char **argv) {
test(0);
}
I don't know if this is useful but an objdump of the code produced is this:
0000000000401140 <test>:
401140: 48 8d 44 24 e8 lea -0x18(%rsp),%rax
401145: 48 85 ff test %rdi,%rdi
401148: 48 0f 44 f8 cmove %rax,%rdi
40114c: 31 c0 xor %eax,%eax
40114e: 8b 4f 08 mov 0x8(%rdi),%ecx
401151: 8b 57 04 mov 0x4(%rdi),%edx
401154: 44 8b 47 0c mov 0xc(%rdi),%r8d
401158: 8b 37 mov (%rdi),%esi
40115a: bf 04 20 40 00 mov $0x402004,%edi
40115f: e9 cc fe ff ff jmp 401030 <printf@plt>
401164: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1)
40116b: 00 00 00
40116e: 66 90 xchg %ax,%ax
It looks like the structure is being referenced on the stack but the optimizer
removed the initialization or something.
It's a linux box.
/proc/cpuinfo starts with this:
processor : 6
vendor_id : GenuineIntel
cpu family : 6
model : 94
model name : Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz
stepping : 3
/etc/os-release is this:
NAME=Slackware
VERSION="15.0"
ID=slackware
VERSION_ID=15.0
PRETTY_NAME="Slackware 15.0 x86_64"
ANSI_COLOR="0;34"
CPE_NAME="cpe:/o:slackware:slackware_linux:15.0"
HOME_URL="http://slackware.com/"
SUPPORT_URL="http://www.linuxquestions.org/questions/slackware-14/"
BUG_REPORT_URL="http://www.linuxquestions.org/questions/slackware-14/"
VERSION_CODENAME=stable