Open
Description
#include<stdio.h>
#include<stdint.h>
static int32_t a = 0xD7953644L;
static uint32_t b = 0x97812A3CL;
static int8_t func_1(void)
{
int32_t *c[4];
int32_t j = 0xB7161AB6L;
int i;
for (i = 0; i < 4; i++)
c[i] = &a;
p:
--b;
for (j = 0; (j != 20); j++)
{
uint32_t d = 0xE0C863CCL;
uint64_t e = 0x95E2DE4BF748DC16LL;
++d;
--e;
}
if (j)
goto p;
return a;
}
void main()
{
func_1();
printf("%d", b);
}
Hello, we are using clang to compile the above code in Ubuntu 22.04.3 LTS.
We found a case that there are discrepancies when compiling with llvmorg-14.0.6 at -O2 and -O3.
Is the discrepancy caused by infinite loop in the program? since the behavior is undefined before P2809.
$ ../compiler-builds/llvmorg-14.0.6_build/bin/clang -fsanitize=undefined -fsanitize=address --rtlib=compiler-rt -g -lgcc_s -O2 testcase.c -o exec
$ timeout 1s ./exec 2>exec.err
testcase.c:13:7: runtime error: subtraction of unsigned offset from 0x7ffe760240e0 overflowed to 0x7ffe760240f8 SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior analysis/test960851-m.c:13:7 in AddressSanitizer:DEADLYSIGNAL ================================================================= ==351086==ERROR: AddressSanitizer: SEGV on unknown address 0x000041b58ab3 (pc 0x000041b58ab3 bp 0x7ffe76024190 sp 0x7ffe760240c8 T0) ==351086==The signal is caused by a READ memory access. AddressSanitizer:DEADLYSIGNAL AddressSanitizer: nested bug in the same thread, aborting.
$ ../compiler-builds/llvmorg-13.0.1_build/bin/clang -fsanitize=undefined -fsanitize=address --rtlib=compiler-rt -g -lgcc_s -O2 testcase.c -o exec
$ timeout 1s ./exec 2>exec.err