[arith_uint256] Do not destroy *this content if passed-in operator may reference it

This commit is contained in:
Karl-Johan Alm 2018-02-26 15:34:53 +09:00
parent bf3353de90
commit 08b17def58
No known key found for this signature in database
GPG key ID: 57AF762DB3353322

View file

@ -69,16 +69,16 @@ base_uint<BITS>& base_uint<BITS>::operator*=(uint32_t b32)
template <unsigned int BITS> template <unsigned int BITS>
base_uint<BITS>& base_uint<BITS>::operator*=(const base_uint& b) base_uint<BITS>& base_uint<BITS>::operator*=(const base_uint& b)
{ {
base_uint<BITS> a = *this; base_uint<BITS> a;
*this = 0;
for (int j = 0; j < WIDTH; j++) { for (int j = 0; j < WIDTH; j++) {
uint64_t carry = 0; uint64_t carry = 0;
for (int i = 0; i + j < WIDTH; i++) { for (int i = 0; i + j < WIDTH; i++) {
uint64_t n = carry + pn[i + j] + (uint64_t)a.pn[j] * b.pn[i]; uint64_t n = carry + a.pn[i + j] + (uint64_t)pn[j] * b.pn[i];
pn[i + j] = n & 0xffffffff; a.pn[i + j] = n & 0xffffffff;
carry = n >> 32; carry = n >> 32;
} }
} }
*this = a;
return *this; return *this;
} }