Bug 768538 - 1/2 - Fix undefined behavior in CheckedInt - r=jwalden
--- a/mfbt/CheckedInt.h
+++ b/mfbt/CheckedInt.h
@@ -673,21 +673,23 @@ class CheckedInt
#define MOZ_CHECKEDINT_BASIC_BINARY_OPERATOR(NAME, OP) \
template<typename T> \
inline CheckedInt<T> operator OP(const CheckedInt<T> &lhs, \
const CheckedInt<T> &rhs) \
{ \
T x = lhs.mValue; \
T y = rhs.mValue; \
- T result = x OP y; \
T isOpValid = detail::Is##NAME##Valid(x, y); \
- /* Help the compiler perform RVO (return value optimization). */ \
- return CheckedInt<T>(result, \
- lhs.mIsValid && rhs.mIsValid && isOpValid); \
+ if (isOpValid) { \
+ T result = x OP y; \
+ return CheckedInt<T>(result, lhs.mIsValid && rhs.mIsValid); \
+ } else { \
+ return CheckedInt<T>(T(0), false); \
+ } \
}
MOZ_CHECKEDINT_BASIC_BINARY_OPERATOR(Add, +)
MOZ_CHECKEDINT_BASIC_BINARY_OPERATOR(Sub, -)
MOZ_CHECKEDINT_BASIC_BINARY_OPERATOR(Mul, *)
#undef MOZ_CHECKEDINT_BASIC_BINARY_OPERATOR