1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include <stddef.h> 6 #include <stdint.h> 7 8 #include <limits> 9 #include <type_traits> 10 11 #include <gtest/gtest.h> 12 13 #include "base/compiler_specific.h" 14 #include "base/numerics/safe_conversions.h" 15 #include "base/numerics/safe_math.h" 16 #include "base/template_util.h" 17 18 using std::numeric_limits; 19 using base::CheckedNumeric; 20 using base::checked_cast; 21 using base::IsValueInRangeForNumericType; 22 using base::IsValueNegative; 23 using base::SizeT; 24 using base::StrictNumeric; 25 using base::saturated_cast; 26 using base::strict_cast; 27 using base::internal::MaxExponent; 28 using base::internal::RANGE_VALID; 29 using base::internal::RANGE_INVALID; 30 using base::internal::RANGE_OVERFLOW; 31 using base::internal::RANGE_UNDERFLOW; 32 using base::internal::SignedIntegerForSize; 33 34 // These tests deliberately cause arithmetic overflows. If the compiler is 35 // aggressive enough, it can const fold these overflows. Disable warnings about 36 // overflows for const expressions. 37 #if defined(OS_WIN) 38 #pragma warning(disable:4756) 39 #endif 40 41 // This is a helper function for finding the maximum value in Src that can be 42 // wholy represented as the destination floating-point type. 43 template <typename Dst, typename Src> 44 Dst GetMaxConvertibleToFloat() { 45 typedef numeric_limits<Dst> DstLimits; 46 typedef numeric_limits<Src> SrcLimits; 47 static_assert(SrcLimits::is_specialized, "Source must be numeric."); 48 static_assert(DstLimits::is_specialized, "Destination must be numeric."); 49 CHECK(DstLimits::is_iec559); 50 51 if (SrcLimits::digits <= DstLimits::digits && 52 MaxExponent<Src>::value <= MaxExponent<Dst>::value) 53 return SrcLimits::max(); 54 Src max = SrcLimits::max() / 2 + (SrcLimits::is_integer ? 1 : 0); 55 while (max != static_cast<Src>(static_cast<Dst>(max))) { 56 max /= 2; 57 } 58 return static_cast<Dst>(max); 59 } 60 61 // Helper macros to wrap displaying the conversion types and line numbers. 62 #define TEST_EXPECTED_VALIDITY(expected, actual) \ 63 EXPECT_EQ(expected, CheckedNumeric<Dst>(actual).validity()) \ 64 << "Result test: Value " << +(actual).ValueUnsafe() << " as " << dst \ 65 << " on line " << line; 66 67 #define TEST_EXPECTED_VALUE(expected, actual) \ 68 EXPECT_EQ(static_cast<Dst>(expected), \ 69 CheckedNumeric<Dst>(actual).ValueUnsafe()) \ 70 << "Result test: Value " << +((actual).ValueUnsafe()) << " as " << dst \ 71 << " on line " << line; 72 73 // Signed integer arithmetic. 74 template <typename Dst> 75 static void TestSpecializedArithmetic( 76 const char* dst, 77 int line, 78 typename std::enable_if<numeric_limits<Dst>::is_integer && 79 numeric_limits<Dst>::is_signed, 80 int>::type = 0) { 81 typedef numeric_limits<Dst> DstLimits; 82 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, 83 -CheckedNumeric<Dst>(DstLimits::min())); 84 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, 85 CheckedNumeric<Dst>(DstLimits::min()).Abs()); 86 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs()); 87 88 TEST_EXPECTED_VALIDITY(RANGE_VALID, 89 CheckedNumeric<Dst>(DstLimits::max()) + -1); 90 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, 91 CheckedNumeric<Dst>(DstLimits::min()) + -1); 92 TEST_EXPECTED_VALIDITY( 93 RANGE_UNDERFLOW, 94 CheckedNumeric<Dst>(-DstLimits::max()) + -DstLimits::max()); 95 96 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, 97 CheckedNumeric<Dst>(DstLimits::min()) - 1); 98 TEST_EXPECTED_VALIDITY(RANGE_VALID, 99 CheckedNumeric<Dst>(DstLimits::min()) - -1); 100 TEST_EXPECTED_VALIDITY( 101 RANGE_OVERFLOW, 102 CheckedNumeric<Dst>(DstLimits::max()) - -DstLimits::max()); 103 TEST_EXPECTED_VALIDITY( 104 RANGE_UNDERFLOW, 105 CheckedNumeric<Dst>(-DstLimits::max()) - DstLimits::max()); 106 107 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, 108 CheckedNumeric<Dst>(DstLimits::min()) * 2); 109 110 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, 111 CheckedNumeric<Dst>(DstLimits::min()) / -1); 112 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(-1) / 2); 113 114 // Modulus is legal only for integers. 115 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1); 116 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); 117 TEST_EXPECTED_VALUE(-1, CheckedNumeric<Dst>(-1) % 2); 118 TEST_EXPECTED_VALIDITY(RANGE_INVALID, CheckedNumeric<Dst>(-1) % -2); 119 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::min()) % 2); 120 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2); 121 // Test all the different modulus combinations. 122 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1)); 123 TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1)); 124 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); 125 CheckedNumeric<Dst> checked_dst = 1; 126 TEST_EXPECTED_VALUE(0, checked_dst %= 1); 127 } 128 129 // Unsigned integer arithmetic. 130 template <typename Dst> 131 static void TestSpecializedArithmetic( 132 const char* dst, 133 int line, 134 typename std::enable_if<numeric_limits<Dst>::is_integer && 135 !numeric_limits<Dst>::is_signed, 136 int>::type = 0) { 137 typedef numeric_limits<Dst> DstLimits; 138 TEST_EXPECTED_VALIDITY(RANGE_VALID, -CheckedNumeric<Dst>(DstLimits::min())); 139 TEST_EXPECTED_VALIDITY(RANGE_VALID, 140 CheckedNumeric<Dst>(DstLimits::min()).Abs()); 141 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, 142 CheckedNumeric<Dst>(DstLimits::min()) + -1); 143 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, 144 CheckedNumeric<Dst>(DstLimits::min()) - 1); 145 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::min()) * 2); 146 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) / 2); 147 TEST_EXPECTED_VALIDITY(RANGE_VALID, 148 CheckedNumeric<Dst>(DstLimits::min()).UnsignedAbs()); 149 TEST_EXPECTED_VALIDITY( 150 RANGE_VALID, 151 CheckedNumeric<typename SignedIntegerForSize<Dst>::type>( 152 std::numeric_limits<typename SignedIntegerForSize<Dst>::type>::min()) 153 .UnsignedAbs()); 154 155 // Modulus is legal only for integers. 156 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1); 157 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); 158 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) % 2); 159 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::min()) % 2); 160 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2); 161 // Test all the different modulus combinations. 162 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1)); 163 TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1)); 164 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); 165 CheckedNumeric<Dst> checked_dst = 1; 166 TEST_EXPECTED_VALUE(0, checked_dst %= 1); 167 } 168 169 // Floating point arithmetic. 170 template <typename Dst> 171 void TestSpecializedArithmetic( 172 const char* dst, 173 int line, 174 typename std::enable_if<numeric_limits<Dst>::is_iec559, int>::type = 0) { 175 typedef numeric_limits<Dst> DstLimits; 176 TEST_EXPECTED_VALIDITY(RANGE_VALID, -CheckedNumeric<Dst>(DstLimits::min())); 177 178 TEST_EXPECTED_VALIDITY(RANGE_VALID, 179 CheckedNumeric<Dst>(DstLimits::min()).Abs()); 180 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs()); 181 182 TEST_EXPECTED_VALIDITY(RANGE_VALID, 183 CheckedNumeric<Dst>(DstLimits::min()) + -1); 184 TEST_EXPECTED_VALIDITY(RANGE_VALID, 185 CheckedNumeric<Dst>(DstLimits::max()) + 1); 186 TEST_EXPECTED_VALIDITY( 187 RANGE_UNDERFLOW, 188 CheckedNumeric<Dst>(-DstLimits::max()) + -DstLimits::max()); 189 190 TEST_EXPECTED_VALIDITY( 191 RANGE_OVERFLOW, 192 CheckedNumeric<Dst>(DstLimits::max()) - -DstLimits::max()); 193 TEST_EXPECTED_VALIDITY( 194 RANGE_UNDERFLOW, 195 CheckedNumeric<Dst>(-DstLimits::max()) - DstLimits::max()); 196 197 TEST_EXPECTED_VALIDITY(RANGE_VALID, 198 CheckedNumeric<Dst>(DstLimits::min()) * 2); 199 200 TEST_EXPECTED_VALUE(-0.5, CheckedNumeric<Dst>(-1.0) / 2); 201 EXPECT_EQ(static_cast<Dst>(1.0), CheckedNumeric<Dst>(1.0).ValueFloating()); 202 } 203 204 // Generic arithmetic tests. 205 template <typename Dst> 206 static void TestArithmetic(const char* dst, int line) { 207 typedef numeric_limits<Dst> DstLimits; 208 209 EXPECT_EQ(true, CheckedNumeric<Dst>().IsValid()); 210 EXPECT_EQ(false, 211 CheckedNumeric<Dst>(CheckedNumeric<Dst>(DstLimits::max()) * 212 DstLimits::max()).IsValid()); 213 EXPECT_EQ(static_cast<Dst>(0), CheckedNumeric<Dst>().ValueOrDie()); 214 EXPECT_EQ(static_cast<Dst>(0), CheckedNumeric<Dst>().ValueOrDefault(1)); 215 EXPECT_EQ(static_cast<Dst>(1), 216 CheckedNumeric<Dst>(CheckedNumeric<Dst>(DstLimits::max()) * 217 DstLimits::max()).ValueOrDefault(1)); 218 219 // Test the operator combinations. 220 TEST_EXPECTED_VALUE(2, CheckedNumeric<Dst>(1) + CheckedNumeric<Dst>(1)); 221 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) - CheckedNumeric<Dst>(1)); 222 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) * CheckedNumeric<Dst>(1)); 223 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) / CheckedNumeric<Dst>(1)); 224 TEST_EXPECTED_VALUE(2, 1 + CheckedNumeric<Dst>(1)); 225 TEST_EXPECTED_VALUE(0, 1 - CheckedNumeric<Dst>(1)); 226 TEST_EXPECTED_VALUE(1, 1 * CheckedNumeric<Dst>(1)); 227 TEST_EXPECTED_VALUE(1, 1 / CheckedNumeric<Dst>(1)); 228 TEST_EXPECTED_VALUE(2, CheckedNumeric<Dst>(1) + 1); 229 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) - 1); 230 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) * 1); 231 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) / 1); 232 CheckedNumeric<Dst> checked_dst = 1; 233 TEST_EXPECTED_VALUE(2, checked_dst += 1); 234 checked_dst = 1; 235 TEST_EXPECTED_VALUE(0, checked_dst -= 1); 236 checked_dst = 1; 237 TEST_EXPECTED_VALUE(1, checked_dst *= 1); 238 checked_dst = 1; 239 TEST_EXPECTED_VALUE(1, checked_dst /= 1); 240 241 // Generic negation. 242 TEST_EXPECTED_VALUE(0, -CheckedNumeric<Dst>()); 243 TEST_EXPECTED_VALUE(-1, -CheckedNumeric<Dst>(1)); 244 TEST_EXPECTED_VALUE(1, -CheckedNumeric<Dst>(-1)); 245 TEST_EXPECTED_VALUE(static_cast<Dst>(DstLimits::max() * -1), 246 -CheckedNumeric<Dst>(DstLimits::max())); 247 248 // Generic absolute value. 249 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>().Abs()); 250 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).Abs()); 251 TEST_EXPECTED_VALUE(DstLimits::max(), 252 CheckedNumeric<Dst>(DstLimits::max()).Abs()); 253 254 // Generic addition. 255 TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>() + 1)); 256 TEST_EXPECTED_VALUE(2, (CheckedNumeric<Dst>(1) + 1)); 257 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) + 1)); 258 TEST_EXPECTED_VALIDITY(RANGE_VALID, 259 CheckedNumeric<Dst>(DstLimits::min()) + 1); 260 TEST_EXPECTED_VALIDITY( 261 RANGE_OVERFLOW, CheckedNumeric<Dst>(DstLimits::max()) + DstLimits::max()); 262 263 // Generic subtraction. 264 TEST_EXPECTED_VALUE(-1, (CheckedNumeric<Dst>() - 1)); 265 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(1) - 1)); 266 TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) - 1)); 267 TEST_EXPECTED_VALIDITY(RANGE_VALID, 268 CheckedNumeric<Dst>(DstLimits::max()) - 1); 269 270 // Generic multiplication. 271 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>() * 1)); 272 TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>(1) * 1)); 273 TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) * 2)); 274 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * 0)); 275 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) * 0)); 276 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * -1)); 277 TEST_EXPECTED_VALIDITY( 278 RANGE_OVERFLOW, CheckedNumeric<Dst>(DstLimits::max()) * DstLimits::max()); 279 280 // Generic division. 281 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() / 1); 282 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) / 1); 283 TEST_EXPECTED_VALUE(DstLimits::min() / 2, 284 CheckedNumeric<Dst>(DstLimits::min()) / 2); 285 TEST_EXPECTED_VALUE(DstLimits::max() / 2, 286 CheckedNumeric<Dst>(DstLimits::max()) / 2); 287 288 TestSpecializedArithmetic<Dst>(dst, line); 289 } 290 291 // Helper macro to wrap displaying the conversion types and line numbers. 292 #define TEST_ARITHMETIC(Dst) TestArithmetic<Dst>(#Dst, __LINE__) 293 294 TEST(SafeNumerics, SignedIntegerMath) { 295 TEST_ARITHMETIC(int8_t); 296 TEST_ARITHMETIC(int); 297 TEST_ARITHMETIC(intptr_t); 298 TEST_ARITHMETIC(intmax_t); 299 } 300 301 TEST(SafeNumerics, UnsignedIntegerMath) { 302 TEST_ARITHMETIC(uint8_t); 303 TEST_ARITHMETIC(unsigned int); 304 TEST_ARITHMETIC(uintptr_t); 305 TEST_ARITHMETIC(uintmax_t); 306 } 307 308 TEST(SafeNumerics, FloatingPointMath) { 309 TEST_ARITHMETIC(float); 310 TEST_ARITHMETIC(double); 311 } 312 313 // Enumerates the five different conversions types we need to test. 314 enum NumericConversionType { 315 SIGN_PRESERVING_VALUE_PRESERVING, 316 SIGN_PRESERVING_NARROW, 317 SIGN_TO_UNSIGN_WIDEN_OR_EQUAL, 318 SIGN_TO_UNSIGN_NARROW, 319 UNSIGN_TO_SIGN_NARROW_OR_EQUAL, 320 }; 321 322 // Template covering the different conversion tests. 323 template <typename Dst, typename Src, NumericConversionType conversion> 324 struct TestNumericConversion {}; 325 326 // EXPECT_EQ wrappers providing specific detail on test failures. 327 #define TEST_EXPECTED_RANGE(expected, actual) \ 328 EXPECT_EQ(expected, base::internal::DstRangeRelationToSrcRange<Dst>(actual)) \ 329 << "Conversion test: " << src << " value " << actual << " to " << dst \ 330 << " on line " << line; 331 332 template <typename Dst, typename Src> 333 struct TestNumericConversion<Dst, Src, SIGN_PRESERVING_VALUE_PRESERVING> { 334 static void Test(const char *dst, const char *src, int line) { 335 typedef numeric_limits<Src> SrcLimits; 336 typedef numeric_limits<Dst> DstLimits; 337 // Integral to floating. 338 static_assert((DstLimits::is_iec559 && SrcLimits::is_integer) || 339 // Not floating to integral and... 340 (!(DstLimits::is_integer && SrcLimits::is_iec559) && 341 // Same sign, same numeric, source is narrower or same. 342 ((SrcLimits::is_signed == DstLimits::is_signed && 343 sizeof(Dst) >= sizeof(Src)) || 344 // Or signed destination and source is smaller 345 (DstLimits::is_signed && sizeof(Dst) > sizeof(Src)))), 346 "Comparison must be sign preserving and value preserving"); 347 348 const CheckedNumeric<Dst> checked_dst = SrcLimits::max(); 349 TEST_EXPECTED_VALIDITY(RANGE_VALID, checked_dst); 350 if (MaxExponent<Dst>::value > MaxExponent<Src>::value) { 351 if (MaxExponent<Dst>::value >= MaxExponent<Src>::value * 2 - 1) { 352 // At least twice larger type. 353 TEST_EXPECTED_VALIDITY(RANGE_VALID, SrcLimits::max() * checked_dst); 354 355 } else { // Larger, but not at least twice as large. 356 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, SrcLimits::max() * checked_dst); 357 TEST_EXPECTED_VALIDITY(RANGE_VALID, checked_dst + 1); 358 } 359 } else { // Same width type. 360 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, checked_dst + 1); 361 } 362 363 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max()); 364 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 365 if (SrcLimits::is_iec559) { 366 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max() * static_cast<Src>(-1)); 367 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity()); 368 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1); 369 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN()); 370 } else if (numeric_limits<Src>::is_signed) { 371 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1)); 372 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::min()); 373 } 374 } 375 }; 376 377 template <typename Dst, typename Src> 378 struct TestNumericConversion<Dst, Src, SIGN_PRESERVING_NARROW> { 379 static void Test(const char *dst, const char *src, int line) { 380 typedef numeric_limits<Src> SrcLimits; 381 typedef numeric_limits<Dst> DstLimits; 382 static_assert(SrcLimits::is_signed == DstLimits::is_signed, 383 "Destination and source sign must be the same"); 384 static_assert(sizeof(Dst) < sizeof(Src) || 385 (DstLimits::is_integer && SrcLimits::is_iec559), 386 "Destination must be narrower than source"); 387 388 const CheckedNumeric<Dst> checked_dst; 389 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, checked_dst + SrcLimits::max()); 390 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); 391 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, checked_dst - SrcLimits::max()); 392 393 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); 394 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 395 if (SrcLimits::is_iec559) { 396 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1); 397 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1)); 398 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity()); 399 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1); 400 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN()); 401 if (DstLimits::is_integer) { 402 if (SrcLimits::digits < DstLimits::digits) { 403 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, 404 static_cast<Src>(DstLimits::max())); 405 } else { 406 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::max())); 407 } 408 TEST_EXPECTED_RANGE( 409 RANGE_VALID, 410 static_cast<Src>(GetMaxConvertibleToFloat<Src, Dst>())); 411 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::min())); 412 } 413 } else if (SrcLimits::is_signed) { 414 TEST_EXPECTED_VALUE(-1, checked_dst - static_cast<Src>(1)); 415 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::min()); 416 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1)); 417 } else { 418 TEST_EXPECTED_VALIDITY(RANGE_INVALID, checked_dst - static_cast<Src>(1)); 419 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::min()); 420 } 421 } 422 }; 423 424 template <typename Dst, typename Src> 425 struct TestNumericConversion<Dst, Src, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL> { 426 static void Test(const char *dst, const char *src, int line) { 427 typedef numeric_limits<Src> SrcLimits; 428 typedef numeric_limits<Dst> DstLimits; 429 static_assert(sizeof(Dst) >= sizeof(Src), 430 "Destination must be equal or wider than source."); 431 static_assert(SrcLimits::is_signed, "Source must be signed"); 432 static_assert(!DstLimits::is_signed, "Destination must be unsigned"); 433 434 const CheckedNumeric<Dst> checked_dst; 435 TEST_EXPECTED_VALUE(SrcLimits::max(), checked_dst + SrcLimits::max()); 436 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, checked_dst + static_cast<Src>(-1)); 437 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, checked_dst + -SrcLimits::max()); 438 439 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::min()); 440 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max()); 441 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 442 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1)); 443 } 444 }; 445 446 template <typename Dst, typename Src> 447 struct TestNumericConversion<Dst, Src, SIGN_TO_UNSIGN_NARROW> { 448 static void Test(const char *dst, const char *src, int line) { 449 typedef numeric_limits<Src> SrcLimits; 450 typedef numeric_limits<Dst> DstLimits; 451 static_assert((DstLimits::is_integer && SrcLimits::is_iec559) || 452 (sizeof(Dst) < sizeof(Src)), 453 "Destination must be narrower than source."); 454 static_assert(SrcLimits::is_signed, "Source must be signed."); 455 static_assert(!DstLimits::is_signed, "Destination must be unsigned."); 456 457 const CheckedNumeric<Dst> checked_dst; 458 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); 459 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, checked_dst + SrcLimits::max()); 460 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, checked_dst + static_cast<Src>(-1)); 461 TEST_EXPECTED_VALIDITY(RANGE_UNDERFLOW, checked_dst + -SrcLimits::max()); 462 463 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); 464 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 465 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1)); 466 if (SrcLimits::is_iec559) { 467 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1); 468 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity()); 469 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1); 470 TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN()); 471 if (DstLimits::is_integer) { 472 if (SrcLimits::digits < DstLimits::digits) { 473 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, 474 static_cast<Src>(DstLimits::max())); 475 } else { 476 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::max())); 477 } 478 TEST_EXPECTED_RANGE( 479 RANGE_VALID, 480 static_cast<Src>(GetMaxConvertibleToFloat<Src, Dst>())); 481 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::min())); 482 } 483 } else { 484 TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::min()); 485 } 486 } 487 }; 488 489 template <typename Dst, typename Src> 490 struct TestNumericConversion<Dst, Src, UNSIGN_TO_SIGN_NARROW_OR_EQUAL> { 491 static void Test(const char *dst, const char *src, int line) { 492 typedef numeric_limits<Src> SrcLimits; 493 typedef numeric_limits<Dst> DstLimits; 494 static_assert(sizeof(Dst) <= sizeof(Src), 495 "Destination must be narrower or equal to source."); 496 static_assert(!SrcLimits::is_signed, "Source must be unsigned."); 497 static_assert(DstLimits::is_signed, "Destination must be signed."); 498 499 const CheckedNumeric<Dst> checked_dst; 500 TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1)); 501 TEST_EXPECTED_VALIDITY(RANGE_OVERFLOW, checked_dst + SrcLimits::max()); 502 TEST_EXPECTED_VALUE(SrcLimits::min(), checked_dst + SrcLimits::min()); 503 504 TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::min()); 505 TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max()); 506 TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1)); 507 } 508 }; 509 510 // Helper macro to wrap displaying the conversion types and line numbers 511 #define TEST_NUMERIC_CONVERSION(d, s, t) \ 512 TestNumericConversion<d, s, t>::Test(#d, #s, __LINE__) 513 514 TEST(SafeNumerics, IntMinOperations) { 515 TEST_NUMERIC_CONVERSION(int8_t, int8_t, SIGN_PRESERVING_VALUE_PRESERVING); 516 TEST_NUMERIC_CONVERSION(uint8_t, uint8_t, SIGN_PRESERVING_VALUE_PRESERVING); 517 518 TEST_NUMERIC_CONVERSION(int8_t, int, SIGN_PRESERVING_NARROW); 519 TEST_NUMERIC_CONVERSION(uint8_t, unsigned int, SIGN_PRESERVING_NARROW); 520 TEST_NUMERIC_CONVERSION(int8_t, float, SIGN_PRESERVING_NARROW); 521 522 TEST_NUMERIC_CONVERSION(uint8_t, int8_t, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL); 523 524 TEST_NUMERIC_CONVERSION(uint8_t, int, SIGN_TO_UNSIGN_NARROW); 525 TEST_NUMERIC_CONVERSION(uint8_t, intmax_t, SIGN_TO_UNSIGN_NARROW); 526 TEST_NUMERIC_CONVERSION(uint8_t, float, SIGN_TO_UNSIGN_NARROW); 527 528 TEST_NUMERIC_CONVERSION(int8_t, unsigned int, UNSIGN_TO_SIGN_NARROW_OR_EQUAL); 529 TEST_NUMERIC_CONVERSION(int8_t, uintmax_t, UNSIGN_TO_SIGN_NARROW_OR_EQUAL); 530 } 531 532 TEST(SafeNumerics, IntOperations) { 533 TEST_NUMERIC_CONVERSION(int, int, SIGN_PRESERVING_VALUE_PRESERVING); 534 TEST_NUMERIC_CONVERSION(unsigned int, unsigned int, 535 SIGN_PRESERVING_VALUE_PRESERVING); 536 TEST_NUMERIC_CONVERSION(int, int8_t, SIGN_PRESERVING_VALUE_PRESERVING); 537 TEST_NUMERIC_CONVERSION(unsigned int, uint8_t, 538 SIGN_PRESERVING_VALUE_PRESERVING); 539 TEST_NUMERIC_CONVERSION(int, uint8_t, SIGN_PRESERVING_VALUE_PRESERVING); 540 541 TEST_NUMERIC_CONVERSION(int, intmax_t, SIGN_PRESERVING_NARROW); 542 TEST_NUMERIC_CONVERSION(unsigned int, uintmax_t, SIGN_PRESERVING_NARROW); 543 TEST_NUMERIC_CONVERSION(int, float, SIGN_PRESERVING_NARROW); 544 TEST_NUMERIC_CONVERSION(int, double, SIGN_PRESERVING_NARROW); 545 546 TEST_NUMERIC_CONVERSION(unsigned int, int, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL); 547 TEST_NUMERIC_CONVERSION(unsigned int, int8_t, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL); 548 549 TEST_NUMERIC_CONVERSION(unsigned int, intmax_t, SIGN_TO_UNSIGN_NARROW); 550 TEST_NUMERIC_CONVERSION(unsigned int, float, SIGN_TO_UNSIGN_NARROW); 551 TEST_NUMERIC_CONVERSION(unsigned int, double, SIGN_TO_UNSIGN_NARROW); 552 553 TEST_NUMERIC_CONVERSION(int, unsigned int, UNSIGN_TO_SIGN_NARROW_OR_EQUAL); 554 TEST_NUMERIC_CONVERSION(int, uintmax_t, UNSIGN_TO_SIGN_NARROW_OR_EQUAL); 555 } 556 557 TEST(SafeNumerics, IntMaxOperations) { 558 TEST_NUMERIC_CONVERSION(intmax_t, intmax_t, SIGN_PRESERVING_VALUE_PRESERVING); 559 TEST_NUMERIC_CONVERSION(uintmax_t, uintmax_t, 560 SIGN_PRESERVING_VALUE_PRESERVING); 561 TEST_NUMERIC_CONVERSION(intmax_t, int, SIGN_PRESERVING_VALUE_PRESERVING); 562 TEST_NUMERIC_CONVERSION(uintmax_t, unsigned int, 563 SIGN_PRESERVING_VALUE_PRESERVING); 564 TEST_NUMERIC_CONVERSION(intmax_t, unsigned int, 565 SIGN_PRESERVING_VALUE_PRESERVING); 566 TEST_NUMERIC_CONVERSION(intmax_t, uint8_t, SIGN_PRESERVING_VALUE_PRESERVING); 567 568 TEST_NUMERIC_CONVERSION(intmax_t, float, SIGN_PRESERVING_NARROW); 569 TEST_NUMERIC_CONVERSION(intmax_t, double, SIGN_PRESERVING_NARROW); 570 571 TEST_NUMERIC_CONVERSION(uintmax_t, int, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL); 572 TEST_NUMERIC_CONVERSION(uintmax_t, int8_t, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL); 573 574 TEST_NUMERIC_CONVERSION(uintmax_t, float, SIGN_TO_UNSIGN_NARROW); 575 TEST_NUMERIC_CONVERSION(uintmax_t, double, SIGN_TO_UNSIGN_NARROW); 576 577 TEST_NUMERIC_CONVERSION(intmax_t, uintmax_t, UNSIGN_TO_SIGN_NARROW_OR_EQUAL); 578 } 579 580 TEST(SafeNumerics, FloatOperations) { 581 TEST_NUMERIC_CONVERSION(float, intmax_t, SIGN_PRESERVING_VALUE_PRESERVING); 582 TEST_NUMERIC_CONVERSION(float, uintmax_t, 583 SIGN_PRESERVING_VALUE_PRESERVING); 584 TEST_NUMERIC_CONVERSION(float, int, SIGN_PRESERVING_VALUE_PRESERVING); 585 TEST_NUMERIC_CONVERSION(float, unsigned int, 586 SIGN_PRESERVING_VALUE_PRESERVING); 587 588 TEST_NUMERIC_CONVERSION(float, double, SIGN_PRESERVING_NARROW); 589 } 590 591 TEST(SafeNumerics, DoubleOperations) { 592 TEST_NUMERIC_CONVERSION(double, intmax_t, SIGN_PRESERVING_VALUE_PRESERVING); 593 TEST_NUMERIC_CONVERSION(double, uintmax_t, 594 SIGN_PRESERVING_VALUE_PRESERVING); 595 TEST_NUMERIC_CONVERSION(double, int, SIGN_PRESERVING_VALUE_PRESERVING); 596 TEST_NUMERIC_CONVERSION(double, unsigned int, 597 SIGN_PRESERVING_VALUE_PRESERVING); 598 } 599 600 TEST(SafeNumerics, SizeTOperations) { 601 TEST_NUMERIC_CONVERSION(size_t, int, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL); 602 TEST_NUMERIC_CONVERSION(int, size_t, UNSIGN_TO_SIGN_NARROW_OR_EQUAL); 603 } 604 605 TEST(SafeNumerics, CastTests) { 606 // MSVC catches and warns that we're forcing saturation in these tests. 607 // Since that's intentional, we need to shut this warning off. 608 #if defined(COMPILER_MSVC) 609 #pragma warning(disable : 4756) 610 #endif 611 612 int small_positive = 1; 613 int small_negative = -1; 614 double double_small = 1.0; 615 double double_large = numeric_limits<double>::max(); 616 double double_infinity = numeric_limits<float>::infinity(); 617 double double_large_int = numeric_limits<int>::max(); 618 double double_small_int = numeric_limits<int>::min(); 619 620 // Just test that the casts compile, since the other tests cover logic. 621 EXPECT_EQ(0, checked_cast<int>(static_cast<size_t>(0))); 622 EXPECT_EQ(0, strict_cast<int>(static_cast<char>(0))); 623 EXPECT_EQ(0, strict_cast<int>(static_cast<unsigned char>(0))); 624 EXPECT_EQ(0U, strict_cast<unsigned>(static_cast<unsigned char>(0))); 625 EXPECT_EQ(1ULL, static_cast<uint64_t>(StrictNumeric<size_t>(1U))); 626 EXPECT_EQ(1ULL, static_cast<uint64_t>(SizeT(1U))); 627 EXPECT_EQ(1U, static_cast<size_t>(StrictNumeric<unsigned>(1U))); 628 629 EXPECT_TRUE(CheckedNumeric<uint64_t>(StrictNumeric<unsigned>(1U)).IsValid()); 630 EXPECT_TRUE(CheckedNumeric<int>(StrictNumeric<unsigned>(1U)).IsValid()); 631 EXPECT_FALSE(CheckedNumeric<unsigned>(StrictNumeric<int>(-1)).IsValid()); 632 633 EXPECT_TRUE(IsValueNegative(-1)); 634 EXPECT_TRUE(IsValueNegative(numeric_limits<int>::min())); 635 EXPECT_FALSE(IsValueNegative(numeric_limits<unsigned>::min())); 636 EXPECT_TRUE(IsValueNegative(-numeric_limits<double>::max())); 637 EXPECT_FALSE(IsValueNegative(0)); 638 EXPECT_FALSE(IsValueNegative(1)); 639 EXPECT_FALSE(IsValueNegative(0u)); 640 EXPECT_FALSE(IsValueNegative(1u)); 641 EXPECT_FALSE(IsValueNegative(numeric_limits<int>::max())); 642 EXPECT_FALSE(IsValueNegative(numeric_limits<unsigned>::max())); 643 EXPECT_FALSE(IsValueNegative(numeric_limits<double>::max())); 644 645 // These casts and coercions will fail to compile: 646 // EXPECT_EQ(0, strict_cast<int>(static_cast<size_t>(0))); 647 // EXPECT_EQ(0, strict_cast<size_t>(static_cast<int>(0))); 648 // EXPECT_EQ(1ULL, StrictNumeric<size_t>(1)); 649 // EXPECT_EQ(1, StrictNumeric<size_t>(1U)); 650 651 // Test various saturation corner cases. 652 EXPECT_EQ(saturated_cast<int>(small_negative), 653 static_cast<int>(small_negative)); 654 EXPECT_EQ(saturated_cast<int>(small_positive), 655 static_cast<int>(small_positive)); 656 EXPECT_EQ(saturated_cast<unsigned>(small_negative), 657 static_cast<unsigned>(0)); 658 EXPECT_EQ(saturated_cast<int>(double_small), 659 static_cast<int>(double_small)); 660 EXPECT_EQ(saturated_cast<int>(double_large), numeric_limits<int>::max()); 661 EXPECT_EQ(saturated_cast<float>(double_large), double_infinity); 662 EXPECT_EQ(saturated_cast<float>(-double_large), -double_infinity); 663 EXPECT_EQ(numeric_limits<int>::min(), saturated_cast<int>(double_small_int)); 664 EXPECT_EQ(numeric_limits<int>::max(), saturated_cast<int>(double_large_int)); 665 666 float not_a_number = std::numeric_limits<float>::infinity() - 667 std::numeric_limits<float>::infinity(); 668 EXPECT_TRUE(std::isnan(not_a_number)); 669 EXPECT_EQ(0, saturated_cast<int>(not_a_number)); 670 } 671 672 #if GTEST_HAS_DEATH_TEST 673 674 TEST(SafeNumerics, SaturatedCastChecks) { 675 float not_a_number = std::numeric_limits<float>::infinity() - 676 std::numeric_limits<float>::infinity(); 677 EXPECT_TRUE(std::isnan(not_a_number)); 678 EXPECT_DEATH((saturated_cast<int, base::SaturatedCastNaNBehaviorCheck>( 679 not_a_number)), ""); 680 } 681 682 #endif // GTEST_HAS_DEATH_TEST 683 684 TEST(SafeNumerics, IsValueInRangeForNumericType) { 685 EXPECT_TRUE(IsValueInRangeForNumericType<uint32_t>(0)); 686 EXPECT_TRUE(IsValueInRangeForNumericType<uint32_t>(1)); 687 EXPECT_TRUE(IsValueInRangeForNumericType<uint32_t>(2)); 688 EXPECT_FALSE(IsValueInRangeForNumericType<uint32_t>(-1)); 689 EXPECT_TRUE(IsValueInRangeForNumericType<uint32_t>(0xffffffffu)); 690 EXPECT_TRUE(IsValueInRangeForNumericType<uint32_t>(UINT64_C(0xffffffff))); 691 EXPECT_FALSE(IsValueInRangeForNumericType<uint32_t>(UINT64_C(0x100000000))); 692 EXPECT_FALSE(IsValueInRangeForNumericType<uint32_t>(UINT64_C(0x100000001))); 693 EXPECT_FALSE(IsValueInRangeForNumericType<uint32_t>( 694 std::numeric_limits<int32_t>::min())); 695 EXPECT_FALSE(IsValueInRangeForNumericType<uint32_t>( 696 std::numeric_limits<int64_t>::min())); 697 698 EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(0)); 699 EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(1)); 700 EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(2)); 701 EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(-1)); 702 EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(0x7fffffff)); 703 EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(0x7fffffffu)); 704 EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>(0x80000000u)); 705 EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>(0xffffffffu)); 706 EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>(INT64_C(0x80000000))); 707 EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>(INT64_C(0xffffffff))); 708 EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>(INT64_C(0x100000000))); 709 EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>( 710 std::numeric_limits<int32_t>::min())); 711 EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>( 712 static_cast<int64_t>(std::numeric_limits<int32_t>::min()))); 713 EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>( 714 static_cast<int64_t>(std::numeric_limits<int32_t>::min()) - 1)); 715 EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>( 716 std::numeric_limits<int64_t>::min())); 717 718 EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(0)); 719 EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(1)); 720 EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(2)); 721 EXPECT_FALSE(IsValueInRangeForNumericType<uint64_t>(-1)); 722 EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(0xffffffffu)); 723 EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(UINT64_C(0xffffffff))); 724 EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(UINT64_C(0x100000000))); 725 EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(UINT64_C(0x100000001))); 726 EXPECT_FALSE(IsValueInRangeForNumericType<uint64_t>( 727 std::numeric_limits<int32_t>::min())); 728 EXPECT_FALSE(IsValueInRangeForNumericType<uint64_t>(INT64_C(-1))); 729 EXPECT_FALSE(IsValueInRangeForNumericType<uint64_t>( 730 std::numeric_limits<int64_t>::min())); 731 732 EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(0)); 733 EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(1)); 734 EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(2)); 735 EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(-1)); 736 EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(0x7fffffff)); 737 EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(0x7fffffffu)); 738 EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(0x80000000u)); 739 EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(0xffffffffu)); 740 EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(INT64_C(0x80000000))); 741 EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(INT64_C(0xffffffff))); 742 EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(INT64_C(0x100000000))); 743 EXPECT_TRUE( 744 IsValueInRangeForNumericType<int64_t>(INT64_C(0x7fffffffffffffff))); 745 EXPECT_TRUE( 746 IsValueInRangeForNumericType<int64_t>(UINT64_C(0x7fffffffffffffff))); 747 EXPECT_FALSE( 748 IsValueInRangeForNumericType<int64_t>(UINT64_C(0x8000000000000000))); 749 EXPECT_FALSE( 750 IsValueInRangeForNumericType<int64_t>(UINT64_C(0xffffffffffffffff))); 751 EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>( 752 std::numeric_limits<int32_t>::min())); 753 EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>( 754 static_cast<int64_t>(std::numeric_limits<int32_t>::min()))); 755 EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>( 756 std::numeric_limits<int64_t>::min())); 757 } 758 759 TEST(SafeNumerics, CompoundNumericOperations) { 760 CheckedNumeric<int> a = 1; 761 CheckedNumeric<int> b = 2; 762 CheckedNumeric<int> c = 3; 763 CheckedNumeric<int> d = 4; 764 a += b; 765 EXPECT_EQ(3, a.ValueOrDie()); 766 a -= c; 767 EXPECT_EQ(0, a.ValueOrDie()); 768 d /= b; 769 EXPECT_EQ(2, d.ValueOrDie()); 770 d *= d; 771 EXPECT_EQ(4, d.ValueOrDie()); 772 773 CheckedNumeric<int> too_large = std::numeric_limits<int>::max(); 774 EXPECT_TRUE(too_large.IsValid()); 775 too_large += d; 776 EXPECT_FALSE(too_large.IsValid()); 777 too_large -= d; 778 EXPECT_FALSE(too_large.IsValid()); 779 too_large /= d; 780 EXPECT_FALSE(too_large.IsValid()); 781 } 782