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