https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80386
Bug ID: 80386
Summary: UBSAN: false positive - constant folding and
reassosiation before instrumentation
Product: gcc
Version: 7.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: sanitizer
Assignee: unassigned at gcc dot gnu.org
Reporter: babokin at gmail dot com
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
Target Milestone: ---
gcc ubsan incorrectly does code instrumentation triggering false positive
alarm.
This looks like expression reassosiation and constant folding were done before
UBSAN instrumentation, turning legal code to illegal.
> cat f.cpp
static unsigned long long int member_1_3 = 13996271126042720493ULL;
int main() {
// 2921 - 14573 + MAX_INT
(((2921 + 0) - short(member_1_3)) + 0x7fffffff) >> 0;
return 0;
}
> g++ -fsanitize=undefined -O0 -o out f.cpp
> ./out
f.cpp:5:37: runtime error: signed integer overflow: -2147480728 - 14573 cannot
be represented in type 'int'
I'm using top of the trunk gcc.