Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(70)

Side by Side Diff: base/numerics/safe_numerics_unittest.cc

Issue 2440143003: Fix some lurking div by 0s in safe_math_impl.h (Closed)
Patch Set: Rebase Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « base/numerics/safe_math_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 7
8 #include <limits> 8 #include <limits>
9 #include <type_traits> 9 #include <type_traits>
10 10
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 TEST_EXPECTED_VALUE(-1, CheckedNumeric<Dst>(-1) % 2); 113 TEST_EXPECTED_VALUE(-1, CheckedNumeric<Dst>(-1) % 2);
114 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(-1) % -2); 114 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(-1) % -2);
115 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::min()) % 2); 115 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::min()) % 2);
116 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2); 116 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2);
117 // Test all the different modulus combinations. 117 // Test all the different modulus combinations.
118 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1)); 118 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1));
119 TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1)); 119 TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1));
120 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); 120 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
121 CheckedNumeric<Dst> checked_dst = 1; 121 CheckedNumeric<Dst> checked_dst = 1;
122 TEST_EXPECTED_VALUE(0, checked_dst %= 1); 122 TEST_EXPECTED_VALUE(0, checked_dst %= 1);
123 // Test that div by 0 is avoided but returns invalid result.
124 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) % 0);
123 } 125 }
124 126
125 // Unsigned integer arithmetic. 127 // Unsigned integer arithmetic.
126 template <typename Dst> 128 template <typename Dst>
127 static void TestSpecializedArithmetic( 129 static void TestSpecializedArithmetic(
128 const char* dst, 130 const char* dst,
129 int line, 131 int line,
130 typename std::enable_if<numeric_limits<Dst>::is_integer && 132 typename std::enable_if<numeric_limits<Dst>::is_integer &&
131 !numeric_limits<Dst>::is_signed, 133 !numeric_limits<Dst>::is_signed,
132 int>::type = 0) { 134 int>::type = 0) {
(...skipping 15 matching lines...) Expand all
148 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); 150 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
149 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) % 2); 151 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) % 2);
150 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::min()) % 2); 152 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::min()) % 2);
151 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2); 153 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2);
152 // Test all the different modulus combinations. 154 // Test all the different modulus combinations.
153 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1)); 155 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1));
154 TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1)); 156 TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1));
155 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1); 157 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
156 CheckedNumeric<Dst> checked_dst = 1; 158 CheckedNumeric<Dst> checked_dst = 1;
157 TEST_EXPECTED_VALUE(0, checked_dst %= 1); 159 TEST_EXPECTED_VALUE(0, checked_dst %= 1);
160 // Test that div by 0 is avoided but returns invalid result.
161 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) % 0);
158 } 162 }
159 163
160 // Floating point arithmetic. 164 // Floating point arithmetic.
161 template <typename Dst> 165 template <typename Dst>
162 void TestSpecializedArithmetic( 166 void TestSpecializedArithmetic(
163 const char* dst, 167 const char* dst,
164 int line, 168 int line,
165 typename std::enable_if<numeric_limits<Dst>::is_iec559, int>::type = 0) { 169 typename std::enable_if<numeric_limits<Dst>::is_iec559, int>::type = 0) {
166 typedef numeric_limits<Dst> DstLimits; 170 typedef numeric_limits<Dst> DstLimits;
167 TEST_EXPECTED_SUCCESS(-CheckedNumeric<Dst>(DstLimits::min())); 171 TEST_EXPECTED_SUCCESS(-CheckedNumeric<Dst>(DstLimits::min()));
(...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after
755 759
756 CheckedNumeric<int> too_large = std::numeric_limits<int>::max(); 760 CheckedNumeric<int> too_large = std::numeric_limits<int>::max();
757 EXPECT_TRUE(too_large.IsValid()); 761 EXPECT_TRUE(too_large.IsValid());
758 too_large += d; 762 too_large += d;
759 EXPECT_FALSE(too_large.IsValid()); 763 EXPECT_FALSE(too_large.IsValid());
760 too_large -= d; 764 too_large -= d;
761 EXPECT_FALSE(too_large.IsValid()); 765 EXPECT_FALSE(too_large.IsValid());
762 too_large /= d; 766 too_large /= d;
763 EXPECT_FALSE(too_large.IsValid()); 767 EXPECT_FALSE(too_large.IsValid());
764 } 768 }
OLDNEW
« no previous file with comments | « base/numerics/safe_math_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698