2#ifndef __LINUX_OVERFLOW_H
3#define __LINUX_OVERFLOW_H
6#include <linux/limits.h>
33#define __type_half_max(type) ((type)1 << (8*sizeof(type) - 1 - is_signed_type(type)))
34#define __type_max(T) ((T)((__type_half_max(T) - 1) + __type_half_max(T)))
35#define type_max(t) __type_max(typeof(t))
36#define __type_min(T) ((T)((T)-type_max(T)-(T)1))
37#define type_min(t) __type_min(typeof(t))
61#define check_add_overflow(a, b, d) \
62 __must_check_overflow(__builtin_add_overflow(a, b, d))
73#define wrapping_add(type, a, b) \
76 __builtin_add_overflow(a, b, &__val); \
90#define wrapping_assign_add(var, offset) \
92 typeof(var) *__ptr = &(var); \
93 *__ptr = wrapping_add(typeof(var), *__ptr, offset); \
107#define check_sub_overflow(a, b, d) \
108 __must_check_overflow(__builtin_sub_overflow(a, b, d))
119#define wrapping_sub(type, a, b) \
122 __builtin_sub_overflow(a, b, &__val); \
136#define wrapping_assign_sub(var, offset) \
138 typeof(var) *__ptr = &(var); \
139 *__ptr = wrapping_sub(typeof(var), *__ptr, offset); \
153#define check_mul_overflow(a, b, d) \
154 __must_check_overflow(__builtin_mul_overflow(a, b, d))
165#define wrapping_mul(type, a, b) \
168 __builtin_mul_overflow(a, b, &__val); \
192#define check_shl_overflow(a, s, d) __must_check_overflow(({ \
196 unsigned long long _a_full = _a; \
197 unsigned int _to_shift = \
198 _s >= 0 && _s < 8 * sizeof(*d) ? _s : 0; \
199 *_d = (_a_full << _to_shift); \
200 (_to_shift != _s || *_d < 0 || _a < 0 || \
201 (*_d >> _to_shift) != _a); \
204#define __overflows_type_constexpr(x, T) ( \
205 is_unsigned_type(typeof(x)) ? \
206 (x) > type_max(T) : \
207 is_unsigned_type(typeof(T)) ? \
208 (x) < 0 || (x) > type_max(T) : \
209 (x) < type_min(T) || (x) > type_max(T))
211#define __overflows_type(x, T) ({ \
213 check_add_overflow((x), v, &v); \
230#define overflows_type(n, T) \
231 __builtin_choose_expr(__is_constexpr(n), \
232 __overflows_type_constexpr(n, T), \
233 __overflows_type(n, T))
247#define range_overflows(start, size, max) ({ \
248 typeof(start) start__ = (start); \
249 typeof(size) size__ = (size); \
250 typeof(max) max__ = (max); \
251 (void)(&start__ == &size__); \
252 (void)(&start__ == &max__); \
253 start__ >= max__ || size__ > max__ - start__; \
267#define range_overflows_t(type, start, size, max) \
268 range_overflows((type)(start), (type)(size), (type)(max))
282#define range_end_overflows(start, size, max) ({ \
283 typeof(start) start__ = (start); \
284 typeof(size) size__ = (size); \
285 typeof(max) max__ = (max); \
286 (void)(&start__ == &size__); \
287 (void)(&start__ == &max__); \
288 start__ > max__ || size__ > max__ - start__; \
302#define range_end_overflows_t(type, start, size, max) \
303 range_end_overflows((type)(start), (type)(size), (type)(max))
316#define castable_to_type(n, T) \
317 __builtin_choose_expr(__is_constexpr(n), \
318 !__overflows_type_constexpr(n, T), \
391#define array_size(a, b) size_mul(a, b)
404#define array3_size(a, b, c) size_mul(size_mul(a, b), c)
418#define flex_array_size(p, member, count) \
419 __builtin_choose_expr(__is_constexpr(count), \
420 (count) * sizeof(*(p)->member) + __must_be_array((p)->member), \
421 size_mul(count, sizeof(*(p)->member) + __must_be_array((p)->member)))
434#define struct_size(p, member, count) \
435 __builtin_choose_expr(__is_constexpr(count), \
436 sizeof(*(p)) + flex_array_size(p, member, count), \
437 size_add(sizeof(*(p)), flex_array_size(p, member, count)))
452#define struct_size_t(type, member, count) \
453 struct_size((type *)NULL, member, count)
465#define struct_offset(p, member) (offsetof(typeof(*(p)), member))
477#define __DEFINE_FLEX(type, name, member, count, trailer...) \
478 _Static_assert(__builtin_constant_p(count), \
479 "onstack flex array members require compile-time const count"); \
481 u8 bytes[struct_size_t(type, member, count)]; \
483 } name##_u trailer; \
484 type *name = (type *)&name##_u
496#define _DEFINE_FLEX(type, name, member, count, initializer...) \
497 __DEFINE_FLEX(type, name, member, count, = { .obj initializer })
515#define DEFINE_RAW_FLEX(type, name, member, count) \
516 __DEFINE_FLEX(type, name, member, count, = { })
535#define DEFINE_FLEX(TYPE, NAME, MEMBER, COUNTER, COUNT) \
536 _DEFINE_FLEX(TYPE, NAME, MEMBER, COUNT, = { .COUNTER = COUNT, })
545#define STACK_FLEX_ARRAY_SIZE(name, array) \
546 (__member_size((name)->array) / sizeof(*(name)->array) + \
547 __must_be_array((name)->array))
556#define typeof_flex_counter(FAM) \
557 typeof(_Generic(__flex_counter(FAM), \
559 default: *__flex_counter(FAM)))
572#define overflows_flex_counter_type(TYPE, FAM, COUNT) \
573 (overflows_type(COUNT, typeof_flex_counter(((TYPE *)NULL)->FAM)))
584#define __set_flex_counter(FAM, COUNT) \
586 *_Generic(__flex_counter(FAM), \
587 void *: &(size_t){ 0 }, \
588 default: __flex_counter(FAM)) = (COUNT); \
#define SIZE_MAX
Definition limits.h:9
#define unlikely(x)
Definition compiler.h:30
#define __must_check
Definition compiler.h:114
#define __always_inline
Definition compiler_attributes.h:55
#define check_sub_overflow(a, b, d)
Definition overflow.h:107
#define check_mul_overflow(a, b, d)
Definition overflow.h:153
#define check_add_overflow(a, b, d)
Definition overflow.h:61