Browse Source

Don't overflow signed ints in CBigNum::setint64().

CBigNum::setint64() does 'n <<= 8', where n is of type "long long".

This leads to shifting onto and past the sign bit, which is undefined
behavior in C++11 and can cause problems in the future.
miguelfreitas
Ricardo M. Correia 13 years ago
parent
commit
fe78c9ae8b
  1. 16
      src/bignum.h

16
src/bignum.h

@ -122,16 +122,22 @@ public: @@ -122,16 +122,22 @@ public:
return (n > (unsigned long)std::numeric_limits<int>::max() ? std::numeric_limits<int>::min() : -(int)n);
}
void setint64(int64 n)
void setint64(int64 sn)
{
unsigned char pch[sizeof(n) + 6];
unsigned char pch[sizeof(sn) + 6];
unsigned char* p = pch + 4;
bool fNegative = false;
if (n < (int64)0)
bool fNegative;
uint64 n;
if (sn < (int64)0)
{
n = -n;
n = -sn;
fNegative = true;
} else {
n = sn;
fNegative = false;
}
bool fLeadingZeroes = true;
for (int i = 0; i < 8; i++)
{

Loading…
Cancel
Save