diff options
author | Upstream <upstream-import@none> | 1970-01-12 13:46:40 +0000 |
---|---|---|
committer | Upstream <upstream-import@none> | 1970-01-12 13:46:40 +0000 |
commit | 4fd37285a5ca04b18307255139e71603f55fd2fd (patch) | |
tree | 332211803080e7a91a190b8480bdec091d3939f4 /src | |
download | safe-iop-4fd37285a5ca04b18307255139e71603f55fd2fd.tar.gz |
external/safe-iop 0.3.1upstream/0.3.1
Diffstat (limited to 'src')
-rw-r--r-- | src/safe_iop.c | 1177 |
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..adbe37c --- /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 Google Inc, 2008. + * + * 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 |