https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97982
Bug ID: 97982 Summary: integer casting after abs() causes undefined behavior Product: gcc Version: 10.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: mytbk920423 at gmail dot com Target Milestone: --- The following code has different result when compiling with -O0/-O1 and -O2. Also, ubsan will report an error. But I don't know why the signed(INT_MIN)->unsigned data conversion is undefined. It's found in GCC 10.2.0 and 4.8.5. clang does fine with both -O0 and -O2 and reports no ubsan errors. #include <stdio.h> #include <stdlib.h> #include <stdint.h> int main() { char str[20]; scanf("%s", str); int32_t x = strtol(str, NULL, 0); uint32_t u = abs(x); // x=0x80000000 will trigger an undefined behavior uint64_t val = u; printf("0x%lx\n", val); }