summaryrefslogtreecommitdiff
path: root/src/safe_iop.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/safe_iop.c')
-rw-r--r--src/safe_iop.c1177
1 files changed, 1177 insertions, 0 deletions
diff --git a/src/safe_iop.c b/src/safe_iop.c
new file mode 100644
index 0000000..1c8943b
--- /dev/null
+++ b/src/safe_iop.c
@@ -0,0 +1,1177 @@
+/* safe_iop
+ * License:: released in to the public domain
+ * Author:: Will Drewry <redpig@dataspill.org>
+ * Copyright 2007,2008 redpig@dataspill.org
+ * Some portions copyright The Android Open Source Project
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+ * OF ANY KIND, either express or implied.
+ *
+ * See safe_iop.h for more info.
+ */
+#include <stdint.h>
+#include <stdarg.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include <safe_iop.h>
+
+/* Read off the type if the first value matches a type prefix
+ * and consume characters if successful.
+ */
+static int _safe_op_read_type(safe_type_t *type, const char **c) {
+ if (type == NULL) {
+ return 0;
+ }
+ if (c == NULL || *c == NULL || **c == '\0') {
+ return 0;
+ }
+ /* Extract a type for the operation if there is one */
+ if (strchr(SAFE_IOP_TYPE_PREFIXES, **c) != NULL) {
+ switch(**c) {
+ case 'u':
+ if ((*(*c+1) && *(*c+1) == '3') &&
+ (*(*c+2) && *(*c+2) == '2')) {
+ *type = SAFE_IOP_TYPE_U32;
+ *c += 3; /* Advance past type */
+ }
+ break;
+ case 's':
+ if ((*(*c+1) && *(*c+1) == '3') &&
+ (*(*c+2) && *(*c+2) == '2')) {
+ *type = SAFE_IOP_TYPE_S32;
+ *c += 3; /* Advance past type */
+ }
+ break;
+ default:
+ /* Unknown type */
+ return 0;
+ }
+ }
+ return 1;
+}
+
+#define _SAFE_IOP_TYPE_CASE(_type, _func) { \
+ _type a = va_arg(ap, _type), value = *((_type *) result); \
+ if (!baseline) { \
+ value = a; \
+ a = va_arg(ap, _type); \
+ baseline = 1; \
+ } \
+ if (! _func( (_type *) result, value, a)) \
+ return 0; \
+}
+#define _SAFE_IOP_OP_CASE(u32func, s32func) \
+ switch (type) { \
+ case SAFE_IOP_TYPE_U32: \
+ _SAFE_IOP_TYPE_CASE(u_int32_t, u32func); \
+ break; \
+ case SAFE_IOP_TYPE_S32: \
+ _SAFE_IOP_TYPE_CASE(int32_t, s32func); \
+ break; \
+ default: \
+ return 0; \
+ }
+
+int safe_iopf(void *result, const char *const fmt, ...) {
+ va_list ap;
+ int baseline = 0; /* indicates if the base value is present */
+
+ const char *c = NULL;
+ safe_type_t type = SAFE_IOP_TYPE_DEFAULT;
+ /* Result should not be NULL */
+ if (!result)
+ return 0;
+
+ va_start(ap, fmt);
+ if (fmt == NULL || fmt[0] == '\0')
+ return 0;
+ for(c=fmt;(*c);c++) {
+ /* Read the type if specified */
+ if (!_safe_op_read_type(&type, &c)) {
+ return 0;
+ }
+
+ /* Process the the operations */
+ switch(*c) { /* operation */
+ case '+': /* add */
+ _SAFE_IOP_OP_CASE(safe_uadd, safe_sadd);
+ break;
+ case '-': /* sub */
+ _SAFE_IOP_OP_CASE(safe_usub, safe_ssub);
+ break;
+ case '*': /* mul */
+ _SAFE_IOP_OP_CASE(safe_umul, safe_smul);
+ break;
+ case '/': /* div */
+ _SAFE_IOP_OP_CASE(safe_udiv, safe_sdiv);
+ break;
+ case '%': /* mod */
+ _SAFE_IOP_OP_CASE(safe_umod, safe_smod);
+ break;
+ default:
+ /* unknown op */
+ return 0;
+ }
+ /* Reset the type */
+ type = SAFE_IOP_TYPE_DEFAULT;
+ }
+ /* Success! */
+ return 1;
+}
+
+#ifdef SAFE_IOP_TEST
+#include <stdio.h>
+#include <stdint.h>
+#include <limits.h>
+
+/* __LP64__ is given by GCC. Without more work, this is bound to GCC. */
+#if __LP64__ == 1 || __SIZEOF_LONG__ > __SIZEOF_INT__
+# define SAFE_INT64_MAX 0x7fffffffffffffffL
+# define SAFE_UINT64_MAX 0xffffffffffffffffUL
+# define SAFE_INT64_MIN (-SAFE_INT64_MAX - 1L)
+#elif __SIZEOF_LONG__ == __SIZEOF_INT__
+# define SAFE_INT64_MAX 0x7fffffffffffffffLL
+# define SAFE_UINT64_MAX 0xffffffffffffffffULL
+# define SAFE_INT64_MIN (-SAFE_INT64_MAX - 1LL)
+#else
+# warning "64-bit support disabled"
+# define SAFE_IOP_NO_64 1
+#endif
+
+/* Pull these from GNU's limit.h */
+#ifndef LLONG_MAX
+# define LLONG_MAX 9223372036854775807LL
+#endif
+#ifndef LLONG_MIN
+# define LLONG_MIN (-LLONG_MAX - 1LL)
+#endif
+#ifndef ULLONG_MAX
+# define ULLONG_MAX 18446744073709551615ULL
+#endif
+
+/* Assumes SSIZE_MAX */
+#ifndef SSIZE_MIN
+# if SSIZE_MAX == LONG_MAX
+# define SSIZE_MIN LONG_MIN
+# elif SSIZE_MAX == LONG_LONG_MAX
+# define SSIZE_MIN LONG_LONG_MIN
+# else
+# error "SSIZE_MIN is not defined and could not be guessed"
+# endif
+#endif
+
+#define EXPECT_FALSE(cmd) ({ \
+ printf("%s: EXPECT_FALSE(" #cmd ") => ", __func__); \
+ if ((cmd) != 0) { printf(" FAILED\n"); expect_fail++; r = 0; } \
+ else { printf(" PASSED\n"); expect_succ++; } \
+ expect++; \
+ })
+#define EXPECT_TRUE(cmd) ({ \
+ printf("%s: EXPECT_TRUE(" #cmd ") => ", __func__); \
+ if ((cmd) != 1) { printf(" FAILED\n"); expect_fail++; r = 0; } \
+ else { printf(" PASSED\n"); expect_succ++; } \
+ expect++; \
+ })
+
+static int expect = 0, expect_succ = 0, expect_fail = 0;
+
+/***** ADD *****/
+int T_add_s8() {
+ int r=1;
+ int8_t a, b;
+ a=SCHAR_MIN; b=-1; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=SCHAR_MAX; b=1; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=-10; b=-11; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=SCHAR_MIN; b=SCHAR_MAX; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=SCHAR_MIN+1; b=-1; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=SCHAR_MAX/2; b=SCHAR_MAX/2; EXPECT_TRUE(safe_add(NULL, a, b));
+ return r;
+}
+
+int T_add_s16() {
+ int r=1;
+ int16_t a, b;
+ a=SHRT_MIN; b=-1; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=SHRT_MAX; b=1; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=SHRT_MIN; b=SHRT_MAX; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=SHRT_MAX/2; b=SHRT_MAX/2; EXPECT_TRUE(safe_add(NULL, a, b));
+ return r;
+}
+
+int T_add_s32() {
+ int r=1;
+ int32_t a, b;
+ a=INT_MIN; b=-1; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=INT_MAX; b=1; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=INT_MIN; b=INT_MAX; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=INT_MAX/2; b=INT_MAX/2; EXPECT_TRUE(safe_add(NULL, a, b));
+ return r;
+}
+
+int T_add_s64() {
+ int r=1;
+ int64_t a, b;
+ a=SAFE_INT64_MIN; b=-1; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=SAFE_INT64_MAX; b=1; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=SAFE_INT64_MIN; b=SAFE_INT64_MAX; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=SAFE_INT64_MAX/2; b=SAFE_INT64_MAX/2; EXPECT_TRUE(safe_add(NULL, a, b));
+ return r;
+}
+
+int T_add_long() {
+ int r=1;
+ long a, b;
+ a=LONG_MIN; b=-1; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=LONG_MAX; b=1; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=LONG_MIN; b=LONG_MAX; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=LONG_MAX/2; b=LONG_MAX/2; EXPECT_TRUE(safe_add(NULL, a, b));
+ return r;
+}
+int T_add_longlong() {
+ int r=1;
+ long long a, b;
+ a=LLONG_MIN; b=-1; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=LLONG_MAX; b=1; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=LLONG_MIN; b=LLONG_MAX; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=LLONG_MAX/2; b=LLONG_MAX/2; EXPECT_TRUE(safe_add(NULL, a, b));
+ return r;
+}
+int T_add_ssizet() {
+ int r=1;
+ ssize_t a, b;
+ a=SSIZE_MIN; b=-1; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=SSIZE_MAX; b=1; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=SSIZE_MIN; b=SSIZE_MAX; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=SSIZE_MAX/2; b=SSIZE_MAX/2; EXPECT_TRUE(safe_add(NULL, a, b));
+ return r;
+}
+
+int T_add_u8() {
+ int r=1;
+ uint8_t a, b;
+ a=1; b=UCHAR_MAX; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=UCHAR_MAX/2; b=a+2; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=UCHAR_MAX/2; b=a; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=UCHAR_MAX/2; b=a+1; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=0; b=UCHAR_MAX; EXPECT_TRUE(safe_add(NULL, a, b));
+ return r;
+}
+
+int T_add_u16() {
+ int r=1;
+ uint16_t a, b;
+ a=1; b=USHRT_MAX; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=USHRT_MAX/2; b=a+2; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=USHRT_MAX/2; b=a; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=USHRT_MAX/2; b=a+1; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=0; b=USHRT_MAX; EXPECT_TRUE(safe_add(NULL, a, b));
+ return r;
+}
+
+int T_add_u32() {
+ int r=1;
+ uint32_t a, b;
+ a=1; b=UINT_MAX; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=UINT_MAX/2; b=a+2; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=UINT_MAX/2; b=a; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=UINT_MAX/2; b=a+1; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=0; b=UINT_MAX; EXPECT_TRUE(safe_add(NULL, a, b));
+ return r;
+}
+
+int T_add_u64() {
+ int r=1;
+ uint64_t a, b;
+ a=1; b=SAFE_UINT64_MAX; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=SAFE_UINT64_MAX/2; b=a+2; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=SAFE_UINT64_MAX/2; b=a; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=SAFE_UINT64_MAX/2; b=a+1; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=0; b=SAFE_UINT64_MAX; EXPECT_TRUE(safe_add(NULL, a, b));
+ return r;
+}
+
+int T_add_ulong() {
+ int r=1;
+ unsigned long a, b;
+ a=1; b=ULONG_MAX; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=ULONG_MAX/2; b=a+2; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=ULONG_MAX/2; b=a; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=ULONG_MAX/2; b=a+1; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=0; b=ULONG_MAX; EXPECT_TRUE(safe_add(NULL, a, b));
+ return r;
+}
+
+int T_add_ulonglong() {
+ int r=1;
+ unsigned long long a, b;
+ a=1; b=ULLONG_MAX; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=ULLONG_MAX/2; b=a+2; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=ULLONG_MAX/2; b=a; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=ULLONG_MAX/2; b=a+1; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=0; b=ULLONG_MAX; EXPECT_TRUE(safe_add(NULL, a, b));
+ return r;
+}
+
+int T_add_sizet() {
+ int r=1;
+ size_t a, b;
+ a=1; b=SIZE_MAX; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=SIZE_MAX/2; b=a+2; EXPECT_FALSE(safe_add(NULL, a, b));
+ a=SIZE_MAX/2; b=a; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=SIZE_MAX/2; b=a+1; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b));
+ a=0; b=SIZE_MAX; EXPECT_TRUE(safe_add(NULL, a, b));
+ return r;
+}
+
+int T_add_mixed() {
+ int r=1;
+ int8_t a = 1;
+ uint8_t b = 2;
+ uint16_t c = 3;
+ EXPECT_FALSE(safe_add(NULL, a, b));
+ EXPECT_FALSE(safe_add(NULL, b, c));
+ EXPECT_FALSE(safe_add(NULL, a, c));
+ EXPECT_FALSE(safe_add3(NULL, a, b, c));
+ return r;
+}
+
+int T_add_increment() {
+ int r=1;
+ uint16_t a = 1, b = 2, c = 0, d[2]= {0};
+ uint16_t *cur = d;
+ EXPECT_TRUE(safe_add(cur++, a++, b));
+ EXPECT_TRUE(cur == &d[1]);
+ EXPECT_TRUE(d[0] == 3);
+ EXPECT_TRUE(a == 2);
+ a = 1; b = 2; c = 1; cur=d;d[0] = 0;
+ EXPECT_TRUE(safe_add3(cur++, a++, b++, c));
+ EXPECT_TRUE(d[0] == 4);
+ EXPECT_TRUE(cur == &d[1]);
+ EXPECT_TRUE(a == 2);
+ EXPECT_TRUE(b == 3);
+ EXPECT_TRUE(c == 1);
+ return r;
+}
+
+
+
+/***** SUB *****/
+int T_sub_s8() {
+ int r=1;
+ int8_t a, b;
+ a=SCHAR_MIN; b=1; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=SCHAR_MIN; b=SCHAR_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=SCHAR_MIN/2; b=SCHAR_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=-2; b=SCHAR_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=SCHAR_MAX; b=SCHAR_MAX; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=2; b=10; EXPECT_TRUE(safe_sub(NULL, a, b));
+ return r;
+}
+
+int T_sub_s16() {
+ int r=1;
+ int16_t a, b;
+ a=SHRT_MIN; b=1; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=SHRT_MIN; b=SHRT_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=SHRT_MIN/2; b=SHRT_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=-2; b=SHRT_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=SHRT_MAX; b=SHRT_MAX; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=2; b=10; EXPECT_TRUE(safe_sub(NULL, a, b));
+ return r;
+}
+
+int T_sub_s32() {
+ int r=1;
+ int32_t a, b;
+ a=INT_MIN; b=1; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=INT_MIN; b=INT_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=INT_MIN/2; b=INT_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=-2; b=INT_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=INT_MAX; b=INT_MAX; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=2; b=10; EXPECT_TRUE(safe_sub(NULL, a, b));
+ return r;
+}
+
+int T_sub_s64() {
+ int r=1;
+ int64_t a, b;
+ a=SAFE_INT64_MIN; b=1; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=SAFE_INT64_MIN; b=SAFE_INT64_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=SAFE_INT64_MIN/2; b=SAFE_INT64_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=-2; b=SAFE_INT64_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=SAFE_INT64_MAX; b=SAFE_INT64_MAX; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=2; b=10; EXPECT_TRUE(safe_sub(NULL, a, b));
+ return r;
+}
+
+int T_sub_long() {
+ int r=1;
+ long a, b;
+ a=LONG_MIN; b=1; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=LONG_MIN; b=LONG_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=LONG_MIN/2; b=LONG_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=-2; b=LONG_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=LONG_MAX; b=LONG_MAX; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=2; b=10; EXPECT_TRUE(safe_sub(NULL, a, b));
+ return r;
+}
+
+int T_sub_longlong() {
+ int r=1;
+ long long a, b;
+ a=LLONG_MIN; b=1; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=LLONG_MIN; b=LLONG_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=LLONG_MIN/2; b=LLONG_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=-2; b=LLONG_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=LLONG_MAX; b=LLONG_MAX; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=2; b=10; EXPECT_TRUE(safe_sub(NULL, a, b));
+ return r;
+}
+
+int T_sub_ssizet() {
+ int r=1;
+ ssize_t a, b;
+ a=SSIZE_MIN; b=1; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=SSIZE_MIN; b=SSIZE_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=SSIZE_MIN/2; b=SSIZE_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=-2; b=SSIZE_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=SSIZE_MAX; b=SSIZE_MAX; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=2; b=10; EXPECT_TRUE(safe_sub(NULL, a, b));
+ return r;
+}
+
+int T_sub_u8() {
+ int r=1;
+ uint8_t a, b;
+ a=0; b=UCHAR_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=UCHAR_MAX-1; b=UCHAR_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=UCHAR_MAX; b=UCHAR_MAX; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=1; b=100; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=100; b=0; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=0; b=0; EXPECT_TRUE(safe_sub(NULL, a, b));
+ return r;
+}
+
+int T_sub_u16() {
+ int r=1;
+ uint16_t a, b;
+ a=0; b=USHRT_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=USHRT_MAX-1; b=USHRT_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=USHRT_MAX; b=USHRT_MAX; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=1; b=100; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=100; b=0; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=0; b=0; EXPECT_TRUE(safe_sub(NULL, a, b));
+ return r;
+}
+
+int T_sub_u32() {
+ int r=1;
+ uint32_t a, b;
+ a=UINT_MAX-1; b=UINT_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=UINT_MAX; b=UINT_MAX; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=1; b=100; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=100; b=0; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=0; b=0; EXPECT_TRUE(safe_sub(NULL, a, b));
+ return r;
+}
+
+int T_sub_u64() {
+ int r=1;
+ uint64_t a, b;
+ a=SAFE_UINT64_MAX-1; b=SAFE_UINT64_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=SAFE_UINT64_MAX; b=SAFE_UINT64_MAX; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=1; b=100; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=100; b=0; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=0; b=0; EXPECT_TRUE(safe_sub(NULL, a, b));
+ return r;
+}
+
+int T_sub_ulong() {
+ int r=1;
+ unsigned long a, b;
+ a=ULONG_MAX-1; b=ULONG_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=ULONG_MAX; b=ULONG_MAX; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=1; b=100; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=100; b=0; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=0; b=0; EXPECT_TRUE(safe_sub(NULL, a, b));
+ return r;
+}
+
+int T_sub_ulonglong() {
+ int r=1;
+ unsigned long long a, b;
+ a=ULLONG_MAX-1; b=ULLONG_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=ULLONG_MAX; b=ULLONG_MAX; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=1; b=100; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=100; b=0; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=0; b=0; EXPECT_TRUE(safe_sub(NULL, a, b));
+ return r;
+}
+
+int T_sub_sizet() {
+ int r=1;
+ size_t a, b;
+ a=SIZE_MAX-1; b=SIZE_MAX; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=SIZE_MAX; b=SIZE_MAX; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=1; b=100; EXPECT_FALSE(safe_sub(NULL, a, b));
+ a=100; b=0; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b));
+ a=0; b=0; EXPECT_TRUE(safe_sub(NULL, a, b));
+ return r;
+}
+
+/***** MUL *****/
+int T_mul_s8() {
+ int r=1;
+ int8_t a, b;
+ a=SCHAR_MIN; b=-1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SCHAR_MIN; b=-2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SCHAR_MAX; b=SCHAR_MAX; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SCHAR_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SCHAR_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=100; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=SCHAR_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=SCHAR_MIN; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=SCHAR_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=SCHAR_MIN; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ return r;
+}
+
+int T_mul_s16() {
+ int r=1;
+ int16_t a, b;
+ a=SHRT_MIN; b=-1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SHRT_MIN; b=-2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SHRT_MAX; b=SHRT_MAX; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SHRT_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SHRT_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=100; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=SHRT_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=SHRT_MIN; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=SHRT_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=SHRT_MIN; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ return r;
+}
+
+int T_mul_s32() {
+ int r=1;
+ int32_t a, b;
+ a=INT_MIN; b=-1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=INT_MIN; b=-2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=INT_MAX; b=INT_MAX; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=INT_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=INT_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=100; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=INT_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=INT_MIN; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=INT_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=INT_MIN; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ return r;
+}
+
+int T_mul_s64() {
+ int r=1;
+ int64_t a, b;
+ a=SAFE_INT64_MIN; b=-1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SAFE_INT64_MIN; b=-2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SAFE_INT64_MAX; b=SAFE_INT64_MAX; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SAFE_INT64_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SAFE_INT64_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=100; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=SAFE_INT64_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=SAFE_INT64_MIN; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=SAFE_INT64_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=SAFE_INT64_MIN; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ return r;
+}
+
+int T_mul_long() {
+ int r=1;
+ long a, b;
+ a=LONG_MIN; b=-1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=LONG_MIN; b=-2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=LONG_MAX; b=LONG_MAX; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=LONG_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=LONG_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=100; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=LONG_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=LONG_MIN; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=LONG_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=LONG_MIN; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ return r;
+}
+int T_mul_longlong() {
+ int r=1;
+ long long a, b;
+ a=LLONG_MIN; b=-1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=LLONG_MIN; b=-2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=LLONG_MAX; b=LLONG_MAX; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=LLONG_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=LLONG_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=100; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=LLONG_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=LLONG_MIN; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=LLONG_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=LLONG_MIN; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ return r;
+}
+int T_mul_ssizet() {
+ int r=1;
+ ssize_t a, b;
+ a=SSIZE_MIN; b=-1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SSIZE_MIN; b=-2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SSIZE_MAX; b=SSIZE_MAX; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SSIZE_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SSIZE_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=100; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=SSIZE_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=SSIZE_MIN; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=SSIZE_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=SSIZE_MIN; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ return r;
+}
+
+int T_mul_u8() {
+ int r=1;
+ uint8_t a, b;
+ a=UCHAR_MAX-1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=UCHAR_MAX-1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=UCHAR_MAX; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=UCHAR_MAX; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=UCHAR_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=UCHAR_MAX/2+1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=UCHAR_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=UCHAR_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=1; b=UCHAR_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=UCHAR_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=UCHAR_MAX; b=1; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ return r;
+}
+
+int T_mul_u16() {
+ int r=1;
+ uint16_t a, b;
+ a=USHRT_MAX-1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=USHRT_MAX-1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=USHRT_MAX; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=USHRT_MAX; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=USHRT_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=USHRT_MAX/2+1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=USHRT_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=USHRT_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=1; b=USHRT_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=USHRT_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=USHRT_MAX; b=1; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ return r;
+}
+
+int T_mul_u32() {
+ int r=1;
+ uint32_t a, b;
+ a=UINT_MAX-1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=UINT_MAX-1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=UINT_MAX; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=UINT_MAX; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=UINT_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=UINT_MAX/2+1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=UINT_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=UINT_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=1; b=UINT_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=UINT_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=UINT_MAX; b=1; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ return r;
+}
+
+int T_mul_u64() {
+ int r=1;
+ uint64_t a, b;
+ a=SAFE_UINT64_MAX-1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=SAFE_UINT64_MAX-1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SAFE_UINT64_MAX; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=SAFE_UINT64_MAX; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SAFE_UINT64_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=SAFE_UINT64_MAX/2+1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SAFE_UINT64_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=SAFE_UINT64_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=1; b=SAFE_UINT64_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=SAFE_UINT64_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=SAFE_UINT64_MAX; b=1; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ return r;
+}
+
+int T_mul_ulong() {
+ int r=1;
+ unsigned long a, b;
+ a=ULONG_MAX-1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=ULONG_MAX-1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=ULONG_MAX; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=ULONG_MAX; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=ULONG_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=ULONG_MAX/2+1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=ULONG_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=ULONG_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=1; b=ULONG_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=ULONG_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=ULONG_MAX; b=1; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ return r;
+}
+
+int T_mul_ulonglong() {
+ int r=1;
+ unsigned long long a, b;
+ a=ULLONG_MAX-1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=ULLONG_MAX-1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=ULLONG_MAX; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=ULLONG_MAX; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=ULLONG_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=ULLONG_MAX/2+1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=ULLONG_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=ULLONG_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=1; b=ULLONG_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=ULLONG_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=ULLONG_MAX; b=1; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ return r;
+}
+
+int T_mul_sizet() {
+ int r=1;
+ size_t a, b;
+ a=SIZE_MAX-1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=SIZE_MAX-1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SIZE_MAX; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=SIZE_MAX; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SIZE_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=2; b=SIZE_MAX/2+1; EXPECT_FALSE(safe_mul(NULL, a, b));
+ a=SIZE_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=0; b=SIZE_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=1; b=SIZE_MAX; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=SIZE_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=SIZE_MAX; b=1; EXPECT_TRUE(safe_mul(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b));
+ return r;
+}
+
+/***** MOD *****/
+int T_mod_s8() {
+ int r=1;
+ int8_t a, b;
+ a=SCHAR_MIN; b=-1; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b));
+ return r;
+}
+
+int T_mod_s16() {
+ int r=1;
+ int16_t a, b;
+ a=SHRT_MIN; b=-1; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b));
+ return r;
+}
+
+int T_mod_s32() {
+ int r=1;
+ int32_t a, b;
+ a=INT_MIN; b=-1; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b));
+ return r;
+}
+
+int T_mod_s64() {
+ int r=1;
+ int64_t a, b;
+ a=SAFE_INT64_MIN; b=-1; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b));
+ return r;
+}
+
+int T_mod_long() {
+ int r=1;
+ long a, b;
+ a=LONG_MIN; b=-1; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b));
+ return r;
+}
+int T_mod_longlong() {
+ int r=1;
+ long long a, b;
+ a=LLONG_MIN; b=-1LL; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=100LL; b=0LL; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=10LL; b=2LL; EXPECT_TRUE(safe_mod(NULL, a, b));
+ return r;
+}
+int T_mod_ssizet() {
+ int r=1;
+ ssize_t a, b;
+ a=SSIZE_MIN; b=-1; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b));
+ return r;
+}
+
+int T_mod_u8() {
+ int r=1;
+ uint8_t a, b;
+ a=0; b=UCHAR_MAX; EXPECT_TRUE(safe_mod(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b));
+ return r;
+}
+
+int T_mod_u16() {
+ int r=1;
+ uint16_t a, b;
+ a=0; b=USHRT_MAX; EXPECT_TRUE(safe_mod(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b));
+ return r;
+}
+
+int T_mod_u32() {
+ int r=1;
+ uint32_t a, b;
+ a=0; b=UINT_MAX; EXPECT_TRUE(safe_mod(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b));
+ return r;
+}
+
+int T_mod_u64() {
+ int r=1;
+ uint64_t a, b;
+ a=0; b=SAFE_INT64_MAX; EXPECT_TRUE(safe_mod(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b));
+ return r;
+}
+
+int T_mod_ulong() {
+ int r=1;
+ unsigned long a, b;
+ a=0; b=LONG_MAX; EXPECT_TRUE(safe_mod(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b));
+ return r;
+}
+
+int T_mod_ulonglong() {
+ int r=1;
+ unsigned long long a, b;
+ a=0ULL; b=~0ULL; EXPECT_TRUE(safe_mod(NULL, a, b));
+ a=100ULL; b=0ULL; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=10ULL; b=2ULL; EXPECT_TRUE(safe_mod(NULL, a, b));
+ return r;
+}
+
+int T_mod_sizet() {
+ int r=1;
+ size_t a, b;
+ a=0; b=SIZE_MAX; EXPECT_TRUE(safe_mod(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b));
+ return r;
+}
+
+/***** DIV *****/
+int T_div_s8() {
+ int r=1;
+ int8_t a, b;
+ a=SCHAR_MIN; b=-1; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b));
+ return r;
+}
+
+int T_div_s16() {
+ int r=1;
+ int16_t a, b;
+ a=SHRT_MIN; b=-1; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b));
+ return r;
+}
+
+int T_div_s32() {
+ int r=1;
+ int32_t a, b;
+ a=INT_MIN; b=-1; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b));
+ return r;
+}
+
+int T_div_s64() {
+ int r=1;
+ int64_t a, b;
+ a=SAFE_INT64_MIN; b=-1; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b));
+ return r;
+}
+
+int T_div_long() {
+ int r=1;
+ long a, b;
+ a=LONG_MIN; b=-1; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b));
+ return r;
+}
+int T_div_longlong() {
+ int r=1;
+ long long a, b;
+ a=LLONG_MIN; b=-1LL; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=100LL; b=0LL; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=10LL; b=2LL; EXPECT_TRUE(safe_div(NULL, a, b));
+ return r;
+}
+int T_div_ssizet() {
+ int r=1;
+ ssize_t a, b;
+ a=SSIZE_MIN; b=-1; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b));
+ return r;
+}
+
+int T_div_u8() {
+ int r=1;
+ uint8_t a, b;
+ a=0; b=UCHAR_MAX; EXPECT_TRUE(safe_div(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b));
+ return r;
+}
+
+int T_div_u16() {
+ int r=1;
+ uint16_t a, b;
+ a=0; b=USHRT_MAX; EXPECT_TRUE(safe_div(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b));
+ return r;
+}
+
+int T_div_u32() {
+ int r=1;
+ uint32_t a, b;
+ a=0; b=UINT_MAX; EXPECT_TRUE(safe_div(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b));
+ return r;
+}
+
+int T_div_u64() {
+ int r=1;
+ uint64_t a, b;
+ a=0; b=SAFE_INT64_MAX; EXPECT_TRUE(safe_div(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b));
+ return r;
+}
+
+int T_div_ulong() {
+ int r=1;
+ unsigned long a, b;
+ a=0; b=LONG_MAX; EXPECT_TRUE(safe_div(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b));
+ return r;
+}
+
+int T_div_ulonglong() {
+ int r=1;
+ unsigned long long a, b;
+ a=0ULL; b=~0ULL; EXPECT_TRUE(safe_div(NULL, a, b));
+ a=100ULL; b=0ULL; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=10ULL; b=2ULL; EXPECT_TRUE(safe_div(NULL, a, b));
+ return r;
+}
+
+int T_div_sizet() {
+ int r=1;
+ size_t a, b;
+ a=0; b=SIZE_MAX; EXPECT_TRUE(safe_div(NULL, a, b));
+ a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b));
+ a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b));
+ return r;
+}
+
+int T_magic_constants() {
+ int r=1;
+ EXPECT_TRUE(__sio(m)(smin)(((int8_t)0)) == SCHAR_MIN);
+ EXPECT_TRUE(__sio(m)(smax)(((int8_t)0)) == SCHAR_MAX);
+ EXPECT_TRUE(__sio(m)(umax)(((uint8_t)0)) == UCHAR_MAX);
+
+ EXPECT_TRUE(__sio(m)(smin)(((int16_t)0)) == SHRT_MIN);
+ EXPECT_TRUE(__sio(m)(smax)(((int16_t)0)) == SHRT_MAX);
+ EXPECT_TRUE(__sio(m)(umax)(((uint16_t)0)) == USHRT_MAX);
+
+ EXPECT_TRUE(__sio(m)(smin)(((int32_t)0)) == INT_MIN);
+ EXPECT_TRUE(__sio(m)(smax)(((int32_t)0)) == INT_MAX);
+ EXPECT_TRUE(__sio(m)(umax)(((uint32_t)0)) == UINT_MAX);
+
+ EXPECT_TRUE(__sio(m)(smin)(((int64_t)0)) == SAFE_INT64_MIN);
+ EXPECT_TRUE(__sio(m)(smax)(((int64_t)0)) == SAFE_INT64_MAX);
+ EXPECT_TRUE(__sio(m)(umax)(((uint64_t)0)) == SAFE_UINT64_MAX);
+
+ EXPECT_TRUE(__sio(m)(smin)(((ssize_t)0)) == SSIZE_MIN);
+ EXPECT_TRUE(__sio(m)(smax)(((ssize_t)0)) == SSIZE_MAX);
+ EXPECT_TRUE(__sio(m)(umax)(((size_t)0)) == SIZE_MAX);
+
+ EXPECT_TRUE(__sio(m)(smin)(((long)0)) == LONG_MIN);
+ EXPECT_TRUE(__sio(m)(smax)(((long)0)) == LONG_MAX);
+ EXPECT_TRUE(__sio(m)(umax)(((unsigned long)0)) == ULONG_MAX);
+
+ EXPECT_TRUE(__sio(m)(smin)(((long long)0)) == LLONG_MIN);
+ EXPECT_TRUE(__sio(m)(smax)(((long long)0)) == LLONG_MAX);
+ EXPECT_TRUE(__sio(m)(umax)(((unsigned long long)0)) == ULLONG_MAX);
+
+ return r;
+}
+
+
+
+
+int main(int argc, char **argv) {
+ /* test inlines */
+ int tests = 0, succ = 0, fail = 0;
+ tests++; if (T_div_s8()) succ++; else fail++;
+ tests++; if (T_div_s16()) succ++; else fail++;
+ tests++; if (T_div_s32()) succ++; else fail++;
+ tests++; if (T_div_s64()) succ++; else fail++;
+ tests++; if (T_div_long()) succ++; else fail++;
+ tests++; if (T_div_longlong()) succ++; else fail++;
+ tests++; if (T_div_ssizet()) succ++; else fail++;
+ tests++; if (T_div_u8()) succ++; else fail++;
+ tests++; if (T_div_u16()) succ++; else fail++;
+ tests++; if (T_div_u32()) succ++; else fail++;
+ tests++; if (T_div_u64()) succ++; else fail++;
+ tests++; if (T_div_ulong()) succ++; else fail++;
+ tests++; if (T_div_ulonglong()) succ++; else fail++;
+ tests++; if (T_div_sizet()) succ++; else fail++;
+
+ tests++; if (T_mod_s8()) succ++; else fail++;
+ tests++; if (T_mod_s16()) succ++; else fail++;
+ tests++; if (T_mod_s32()) succ++; else fail++;
+ tests++; if (T_mod_s64()) succ++; else fail++;
+ tests++; if (T_mod_long()) succ++; else fail++;
+ tests++; if (T_mod_longlong()) succ++; else fail++;
+ tests++; if (T_mod_ssizet()) succ++; else fail++;
+ tests++; if (T_mod_u8()) succ++; else fail++;
+ tests++; if (T_mod_u16()) succ++; else fail++;
+ tests++; if (T_mod_u32()) succ++; else fail++;
+ tests++; if (T_mod_u64()) succ++; else fail++;
+ tests++; if (T_mod_ulong()) succ++; else fail++;
+ tests++; if (T_mod_ulonglong()) succ++; else fail++;
+ tests++; if (T_mod_sizet()) succ++; else fail++;
+
+ tests++; if (T_mul_s8()) succ++; else fail++;
+ tests++; if (T_mul_s16()) succ++; else fail++;
+ tests++; if (T_mul_s32()) succ++; else fail++;
+ tests++; if (T_mul_s64()) succ++; else fail++;
+ tests++; if (T_mul_long()) succ++; else fail++;
+ tests++; if (T_mul_longlong()) succ++; else fail++;
+ tests++; if (T_mul_ssizet()) succ++; else fail++;
+ tests++; if (T_mul_u8()) succ++; else fail++;
+ tests++; if (T_mul_u16()) succ++; else fail++;
+ tests++; if (T_mul_u32()) succ++; else fail++;
+ tests++; if (T_mul_u64()) succ++; else fail++;
+ tests++; if (T_mul_ulong()) succ++; else fail++;
+ tests++; if (T_mul_ulonglong()) succ++; else fail++;
+ tests++; if (T_mul_sizet()) succ++; else fail++;
+
+ tests++; if (T_sub_s8()) succ++; else fail++;
+ tests++; if (T_sub_s16()) succ++; else fail++;
+ tests++; if (T_sub_s32()) succ++; else fail++;
+ tests++; if (T_sub_s64()) succ++; else fail++;
+ tests++; if (T_sub_long()) succ++; else fail++;
+ tests++; if (T_sub_longlong()) succ++; else fail++;
+ tests++; if (T_sub_ssizet()) succ++; else fail++;
+ tests++; if (T_sub_u8()) succ++; else fail++;
+ tests++; if (T_sub_u16()) succ++; else fail++;
+ tests++; if (T_sub_u32()) succ++; else fail++;
+ tests++; if (T_sub_u64()) succ++; else fail++;
+ tests++; if (T_sub_ulong()) succ++; else fail++;
+ tests++; if (T_sub_ulonglong()) succ++; else fail++;
+ tests++; if (T_sub_sizet()) succ++; else fail++;
+
+ tests++; if (T_add_s8()) succ++; else fail++;
+ tests++; if (T_add_s16()) succ++; else fail++;
+ tests++; if (T_add_s32()) succ++; else fail++;
+ tests++; if (T_add_s64()) succ++; else fail++;
+ tests++; if (T_add_long()) succ++; else fail++;
+ tests++; if (T_add_longlong()) succ++; else fail++;
+ tests++; if (T_add_ssizet()) succ++; else fail++;
+ tests++; if (T_add_u8()) succ++; else fail++;
+ tests++; if (T_add_u16()) succ++; else fail++;
+ tests++; if (T_add_u32()) succ++; else fail++;
+ tests++; if (T_add_u64()) succ++; else fail++;
+ tests++; if (T_add_ulong()) succ++; else fail++;
+ tests++; if (T_add_ulonglong()) succ++; else fail++;
+ tests++; if (T_add_sizet()) succ++; else fail++;
+ tests++; if (T_add_mixed()) succ++; else fail++;
+ tests++; if (T_add_increment()) succ++; else fail++;
+
+ tests++; if (T_magic_constants()) succ++; else fail++;
+
+ printf("%d/%d expects succeeded (%d failures)\n",
+ expect_succ, expect, expect_fail);
+ printf("%d/%d tests succeeded (%d failures)\n", succ, tests, fail);
+ /* TODO: Add tests for safe_iopf when upgraded */
+ return fail;
+}
+#endif