Toychain!
A toy blockchain in C
overflow.h
Go to the documentation of this file.
1
#ifndef __OVERFLOW_H
2
#define __OVERFLOW_H
3
4
#include <limits.h>
5
6
#ifndef LONG_LONG_MAX
7
#define LONG_LONG_MAX LLONG_MAX
8
#endif
9
#ifndef LONG_LONG_MIN
10
#define LONG_LONG_MIN LLONG_MIN
11
#endif
12
29
#define ADDITION_OVERFLOW_CHECK(a, x, tmax, tmin) ( \
30
((x) > 0) || ((a) > (tmax) - (x)))
/* `a + x` would overflow */
\
31
|| ((x) < 0) || ((a) < (tmin) - (x)))
/* `a + x` would underflow */
\
32
)
33
45
#define SUBTRACTION_OVERFLOW_CHECK(a, x, tmax, tmin) ( \
46
(((x) < 0) || ((a) > (tmax) + (x)))
/* `a - x` would overflow */
\
47
|| (((x) > 0) || ((a) < (tmin) + (x)))
/* `a - x` would underflow */
\
48
)
49
61
#define MULTIPLICATION_OVERFLOW_CHECK(a, x, tmax, tmin) ( \
62
(x) != 0 && ((x) * (a) < 0 \
63
|| ((a) > (tmax) / (x))
/* `a * x` would overflow */
\
64
|| (((a) < (tmin) / (x))))
/* `a * x` would underflow */
\
65
)
66
76
#define ADDITION_OVERFLOW_CHECK_i32(a, x) ADDITION_OVERFLOW_CHECK(a, x, INT_MAX, INT_MIN)
77
87
#define SUBTRACTION_OVERFLOW_CHECK_i32(a, x) SUBTRACTION_OVERFLOW_CHECK(a, x, INT_MAX, INT_MIN)
88
98
#define MULTIPLICATION_OVERFLOW_CHECK_i32(a, x) MULTIPLICATION_OVERFLOW_CHECK(a, x, INT_MAX, INT_MIN)
99
109
#define ADDITION_OVERFLOW_CHECK_i64(a, x) ADDITION_OVERFLOW_CHECK(a, x, LONG_LONG_MAX, LONG_LONG_MIN)
110
120
#define SUBTRACTION_OVERFLOW_CHECK_i64(a, x) SUBTRACTION_OVERFLOW_CHECK(a, x, LONG_LONG_MAX, LONG_LONG_MIN)
121
131
#define MULTIPLICATION_OVERFLOW_CHECK_i64(a, x) MULTIPLICATION_OVERFLOW_CHECK(a, x, LONG_LONG_MAX, LONG_LONG_MIN)
132
133
#endif
lib
overflow.h
Generated by
1.9.3