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

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

Issue 2318713004: Fix undefined behavior in base/numerics (Closed)
Patch Set: Created 4 years, 3 months 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 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 CheckedNumeric<Dst> checked_dst = 1; 216 CheckedNumeric<Dst> checked_dst = 1;
217 TEST_EXPECTED_VALUE(2, checked_dst += 1); 217 TEST_EXPECTED_VALUE(2, checked_dst += 1);
218 checked_dst = 1; 218 checked_dst = 1;
219 TEST_EXPECTED_VALUE(0, checked_dst -= 1); 219 TEST_EXPECTED_VALUE(0, checked_dst -= 1);
220 checked_dst = 1; 220 checked_dst = 1;
221 TEST_EXPECTED_VALUE(1, checked_dst *= 1); 221 TEST_EXPECTED_VALUE(1, checked_dst *= 1);
222 checked_dst = 1; 222 checked_dst = 1;
223 TEST_EXPECTED_VALUE(1, checked_dst /= 1); 223 TEST_EXPECTED_VALUE(1, checked_dst /= 1);
224 224
225 // Generic negation. 225 // Generic negation.
226 TEST_EXPECTED_VALUE(0, -CheckedNumeric<Dst>()); 226 if (DstLimits::is_signed) {
227 TEST_EXPECTED_VALUE(-1, -CheckedNumeric<Dst>(1)); 227 TEST_EXPECTED_VALUE(0, -CheckedNumeric<Dst>());
228 TEST_EXPECTED_VALUE(1, -CheckedNumeric<Dst>(-1)); 228 TEST_EXPECTED_VALUE(-1, -CheckedNumeric<Dst>(1));
229 TEST_EXPECTED_VALUE(static_cast<Dst>(DstLimits::max() * -1), 229 TEST_EXPECTED_VALUE(1, -CheckedNumeric<Dst>(-1));
230 -CheckedNumeric<Dst>(DstLimits::max())); 230 TEST_EXPECTED_VALUE(static_cast<Dst>(DstLimits::max() * -1),
231 -CheckedNumeric<Dst>(DstLimits::max()));
232 }
231 233
232 // Generic absolute value. 234 // Generic absolute value.
233 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>().Abs()); 235 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>().Abs());
234 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).Abs()); 236 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).Abs());
235 TEST_EXPECTED_VALUE(DstLimits::max(), 237 TEST_EXPECTED_VALUE(DstLimits::max(),
236 CheckedNumeric<Dst>(DstLimits::max()).Abs()); 238 CheckedNumeric<Dst>(DstLimits::max()).Abs());
237 239
238 // Generic addition. 240 // Generic addition.
239 TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>() + 1)); 241 TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>() + 1));
240 TEST_EXPECTED_VALUE(2, (CheckedNumeric<Dst>(1) + 1)); 242 TEST_EXPECTED_VALUE(2, (CheckedNumeric<Dst>(1) + 1));
241 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) + 1)); 243 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) + 1));
242 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::min()) + 1); 244 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::min()) + 1);
243 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) + 245 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) +
244 DstLimits::max()); 246 DstLimits::max());
245 247
246 // Generic subtraction. 248 // Generic subtraction.
247 TEST_EXPECTED_VALUE(-1, (CheckedNumeric<Dst>() - 1)); 249 TEST_EXPECTED_VALUE(-1, (CheckedNumeric<Dst>() - 1));
248 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(1) - 1)); 250 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(1) - 1));
249 TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) - 1)); 251 TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) - 1));
250 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) - 1); 252 TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) - 1);
251 253
252 // Generic multiplication. 254 // Generic multiplication.
253 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>() * 1)); 255 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>() * 1));
254 TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>(1) * 1)); 256 TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>(1) * 1));
255 TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) * 2));
256 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * 0)); 257 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * 0));
257 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) * 0)); 258 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) * 0));
258 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * -1)); 259 TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * -1));
259 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) * 260 TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) *
260 DstLimits::max()); 261 DstLimits::max());
262 if (DstLimits::is_signed) {
263 TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) * 2));
264 }
261 265
262 // Generic division. 266 // Generic division.
263 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() / 1); 267 TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() / 1);
264 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) / 1); 268 TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) / 1);
265 TEST_EXPECTED_VALUE(DstLimits::min() / 2, 269 TEST_EXPECTED_VALUE(DstLimits::min() / 2,
266 CheckedNumeric<Dst>(DstLimits::min()) / 2); 270 CheckedNumeric<Dst>(DstLimits::min()) / 2);
267 TEST_EXPECTED_VALUE(DstLimits::max() / 2, 271 TEST_EXPECTED_VALUE(DstLimits::max() / 2,
268 CheckedNumeric<Dst>(DstLimits::max()) / 2); 272 CheckedNumeric<Dst>(DstLimits::max()) / 2);
269 273
270 TestSpecializedArithmetic<Dst>(dst, line); 274 TestSpecializedArithmetic<Dst>(dst, line);
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 755
752 CheckedNumeric<int> too_large = std::numeric_limits<int>::max(); 756 CheckedNumeric<int> too_large = std::numeric_limits<int>::max();
753 EXPECT_TRUE(too_large.IsValid()); 757 EXPECT_TRUE(too_large.IsValid());
754 too_large += d; 758 too_large += d;
755 EXPECT_FALSE(too_large.IsValid()); 759 EXPECT_FALSE(too_large.IsValid());
756 too_large -= d; 760 too_large -= d;
757 EXPECT_FALSE(too_large.IsValid()); 761 EXPECT_FALSE(too_large.IsValid());
758 too_large /= d; 762 too_large /= d;
759 EXPECT_FALSE(too_large.IsValid()); 763 EXPECT_FALSE(too_large.IsValid());
760 } 764 }
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