1 #ifndef LIGHTNING_COMMON_OVERFLOWS_H
2 #define LIGHTNING_COMMON_OVERFLOWS_H
3 #include "config.h"
4 #include <ccan/short_types/short_types.h>
5 
add_overflows_size_t(uint64_t a,uint64_t b)6 static inline bool add_overflows_size_t(uint64_t a, uint64_t b)
7 {
8 	return (size_t)a != a || (size_t)b != b || (a + b) < (size_t)a;
9 }
10 
add_overflows_u64(uint64_t a,uint64_t b)11 static inline bool add_overflows_u64(uint64_t a, uint64_t b)
12 {
13 	return (a + b) < a;
14 }
15 
mul_overflows_u64(uint64_t a,uint64_t b)16 static inline bool mul_overflows_u64(uint64_t a, uint64_t b)
17 {
18 	uint64_t ret;
19 
20 	if (a == 0)
21 		return false;
22 	ret = a * b;
23 	return (ret / a != b);
24 }
25 
assign_overflow_u8(u8 * dst,uint64_t v)26 static inline bool assign_overflow_u8(u8 *dst, uint64_t v)
27 {
28 	*dst = v;
29 	return *dst == v;
30 }
31 
assign_overflow_u16(u16 * dst,uint64_t v)32 static inline bool assign_overflow_u16(u16 *dst, uint64_t v)
33 {
34 	*dst = v;
35 	return *dst == v;
36 }
37 
assign_overflow_u32(u32 * dst,uint64_t v)38 static inline bool assign_overflow_u32(u32 *dst, uint64_t v)
39 {
40 	*dst = v;
41 	return *dst == v;
42 }
43 #endif /* LIGHTNING_COMMON_OVERFLOWS_H */
44