https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102317
Bug ID: 102317 Summary: signed integer overflow sanitizer cannot work well with -fno-strict-overflow Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: sanitizer Assignee: unassigned at gcc dot gnu.org Reporter: qinzhao at gcc dot gnu.org CC: dodji at gcc dot gnu.org, dvyukov at gcc dot gnu.org, jakub at gcc dot gnu.org, kcc at gcc dot gnu.org, marxin at gcc dot gnu.org Target Milestone: --- with the latest gcc12: $ cat wrap.c #include <stdio.h> #include <limits.h> /* volatile to avoid optimization */ volatile int val; int main(void) { val = INT_MAX; val += 1; printf("%d\n", val); return 0; } $ gcc -Wall -O2 -fsanitize=signed-integer-overflow -o wrap wrap.c $ ./wrap wrap.c:10:9: runtime error: signed integer overflow: 2147483647 + 1 cannot be represented in type 'int' -2147483648 Things work as expected: the overflow is detected and in this warning mode, the result is a wrap-around. However, the kernel builds with -fno-strict-overflow which removes possible undefined behavior, but I still want the sanitizer to catch this case. Currently it doesn't: $ gcc -Wall -O2 -fsanitize=signed-integer-overflow -fno-strict-overflow -o wrap wrap.c $ ./wrap -2147483648