Fix wide integer overflow checking
This commit is contained in:
@ -597,21 +597,24 @@ struct ObWideInteger<Bits, Signed>::_impl
|
|||||||
bool overflow = false;
|
bool overflow = false;
|
||||||
for (unsigned j = 0; j < inner_limit; j++) {
|
for (unsigned j = 0; j < inner_limit; j++) {
|
||||||
for (unsigned i = 0; i < outter_limit; i++) {
|
for (unsigned i = 0; i < outter_limit; i++) {
|
||||||
carrier += res.items_[i + j] + static_cast<dw_type>(lval.items_[i]) *
|
|
||||||
static_cast<dw_type>(rval.items_[j]);
|
|
||||||
if (i + j < ITEM_COUNT) {
|
if (i + j < ITEM_COUNT) {
|
||||||
|
carrier += res.items_[i + j] + static_cast<dw_type>(lval.items_[i]) *
|
||||||
|
static_cast<dw_type>(rval.items_[j]);
|
||||||
res.items_[i+j] = static_cast<uint64_t>(carrier);
|
res.items_[i+j] = static_cast<uint64_t>(carrier);
|
||||||
carrier >>= 64;
|
carrier >>= 64;
|
||||||
} else {
|
} else {
|
||||||
overflow = true;
|
overflow = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
} // end inner while
|
||||||
if (carrier) {
|
if (OB_UNLIKELY(overflow)) {
|
||||||
|
break;
|
||||||
|
} else if (carrier) {
|
||||||
if (j + outter_limit < ITEM_COUNT) {
|
if (j + outter_limit < ITEM_COUNT) {
|
||||||
res.items_[j + outter_limit] = static_cast<uint64_t>(carrier);
|
res.items_[j + outter_limit] = static_cast<uint64_t>(carrier);
|
||||||
} else {
|
} else {
|
||||||
overflow = true;
|
overflow = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
carrier = 0;
|
carrier = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user