overflow: Allow non-type arg to type_max() and type_min()
PATCH 1/1 overflow: Allow non-type arg to type_max() and type_min()
A common use of type_max() is to find the max for the type of a variable. Using the pattern type_max(typeof(var)) is needlessly verbose. Instead, since typeof(type) == type we can just explicitly call typeof() on the argument to type_max() and type_min(). Add wrappers for readability.
We can do some replacements right away:
$ git grep '\btype_\(min\|max\)(typeof' | wc -l 11
Signed-off-by Kees Cook <[email protected]>
---
Cc: Rasmus Villemoes <[email protected]>
Cc: "Gustavo A. R. Silva" <[email protected]>
Cc: [email protected]
--- include/linux/overflow.h | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
include/linux/overflow.h +7 -5
@@ -31,8 +31,10 @@* credit to Christian Biere. */ #define __type_half_max (type) ((type)1 << (8*sizeof(type) - 1 - is_signed_type(type))) -#define type_max (T ) ((T)((__type_half_max(T) - 1) + __type_half_max(T))) -#define type_min (T ) ((T)((T)-type_max(T)-(T)1)) +#define __type_max (T ) ((T)((__type_half_max(T) - 1) + __type_half_max(T))) +#define type_max (t) __type_max(typeof(t)) +#define __type_min (T ) ((T)((T)-type_max(T)-(T)1)) +#define type_min (t) __type_min(typeof(t))/* * Avoids triggering -Wtype-limits compilation warning,
@@ -207,10 +209,10 @@ static inline bool __must_check __must_check_overflow(bool overflow)#define __overflows_type_constexpr (x,T ) ( \ is_unsigned_type(typeof(x)) ? \ - (x) > type_max(typeof(T)) : \ + (x) > type_max(T) : \ is_unsigned_type(typeof(T)) ? \ - (x) < 0 || (x) > type_max(typeof(T)) : \ - (x) < type_min(typeof(T)) || (x) > type_max(typeof(T))) + (x) < 0 || (x) > type_max(T) : \ + (x) < type_min(T) || (x) > type_max(T))#define __overflows_type (x,T ) ({ \ typeof(T) v = 0; \
Signature · 1 line
2.34.1