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

Side by Side Diff: base/numerics/safe_math.h

Issue 2528243002: Fix silent truncations when extracting values from CheckedNumeric (Closed)
Patch Set: compile cleanup and fix Created 4 years 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 #ifndef BASE_NUMERICS_SAFE_MATH_H_ 5 #ifndef BASE_NUMERICS_SAFE_MATH_H_
6 #define BASE_NUMERICS_SAFE_MATH_H_ 6 #define BASE_NUMERICS_SAFE_MATH_H_
7 7
8 #include <stddef.h> 8 #include <stddef.h>
9 9
10 #include <limits> 10 #include <limits>
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 124
125 // ValueOrDie() - The primary accessor for the underlying value. If the 125 // ValueOrDie() - The primary accessor for the underlying value. If the
126 // current state is not valid it will CHECK and crash. 126 // current state is not valid it will CHECK and crash.
127 // A range checked destination type can be supplied using the Dst template 127 // A range checked destination type can be supplied using the Dst template
128 // parameter, which will trigger a CHECK if the value is not in bounds for 128 // parameter, which will trigger a CHECK if the value is not in bounds for
129 // the destination. 129 // the destination.
130 // The CHECK behavior can be overridden by supplying a handler as a 130 // The CHECK behavior can be overridden by supplying a handler as a
131 // template parameter, for test code, etc. However, the handler cannot access 131 // template parameter, for test code, etc. However, the handler cannot access
132 // the underlying value, and it is not available through other means. 132 // the underlying value, and it is not available through other means.
133 template <typename Dst = T, class CheckHandler = CheckOnFailure> 133 template <typename Dst = T, class CheckHandler = CheckOnFailure>
134 constexpr Dst ValueOrDie() const { 134 constexpr StrictNumeric<Dst> ValueOrDie() const {
135 return IsValid<Dst>() ? state_.value() 135 return IsValid<Dst>() ? static_cast<Dst>(state_.value())
136 : CheckHandler::template HandleFailure<Dst>(); 136 : CheckHandler::template HandleFailure<Dst>();
137 } 137 }
138 138
139 // ValueOrDefault(T default_value) - A convenience method that returns the 139 // ValueOrDefault(T default_value) - A convenience method that returns the
140 // current value if the state is valid, and the supplied default_value for 140 // current value if the state is valid, and the supplied default_value for
141 // any other state. 141 // any other state.
142 // A range checked destination type can be supplied using the Dst template 142 // A range checked destination type can be supplied using the Dst template
143 // parameter. WARNING: This function may fail to compile or CHECK at runtime 143 // parameter. WARNING: This function may fail to compile or CHECK at runtime
144 // if the supplied default_value is not within range of the destination type. 144 // if the supplied default_value is not within range of the destination type.
145 template <typename Dst = T, typename Src> 145 template <typename Dst = T, typename Src>
146 constexpr Dst ValueOrDefault(const Src default_value) const { 146 constexpr StrictNumeric<Dst> ValueOrDefault(const Src default_value) const {
147 return IsValid<Dst>() ? state_.value() : checked_cast<Dst>(default_value); 147 return IsValid<Dst>() ? static_cast<Dst>(state_.value())
148 : checked_cast<Dst>(default_value);
148 } 149 }
149 150
150 // ValueFloating() - Since floating point values include their validity state, 151 // ValueFloating() - Since floating point values include their validity state,
151 // we provide an easy method for extracting them directly, without a risk of 152 // we provide an easy method for extracting them directly, without a risk of
152 // crashing on a CHECK. 153 // crashing on a CHECK.
153 // A range checked destination type can be supplied using the Dst template 154 // A range checked destination type can be supplied using the Dst template
154 // parameter. 155 // parameter.
155 template <typename Dst = T> 156 template <typename Dst = T>
156 constexpr Dst ValueFloating() const { 157 constexpr StrictNumeric<Dst> ValueFloating() const {
157 static_assert(std::numeric_limits<T>::is_iec559, 158 static_assert(std::numeric_limits<T>::is_iec559,
158 "Type must be floating point."); 159 "Type must be floating point.");
159 static_assert(std::numeric_limits<Dst>::is_iec559, 160 static_assert(std::numeric_limits<Dst>::is_iec559,
160 "Type must be floating point."); 161 "Type must be floating point.");
161 return static_cast<Dst>(state_.value()); 162 return static_cast<Dst>(state_.value());
162 } 163 }
163 164
164 // Returns a checked numeric of the specified type, cast from the current 165 // Returns a checked numeric of the specified type, cast from the current
165 // CheckedNumeric. If the current state is invalid or the destination cannot 166 // CheckedNumeric. If the current state is invalid or the destination cannot
166 // represent the result then the returned CheckedNumeric will be invalid. 167 // represent the result then the returned CheckedNumeric will be invalid.
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 using internal::CheckMod; 406 using internal::CheckMod;
406 using internal::CheckLsh; 407 using internal::CheckLsh;
407 using internal::CheckRsh; 408 using internal::CheckRsh;
408 using internal::CheckAnd; 409 using internal::CheckAnd;
409 using internal::CheckOr; 410 using internal::CheckOr;
410 using internal::CheckXor; 411 using internal::CheckXor;
411 412
412 } // namespace base 413 } // namespace base
413 414
414 #endif // BASE_NUMERICS_SAFE_MATH_H_ 415 #endif // BASE_NUMERICS_SAFE_MATH_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698