[Bug c++/67483] New: combine.c sanitizer detects undefined negative left shift
zeccav at gmail dot com
gcc-bugzilla@gcc.gnu.org
Mon Sep 7 14:45:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67483
Bug ID: 67483
Summary: combine.c sanitizer detects undefined negative left
shift
Product: gcc
Version: 5.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: zeccav at gmail dot com
Target Milestone: ---
//g++ -ftracer -O2
//g++ 5.2.0 undefined left shift
//../../gcc-5.2.0/gcc/combine.c:7696:40: runtime error: shift exponent -1 is
negative
//offending line "& ((((unsigned HOST_WIDE_INT) 1 << count)) - 1)) == 0"
//in extract_left_shift
// count == -1 thus negative shift exponent
// Target: x86_64-unknown-linux-gnu
struct double_int
{
double_int sext (unsigned prec) const;
static double_int mask (unsigned prec);
unsigned low;/*unsigned long int low provokes same bug at combine.c:12078*/
};
double_int
double_int::mask (unsigned prec)
{
double_int mask;
if (prec <= 64) mask.low = prec ? ((unsigned long) 2 << (prec - 1)) - 1 : 0;
return mask;
}
double_int
double_int::sext (unsigned prec) const
{
const double_int &cst = *this;
double_int mask = double_int::mask (prec);
double_int r;
unsigned long snum;
if (prec <= 64) snum = cst.low;
if (((snum >> (prec - 1)) & 1) == 1)
{
r.low = cst.low ;
}
else
{
r.low = mask.low;
}
return r;
}
More information about the Gcc-bugs
mailing list