https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80932
Bug ID: 80932 Summary: UBSAN: false positive as a result of distribution: c1*(c2*v1-c3*v2)=>c1*c2*v1-c1*c3*v2 Product: gcc Version: 8.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, marxin at gcc dot gnu.org Target Milestone: --- gcc trunk rev248580, x86_64. Transformation causing troubles: const1 * (const2 * var1 - const3 * var2) => const1*const2*var1 - const3*var2; > cat f.cpp #include <iostream> signed char var_10 = 77; long long int var_13 = 1547580415367384384LL; long foo() { long a = -6 * // 0xbf8a6c24aa342bc0 = -4644781160949077056 (long(16636733186465668563ULL * var_13 ) - // 0xd4cdd0f8c2df13cf = -3112602000603278385 long(678280911954875019ULL * var_10)); return a; } int main () { long a = foo (); std::cout << a << std::endl; return 0; } > g++ -fsanitize=undefined -O0 f.cpp; ./a.out f.cpp:6:8: runtime error: signed integer overflow: -9024801181724640896 - 228867929910118694 cannot be represented in type 'long int' 9193074962074792026