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

Reply via email to