1 /* safe_iop 2 * License:: released in to the public domain 3 * Author:: Will Drewry <redpig (at) dataspill.org> 4 * Copyright 2007,2008 redpig (at) dataspill.org 5 * Some portions copyright The Android Open Source Project 6 * 7 * Unless required by applicable law or agreed to in writing, software 8 * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 9 * OF ANY KIND, either express or implied. 10 * 11 * See safe_iop.h for more info. 12 */ 13 #include <stdint.h> 14 #include <stdarg.h> 15 #include <string.h> 16 #include <sys/types.h> 17 18 #include <safe_iop.h> 19 20 /* Read off the type if the first value matches a type prefix 21 * and consume characters if successful. 22 */ 23 static int _safe_op_read_type(safe_type_t *type, const char **c) { 24 if (type == NULL) { 25 return 0; 26 } 27 if (c == NULL || *c == NULL || **c == '\0') { 28 return 0; 29 } 30 /* Extract a type for the operation if there is one */ 31 if (strchr(SAFE_IOP_TYPE_PREFIXES, **c) != NULL) { 32 switch(**c) { 33 case 'u': 34 if ((*(*c+1) && *(*c+1) == '3') && 35 (*(*c+2) && *(*c+2) == '2')) { 36 *type = SAFE_IOP_TYPE_U32; 37 *c += 3; /* Advance past type */ 38 } 39 break; 40 case 's': 41 if ((*(*c+1) && *(*c+1) == '3') && 42 (*(*c+2) && *(*c+2) == '2')) { 43 *type = SAFE_IOP_TYPE_S32; 44 *c += 3; /* Advance past type */ 45 } 46 break; 47 default: 48 /* Unknown type */ 49 return 0; 50 } 51 } 52 return 1; 53 } 54 55 #define _SAFE_IOP_TYPE_CASE(_type, _func) { \ 56 _type a = va_arg(ap, _type), value = *((_type *) result); \ 57 if (!baseline) { \ 58 value = a; \ 59 a = va_arg(ap, _type); \ 60 baseline = 1; \ 61 } \ 62 if (! _func( (_type *) result, value, a)) \ 63 return 0; \ 64 } 65 #define _SAFE_IOP_OP_CASE(u32func, s32func) \ 66 switch (type) { \ 67 case SAFE_IOP_TYPE_U32: \ 68 _SAFE_IOP_TYPE_CASE(u_int32_t, u32func); \ 69 break; \ 70 case SAFE_IOP_TYPE_S32: \ 71 _SAFE_IOP_TYPE_CASE(int32_t, s32func); \ 72 break; \ 73 default: \ 74 return 0; \ 75 } 76 77 int safe_iopf(void *result, const char *const fmt, ...) { 78 va_list ap; 79 int baseline = 0; /* indicates if the base value is present */ 80 81 const char *c = NULL; 82 safe_type_t type = SAFE_IOP_TYPE_DEFAULT; 83 /* Result should not be NULL */ 84 if (!result) 85 return 0; 86 87 va_start(ap, fmt); 88 if (fmt == NULL || fmt[0] == '\0') 89 return 0; 90 for(c=fmt;(*c);c++) { 91 /* Read the type if specified */ 92 if (!_safe_op_read_type(&type, &c)) { 93 return 0; 94 } 95 96 /* Process the the operations */ 97 switch(*c) { /* operation */ 98 case '+': /* add */ 99 _SAFE_IOP_OP_CASE(safe_uadd, safe_sadd); 100 break; 101 case '-': /* sub */ 102 _SAFE_IOP_OP_CASE(safe_usub, safe_ssub); 103 break; 104 case '*': /* mul */ 105 _SAFE_IOP_OP_CASE(safe_umul, safe_smul); 106 break; 107 case '/': /* div */ 108 _SAFE_IOP_OP_CASE(safe_udiv, safe_sdiv); 109 break; 110 case '%': /* mod */ 111 _SAFE_IOP_OP_CASE(safe_umod, safe_smod); 112 break; 113 default: 114 /* unknown op */ 115 return 0; 116 } 117 /* Reset the type */ 118 type = SAFE_IOP_TYPE_DEFAULT; 119 } 120 /* Success! */ 121 return 1; 122 } 123 124 #ifdef SAFE_IOP_TEST 125 #include <stdio.h> 126 #include <stdint.h> 127 #include <limits.h> 128 129 /* __LP64__ is given by GCC. Without more work, this is bound to GCC. */ 130 #if __LP64__ == 1 || __SIZEOF_LONG__ > __SIZEOF_INT__ 131 # define SAFE_INT64_MAX 0x7fffffffffffffffL 132 # define SAFE_UINT64_MAX 0xffffffffffffffffUL 133 # define SAFE_INT64_MIN (-SAFE_INT64_MAX - 1L) 134 #elif __SIZEOF_LONG__ == __SIZEOF_INT__ 135 # define SAFE_INT64_MAX 0x7fffffffffffffffLL 136 # define SAFE_UINT64_MAX 0xffffffffffffffffULL 137 # define SAFE_INT64_MIN (-SAFE_INT64_MAX - 1LL) 138 #else 139 # warning "64-bit support disabled" 140 # define SAFE_IOP_NO_64 1 141 #endif 142 143 /* Pull these from GNU's limit.h */ 144 #ifndef LLONG_MAX 145 # define LLONG_MAX 9223372036854775807LL 146 #endif 147 #ifndef LLONG_MIN 148 # define LLONG_MIN (-LLONG_MAX - 1LL) 149 #endif 150 #ifndef ULLONG_MAX 151 # define ULLONG_MAX 18446744073709551615ULL 152 #endif 153 154 /* Assumes SSIZE_MAX */ 155 #ifndef SSIZE_MIN 156 # if SSIZE_MAX == LONG_MAX 157 # define SSIZE_MIN LONG_MIN 158 # elif SSIZE_MAX == LONG_LONG_MAX 159 # define SSIZE_MIN LONG_LONG_MIN 160 # else 161 # error "SSIZE_MIN is not defined and could not be guessed" 162 # endif 163 #endif 164 165 #define EXPECT_FALSE(cmd) ({ \ 166 printf("%s: EXPECT_FALSE(" #cmd ") => ", __func__); \ 167 if ((cmd) != 0) { printf(" FAILED\n"); expect_fail++; r = 0; } \ 168 else { printf(" PASSED\n"); expect_succ++; } \ 169 expect++; \ 170 }) 171 #define EXPECT_TRUE(cmd) ({ \ 172 printf("%s: EXPECT_TRUE(" #cmd ") => ", __func__); \ 173 if ((cmd) != 1) { printf(" FAILED\n"); expect_fail++; r = 0; } \ 174 else { printf(" PASSED\n"); expect_succ++; } \ 175 expect++; \ 176 }) 177 178 static int expect = 0, expect_succ = 0, expect_fail = 0; 179 180 /***** ADD *****/ 181 int T_add_s8() { 182 int r=1; 183 int8_t a, b; 184 a=SCHAR_MIN; b=-1; EXPECT_FALSE(safe_add(NULL, a, b)); 185 a=SCHAR_MAX; b=1; EXPECT_FALSE(safe_add(NULL, a, b)); 186 a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b)); 187 a=-10; b=-11; EXPECT_TRUE(safe_add(NULL, a, b)); 188 a=SCHAR_MIN; b=SCHAR_MAX; EXPECT_TRUE(safe_add(NULL, a, b)); 189 a=SCHAR_MIN+1; b=-1; EXPECT_TRUE(safe_add(NULL, a, b)); 190 a=SCHAR_MAX/2; b=SCHAR_MAX/2; EXPECT_TRUE(safe_add(NULL, a, b)); 191 return r; 192 } 193 194 int T_add_s16() { 195 int r=1; 196 int16_t a, b; 197 a=SHRT_MIN; b=-1; EXPECT_FALSE(safe_add(NULL, a, b)); 198 a=SHRT_MAX; b=1; EXPECT_FALSE(safe_add(NULL, a, b)); 199 a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b)); 200 a=SHRT_MIN; b=SHRT_MAX; EXPECT_TRUE(safe_add(NULL, a, b)); 201 a=SHRT_MAX/2; b=SHRT_MAX/2; EXPECT_TRUE(safe_add(NULL, a, b)); 202 return r; 203 } 204 205 int T_add_s32() { 206 int r=1; 207 int32_t a, b; 208 a=INT_MIN; b=-1; EXPECT_FALSE(safe_add(NULL, a, b)); 209 a=INT_MAX; b=1; EXPECT_FALSE(safe_add(NULL, a, b)); 210 a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b)); 211 a=INT_MIN; b=INT_MAX; EXPECT_TRUE(safe_add(NULL, a, b)); 212 a=INT_MAX/2; b=INT_MAX/2; EXPECT_TRUE(safe_add(NULL, a, b)); 213 return r; 214 } 215 216 int T_add_s64() { 217 int r=1; 218 int64_t a, b; 219 a=SAFE_INT64_MIN; b=-1; EXPECT_FALSE(safe_add(NULL, a, b)); 220 a=SAFE_INT64_MAX; b=1; EXPECT_FALSE(safe_add(NULL, a, b)); 221 a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b)); 222 a=SAFE_INT64_MIN; b=SAFE_INT64_MAX; EXPECT_TRUE(safe_add(NULL, a, b)); 223 a=SAFE_INT64_MAX/2; b=SAFE_INT64_MAX/2; EXPECT_TRUE(safe_add(NULL, a, b)); 224 return r; 225 } 226 227 int T_add_long() { 228 int r=1; 229 long a, b; 230 a=LONG_MIN; b=-1; EXPECT_FALSE(safe_add(NULL, a, b)); 231 a=LONG_MAX; b=1; EXPECT_FALSE(safe_add(NULL, a, b)); 232 a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b)); 233 a=LONG_MIN; b=LONG_MAX; EXPECT_TRUE(safe_add(NULL, a, b)); 234 a=LONG_MAX/2; b=LONG_MAX/2; EXPECT_TRUE(safe_add(NULL, a, b)); 235 return r; 236 } 237 int T_add_longlong() { 238 int r=1; 239 long long a, b; 240 a=LLONG_MIN; b=-1; EXPECT_FALSE(safe_add(NULL, a, b)); 241 a=LLONG_MAX; b=1; EXPECT_FALSE(safe_add(NULL, a, b)); 242 a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b)); 243 a=LLONG_MIN; b=LLONG_MAX; EXPECT_TRUE(safe_add(NULL, a, b)); 244 a=LLONG_MAX/2; b=LLONG_MAX/2; EXPECT_TRUE(safe_add(NULL, a, b)); 245 return r; 246 } 247 int T_add_ssizet() { 248 int r=1; 249 ssize_t a, b; 250 a=SSIZE_MIN; b=-1; EXPECT_FALSE(safe_add(NULL, a, b)); 251 a=SSIZE_MAX; b=1; EXPECT_FALSE(safe_add(NULL, a, b)); 252 a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b)); 253 a=SSIZE_MIN; b=SSIZE_MAX; EXPECT_TRUE(safe_add(NULL, a, b)); 254 a=SSIZE_MAX/2; b=SSIZE_MAX/2; EXPECT_TRUE(safe_add(NULL, a, b)); 255 return r; 256 } 257 258 int T_add_u8() { 259 int r=1; 260 uint8_t a, b; 261 a=1; b=UCHAR_MAX; EXPECT_FALSE(safe_add(NULL, a, b)); 262 a=UCHAR_MAX/2; b=a+2; EXPECT_FALSE(safe_add(NULL, a, b)); 263 a=UCHAR_MAX/2; b=a; EXPECT_TRUE(safe_add(NULL, a, b)); 264 a=UCHAR_MAX/2; b=a+1; EXPECT_TRUE(safe_add(NULL, a, b)); 265 a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b)); 266 a=0; b=UCHAR_MAX; EXPECT_TRUE(safe_add(NULL, a, b)); 267 return r; 268 } 269 270 int T_add_u16() { 271 int r=1; 272 uint16_t a, b; 273 a=1; b=USHRT_MAX; EXPECT_FALSE(safe_add(NULL, a, b)); 274 a=USHRT_MAX/2; b=a+2; EXPECT_FALSE(safe_add(NULL, a, b)); 275 a=USHRT_MAX/2; b=a; EXPECT_TRUE(safe_add(NULL, a, b)); 276 a=USHRT_MAX/2; b=a+1; EXPECT_TRUE(safe_add(NULL, a, b)); 277 a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b)); 278 a=0; b=USHRT_MAX; EXPECT_TRUE(safe_add(NULL, a, b)); 279 return r; 280 } 281 282 int T_add_u32() { 283 int r=1; 284 uint32_t a, b; 285 a=1; b=UINT_MAX; EXPECT_FALSE(safe_add(NULL, a, b)); 286 a=UINT_MAX/2; b=a+2; EXPECT_FALSE(safe_add(NULL, a, b)); 287 a=UINT_MAX/2; b=a; EXPECT_TRUE(safe_add(NULL, a, b)); 288 a=UINT_MAX/2; b=a+1; EXPECT_TRUE(safe_add(NULL, a, b)); 289 a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b)); 290 a=0; b=UINT_MAX; EXPECT_TRUE(safe_add(NULL, a, b)); 291 return r; 292 } 293 294 int T_add_u64() { 295 int r=1; 296 uint64_t a, b; 297 a=1; b=SAFE_UINT64_MAX; EXPECT_FALSE(safe_add(NULL, a, b)); 298 a=SAFE_UINT64_MAX/2; b=a+2; EXPECT_FALSE(safe_add(NULL, a, b)); 299 a=SAFE_UINT64_MAX/2; b=a; EXPECT_TRUE(safe_add(NULL, a, b)); 300 a=SAFE_UINT64_MAX/2; b=a+1; EXPECT_TRUE(safe_add(NULL, a, b)); 301 a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b)); 302 a=0; b=SAFE_UINT64_MAX; EXPECT_TRUE(safe_add(NULL, a, b)); 303 return r; 304 } 305 306 int T_add_ulong() { 307 int r=1; 308 unsigned long a, b; 309 a=1; b=ULONG_MAX; EXPECT_FALSE(safe_add(NULL, a, b)); 310 a=ULONG_MAX/2; b=a+2; EXPECT_FALSE(safe_add(NULL, a, b)); 311 a=ULONG_MAX/2; b=a; EXPECT_TRUE(safe_add(NULL, a, b)); 312 a=ULONG_MAX/2; b=a+1; EXPECT_TRUE(safe_add(NULL, a, b)); 313 a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b)); 314 a=0; b=ULONG_MAX; EXPECT_TRUE(safe_add(NULL, a, b)); 315 return r; 316 } 317 318 int T_add_ulonglong() { 319 int r=1; 320 unsigned long long a, b; 321 a=1; b=ULLONG_MAX; EXPECT_FALSE(safe_add(NULL, a, b)); 322 a=ULLONG_MAX/2; b=a+2; EXPECT_FALSE(safe_add(NULL, a, b)); 323 a=ULLONG_MAX/2; b=a; EXPECT_TRUE(safe_add(NULL, a, b)); 324 a=ULLONG_MAX/2; b=a+1; EXPECT_TRUE(safe_add(NULL, a, b)); 325 a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b)); 326 a=0; b=ULLONG_MAX; EXPECT_TRUE(safe_add(NULL, a, b)); 327 return r; 328 } 329 330 int T_add_sizet() { 331 int r=1; 332 size_t a, b; 333 a=1; b=SIZE_MAX; EXPECT_FALSE(safe_add(NULL, a, b)); 334 a=SIZE_MAX/2; b=a+2; EXPECT_FALSE(safe_add(NULL, a, b)); 335 a=SIZE_MAX/2; b=a; EXPECT_TRUE(safe_add(NULL, a, b)); 336 a=SIZE_MAX/2; b=a+1; EXPECT_TRUE(safe_add(NULL, a, b)); 337 a=10; b=11; EXPECT_TRUE(safe_add(NULL, a, b)); 338 a=0; b=SIZE_MAX; EXPECT_TRUE(safe_add(NULL, a, b)); 339 return r; 340 } 341 342 int T_add_mixed() { 343 int r=1; 344 int8_t a = 1; 345 uint8_t b = 2; 346 uint16_t c = 3; 347 EXPECT_FALSE(safe_add(NULL, a, b)); 348 EXPECT_FALSE(safe_add(NULL, b, c)); 349 EXPECT_FALSE(safe_add(NULL, a, c)); 350 EXPECT_FALSE(safe_add3(NULL, a, b, c)); 351 return r; 352 } 353 354 int T_add_increment() { 355 int r=1; 356 uint16_t a = 1, b = 2, c = 0, d[2]= {0}; 357 uint16_t *cur = d; 358 EXPECT_TRUE(safe_add(cur++, a++, b)); 359 EXPECT_TRUE(cur == &d[1]); 360 EXPECT_TRUE(d[0] == 3); 361 EXPECT_TRUE(a == 2); 362 a = 1; b = 2; c = 1; cur=d;d[0] = 0; 363 EXPECT_TRUE(safe_add3(cur++, a++, b++, c)); 364 EXPECT_TRUE(d[0] == 4); 365 EXPECT_TRUE(cur == &d[1]); 366 EXPECT_TRUE(a == 2); 367 EXPECT_TRUE(b == 3); 368 EXPECT_TRUE(c == 1); 369 return r; 370 } 371 372 373 374 /***** SUB *****/ 375 int T_sub_s8() { 376 int r=1; 377 int8_t a, b; 378 a=SCHAR_MIN; b=1; EXPECT_FALSE(safe_sub(NULL, a, b)); 379 a=SCHAR_MIN; b=SCHAR_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 380 a=SCHAR_MIN/2; b=SCHAR_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 381 a=-2; b=SCHAR_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 382 a=SCHAR_MAX; b=SCHAR_MAX; EXPECT_TRUE(safe_sub(NULL, a, b)); 383 a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b)); 384 a=2; b=10; EXPECT_TRUE(safe_sub(NULL, a, b)); 385 return r; 386 } 387 388 int T_sub_s16() { 389 int r=1; 390 int16_t a, b; 391 a=SHRT_MIN; b=1; EXPECT_FALSE(safe_sub(NULL, a, b)); 392 a=SHRT_MIN; b=SHRT_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 393 a=SHRT_MIN/2; b=SHRT_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 394 a=-2; b=SHRT_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 395 a=SHRT_MAX; b=SHRT_MAX; EXPECT_TRUE(safe_sub(NULL, a, b)); 396 a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b)); 397 a=2; b=10; EXPECT_TRUE(safe_sub(NULL, a, b)); 398 return r; 399 } 400 401 int T_sub_s32() { 402 int r=1; 403 int32_t a, b; 404 a=INT_MIN; b=1; EXPECT_FALSE(safe_sub(NULL, a, b)); 405 a=INT_MIN; b=INT_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 406 a=INT_MIN/2; b=INT_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 407 a=-2; b=INT_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 408 a=INT_MAX; b=INT_MAX; EXPECT_TRUE(safe_sub(NULL, a, b)); 409 a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b)); 410 a=2; b=10; EXPECT_TRUE(safe_sub(NULL, a, b)); 411 return r; 412 } 413 414 int T_sub_s64() { 415 int r=1; 416 int64_t a, b; 417 a=SAFE_INT64_MIN; b=1; EXPECT_FALSE(safe_sub(NULL, a, b)); 418 a=SAFE_INT64_MIN; b=SAFE_INT64_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 419 a=SAFE_INT64_MIN/2; b=SAFE_INT64_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 420 a=-2; b=SAFE_INT64_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 421 a=SAFE_INT64_MAX; b=SAFE_INT64_MAX; EXPECT_TRUE(safe_sub(NULL, a, b)); 422 a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b)); 423 a=2; b=10; EXPECT_TRUE(safe_sub(NULL, a, b)); 424 return r; 425 } 426 427 int T_sub_long() { 428 int r=1; 429 long a, b; 430 a=LONG_MIN; b=1; EXPECT_FALSE(safe_sub(NULL, a, b)); 431 a=LONG_MIN; b=LONG_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 432 a=LONG_MIN/2; b=LONG_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 433 a=-2; b=LONG_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 434 a=LONG_MAX; b=LONG_MAX; EXPECT_TRUE(safe_sub(NULL, a, b)); 435 a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b)); 436 a=2; b=10; EXPECT_TRUE(safe_sub(NULL, a, b)); 437 return r; 438 } 439 440 int T_sub_longlong() { 441 int r=1; 442 long long a, b; 443 a=LLONG_MIN; b=1; EXPECT_FALSE(safe_sub(NULL, a, b)); 444 a=LLONG_MIN; b=LLONG_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 445 a=LLONG_MIN/2; b=LLONG_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 446 a=-2; b=LLONG_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 447 a=LLONG_MAX; b=LLONG_MAX; EXPECT_TRUE(safe_sub(NULL, a, b)); 448 a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b)); 449 a=2; b=10; EXPECT_TRUE(safe_sub(NULL, a, b)); 450 return r; 451 } 452 453 int T_sub_ssizet() { 454 int r=1; 455 ssize_t a, b; 456 a=SSIZE_MIN; b=1; EXPECT_FALSE(safe_sub(NULL, a, b)); 457 a=SSIZE_MIN; b=SSIZE_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 458 a=SSIZE_MIN/2; b=SSIZE_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 459 a=-2; b=SSIZE_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 460 a=SSIZE_MAX; b=SSIZE_MAX; EXPECT_TRUE(safe_sub(NULL, a, b)); 461 a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b)); 462 a=2; b=10; EXPECT_TRUE(safe_sub(NULL, a, b)); 463 return r; 464 } 465 466 int T_sub_u8() { 467 int r=1; 468 uint8_t a, b; 469 a=0; b=UCHAR_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 470 a=UCHAR_MAX-1; b=UCHAR_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 471 a=UCHAR_MAX; b=UCHAR_MAX; EXPECT_TRUE(safe_sub(NULL, a, b)); 472 a=1; b=100; EXPECT_FALSE(safe_sub(NULL, a, b)); 473 a=100; b=0; EXPECT_TRUE(safe_sub(NULL, a, b)); 474 a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b)); 475 a=0; b=0; EXPECT_TRUE(safe_sub(NULL, a, b)); 476 return r; 477 } 478 479 int T_sub_u16() { 480 int r=1; 481 uint16_t a, b; 482 a=0; b=USHRT_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 483 a=USHRT_MAX-1; b=USHRT_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 484 a=USHRT_MAX; b=USHRT_MAX; EXPECT_TRUE(safe_sub(NULL, a, b)); 485 a=1; b=100; EXPECT_FALSE(safe_sub(NULL, a, b)); 486 a=100; b=0; EXPECT_TRUE(safe_sub(NULL, a, b)); 487 a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b)); 488 a=0; b=0; EXPECT_TRUE(safe_sub(NULL, a, b)); 489 return r; 490 } 491 492 int T_sub_u32() { 493 int r=1; 494 uint32_t a, b; 495 a=UINT_MAX-1; b=UINT_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 496 a=UINT_MAX; b=UINT_MAX; EXPECT_TRUE(safe_sub(NULL, a, b)); 497 a=1; b=100; EXPECT_FALSE(safe_sub(NULL, a, b)); 498 a=100; b=0; EXPECT_TRUE(safe_sub(NULL, a, b)); 499 a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b)); 500 a=0; b=0; EXPECT_TRUE(safe_sub(NULL, a, b)); 501 return r; 502 } 503 504 int T_sub_u64() { 505 int r=1; 506 uint64_t a, b; 507 a=SAFE_UINT64_MAX-1; b=SAFE_UINT64_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 508 a=SAFE_UINT64_MAX; b=SAFE_UINT64_MAX; EXPECT_TRUE(safe_sub(NULL, a, b)); 509 a=1; b=100; EXPECT_FALSE(safe_sub(NULL, a, b)); 510 a=100; b=0; EXPECT_TRUE(safe_sub(NULL, a, b)); 511 a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b)); 512 a=0; b=0; EXPECT_TRUE(safe_sub(NULL, a, b)); 513 return r; 514 } 515 516 int T_sub_ulong() { 517 int r=1; 518 unsigned long a, b; 519 a=ULONG_MAX-1; b=ULONG_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 520 a=ULONG_MAX; b=ULONG_MAX; EXPECT_TRUE(safe_sub(NULL, a, b)); 521 a=1; b=100; EXPECT_FALSE(safe_sub(NULL, a, b)); 522 a=100; b=0; EXPECT_TRUE(safe_sub(NULL, a, b)); 523 a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b)); 524 a=0; b=0; EXPECT_TRUE(safe_sub(NULL, a, b)); 525 return r; 526 } 527 528 int T_sub_ulonglong() { 529 int r=1; 530 unsigned long long a, b; 531 a=ULLONG_MAX-1; b=ULLONG_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 532 a=ULLONG_MAX; b=ULLONG_MAX; EXPECT_TRUE(safe_sub(NULL, a, b)); 533 a=1; b=100; EXPECT_FALSE(safe_sub(NULL, a, b)); 534 a=100; b=0; EXPECT_TRUE(safe_sub(NULL, a, b)); 535 a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b)); 536 a=0; b=0; EXPECT_TRUE(safe_sub(NULL, a, b)); 537 return r; 538 } 539 540 int T_sub_sizet() { 541 int r=1; 542 size_t a, b; 543 a=SIZE_MAX-1; b=SIZE_MAX; EXPECT_FALSE(safe_sub(NULL, a, b)); 544 a=SIZE_MAX; b=SIZE_MAX; EXPECT_TRUE(safe_sub(NULL, a, b)); 545 a=1; b=100; EXPECT_FALSE(safe_sub(NULL, a, b)); 546 a=100; b=0; EXPECT_TRUE(safe_sub(NULL, a, b)); 547 a=10; b=2; EXPECT_TRUE(safe_sub(NULL, a, b)); 548 a=0; b=0; EXPECT_TRUE(safe_sub(NULL, a, b)); 549 return r; 550 } 551 552 /***** MUL *****/ 553 int T_mul_s8() { 554 int r=1; 555 int8_t a, b; 556 a=SCHAR_MIN; b=-1; EXPECT_FALSE(safe_mul(NULL, a, b)); 557 a=SCHAR_MIN; b=-2; EXPECT_FALSE(safe_mul(NULL, a, b)); 558 a=SCHAR_MAX; b=SCHAR_MAX; EXPECT_FALSE(safe_mul(NULL, a, b)); 559 a=SCHAR_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 560 a=SCHAR_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 561 a=100; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 562 a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 563 a=SCHAR_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 564 a=SCHAR_MIN; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 565 a=0; b=SCHAR_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 566 a=0; b=SCHAR_MIN; EXPECT_TRUE(safe_mul(NULL, a, b)); 567 a=0; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 568 return r; 569 } 570 571 int T_mul_s16() { 572 int r=1; 573 int16_t a, b; 574 a=SHRT_MIN; b=-1; EXPECT_FALSE(safe_mul(NULL, a, b)); 575 a=SHRT_MIN; b=-2; EXPECT_FALSE(safe_mul(NULL, a, b)); 576 a=SHRT_MAX; b=SHRT_MAX; EXPECT_FALSE(safe_mul(NULL, a, b)); 577 a=SHRT_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 578 a=SHRT_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 579 a=100; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 580 a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 581 a=SHRT_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 582 a=SHRT_MIN; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 583 a=0; b=SHRT_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 584 a=0; b=SHRT_MIN; EXPECT_TRUE(safe_mul(NULL, a, b)); 585 a=0; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 586 return r; 587 } 588 589 int T_mul_s32() { 590 int r=1; 591 int32_t a, b; 592 a=INT_MIN; b=-1; EXPECT_FALSE(safe_mul(NULL, a, b)); 593 a=INT_MIN; b=-2; EXPECT_FALSE(safe_mul(NULL, a, b)); 594 a=INT_MAX; b=INT_MAX; EXPECT_FALSE(safe_mul(NULL, a, b)); 595 a=INT_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 596 a=INT_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 597 a=100; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 598 a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 599 a=INT_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 600 a=INT_MIN; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 601 a=0; b=INT_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 602 a=0; b=INT_MIN; EXPECT_TRUE(safe_mul(NULL, a, b)); 603 a=0; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 604 return r; 605 } 606 607 int T_mul_s64() { 608 int r=1; 609 int64_t a, b; 610 a=SAFE_INT64_MIN; b=-1; EXPECT_FALSE(safe_mul(NULL, a, b)); 611 a=SAFE_INT64_MIN; b=-2; EXPECT_FALSE(safe_mul(NULL, a, b)); 612 a=SAFE_INT64_MAX; b=SAFE_INT64_MAX; EXPECT_FALSE(safe_mul(NULL, a, b)); 613 a=SAFE_INT64_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 614 a=SAFE_INT64_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 615 a=100; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 616 a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 617 a=SAFE_INT64_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 618 a=SAFE_INT64_MIN; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 619 a=0; b=SAFE_INT64_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 620 a=0; b=SAFE_INT64_MIN; EXPECT_TRUE(safe_mul(NULL, a, b)); 621 a=0; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 622 return r; 623 } 624 625 int T_mul_long() { 626 int r=1; 627 long a, b; 628 a=LONG_MIN; b=-1; EXPECT_FALSE(safe_mul(NULL, a, b)); 629 a=LONG_MIN; b=-2; EXPECT_FALSE(safe_mul(NULL, a, b)); 630 a=LONG_MAX; b=LONG_MAX; EXPECT_FALSE(safe_mul(NULL, a, b)); 631 a=LONG_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 632 a=LONG_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 633 a=100; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 634 a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 635 a=LONG_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 636 a=LONG_MIN; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 637 a=0; b=LONG_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 638 a=0; b=LONG_MIN; EXPECT_TRUE(safe_mul(NULL, a, b)); 639 a=0; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 640 return r; 641 } 642 int T_mul_longlong() { 643 int r=1; 644 long long a, b; 645 a=LLONG_MIN; b=-1; EXPECT_FALSE(safe_mul(NULL, a, b)); 646 a=LLONG_MIN; b=-2; EXPECT_FALSE(safe_mul(NULL, a, b)); 647 a=LLONG_MAX; b=LLONG_MAX; EXPECT_FALSE(safe_mul(NULL, a, b)); 648 a=LLONG_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 649 a=LLONG_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 650 a=100; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 651 a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 652 a=LLONG_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 653 a=LLONG_MIN; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 654 a=0; b=LLONG_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 655 a=0; b=LLONG_MIN; EXPECT_TRUE(safe_mul(NULL, a, b)); 656 a=0; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 657 return r; 658 } 659 int T_mul_ssizet() { 660 int r=1; 661 ssize_t a, b; 662 a=SSIZE_MIN; b=-1; EXPECT_FALSE(safe_mul(NULL, a, b)); 663 a=SSIZE_MIN; b=-2; EXPECT_FALSE(safe_mul(NULL, a, b)); 664 a=SSIZE_MAX; b=SSIZE_MAX; EXPECT_FALSE(safe_mul(NULL, a, b)); 665 a=SSIZE_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 666 a=SSIZE_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 667 a=100; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 668 a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 669 a=SSIZE_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 670 a=SSIZE_MIN; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 671 a=0; b=SSIZE_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 672 a=0; b=SSIZE_MIN; EXPECT_TRUE(safe_mul(NULL, a, b)); 673 a=0; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 674 return r; 675 } 676 677 int T_mul_u8() { 678 int r=1; 679 uint8_t a, b; 680 a=UCHAR_MAX-1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 681 a=2; b=UCHAR_MAX-1; EXPECT_FALSE(safe_mul(NULL, a, b)); 682 a=UCHAR_MAX; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 683 a=2; b=UCHAR_MAX; EXPECT_FALSE(safe_mul(NULL, a, b)); 684 a=UCHAR_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 685 a=2; b=UCHAR_MAX/2+1; EXPECT_FALSE(safe_mul(NULL, a, b)); 686 a=UCHAR_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 687 a=0; b=UCHAR_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 688 a=1; b=UCHAR_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 689 a=UCHAR_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 690 a=UCHAR_MAX; b=1; EXPECT_TRUE(safe_mul(NULL, a, b)); 691 a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 692 return r; 693 } 694 695 int T_mul_u16() { 696 int r=1; 697 uint16_t a, b; 698 a=USHRT_MAX-1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 699 a=2; b=USHRT_MAX-1; EXPECT_FALSE(safe_mul(NULL, a, b)); 700 a=USHRT_MAX; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 701 a=2; b=USHRT_MAX; EXPECT_FALSE(safe_mul(NULL, a, b)); 702 a=USHRT_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 703 a=2; b=USHRT_MAX/2+1; EXPECT_FALSE(safe_mul(NULL, a, b)); 704 a=USHRT_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 705 a=0; b=USHRT_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 706 a=1; b=USHRT_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 707 a=USHRT_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 708 a=USHRT_MAX; b=1; EXPECT_TRUE(safe_mul(NULL, a, b)); 709 a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 710 return r; 711 } 712 713 int T_mul_u32() { 714 int r=1; 715 uint32_t a, b; 716 a=UINT_MAX-1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 717 a=2; b=UINT_MAX-1; EXPECT_FALSE(safe_mul(NULL, a, b)); 718 a=UINT_MAX; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 719 a=2; b=UINT_MAX; EXPECT_FALSE(safe_mul(NULL, a, b)); 720 a=UINT_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 721 a=2; b=UINT_MAX/2+1; EXPECT_FALSE(safe_mul(NULL, a, b)); 722 a=UINT_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 723 a=0; b=UINT_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 724 a=1; b=UINT_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 725 a=UINT_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 726 a=UINT_MAX; b=1; EXPECT_TRUE(safe_mul(NULL, a, b)); 727 a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 728 return r; 729 } 730 731 int T_mul_u64() { 732 int r=1; 733 uint64_t a, b; 734 a=SAFE_UINT64_MAX-1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 735 a=2; b=SAFE_UINT64_MAX-1; EXPECT_FALSE(safe_mul(NULL, a, b)); 736 a=SAFE_UINT64_MAX; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 737 a=2; b=SAFE_UINT64_MAX; EXPECT_FALSE(safe_mul(NULL, a, b)); 738 a=SAFE_UINT64_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 739 a=2; b=SAFE_UINT64_MAX/2+1; EXPECT_FALSE(safe_mul(NULL, a, b)); 740 a=SAFE_UINT64_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 741 a=0; b=SAFE_UINT64_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 742 a=1; b=SAFE_UINT64_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 743 a=SAFE_UINT64_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 744 a=SAFE_UINT64_MAX; b=1; EXPECT_TRUE(safe_mul(NULL, a, b)); 745 a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 746 return r; 747 } 748 749 int T_mul_ulong() { 750 int r=1; 751 unsigned long a, b; 752 a=ULONG_MAX-1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 753 a=2; b=ULONG_MAX-1; EXPECT_FALSE(safe_mul(NULL, a, b)); 754 a=ULONG_MAX; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 755 a=2; b=ULONG_MAX; EXPECT_FALSE(safe_mul(NULL, a, b)); 756 a=ULONG_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 757 a=2; b=ULONG_MAX/2+1; EXPECT_FALSE(safe_mul(NULL, a, b)); 758 a=ULONG_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 759 a=0; b=ULONG_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 760 a=1; b=ULONG_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 761 a=ULONG_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 762 a=ULONG_MAX; b=1; EXPECT_TRUE(safe_mul(NULL, a, b)); 763 a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 764 return r; 765 } 766 767 int T_mul_ulonglong() { 768 int r=1; 769 unsigned long long a, b; 770 a=ULLONG_MAX-1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 771 a=2; b=ULLONG_MAX-1; EXPECT_FALSE(safe_mul(NULL, a, b)); 772 a=ULLONG_MAX; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 773 a=2; b=ULLONG_MAX; EXPECT_FALSE(safe_mul(NULL, a, b)); 774 a=ULLONG_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 775 a=2; b=ULLONG_MAX/2+1; EXPECT_FALSE(safe_mul(NULL, a, b)); 776 a=ULLONG_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 777 a=0; b=ULLONG_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 778 a=1; b=ULLONG_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 779 a=ULLONG_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 780 a=ULLONG_MAX; b=1; EXPECT_TRUE(safe_mul(NULL, a, b)); 781 a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 782 return r; 783 } 784 785 int T_mul_sizet() { 786 int r=1; 787 size_t a, b; 788 a=SIZE_MAX-1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 789 a=2; b=SIZE_MAX-1; EXPECT_FALSE(safe_mul(NULL, a, b)); 790 a=SIZE_MAX; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 791 a=2; b=SIZE_MAX; EXPECT_FALSE(safe_mul(NULL, a, b)); 792 a=SIZE_MAX/2+1; b=2; EXPECT_FALSE(safe_mul(NULL, a, b)); 793 a=2; b=SIZE_MAX/2+1; EXPECT_FALSE(safe_mul(NULL, a, b)); 794 a=SIZE_MAX/2; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 795 a=0; b=SIZE_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 796 a=1; b=SIZE_MAX; EXPECT_TRUE(safe_mul(NULL, a, b)); 797 a=SIZE_MAX; b=0; EXPECT_TRUE(safe_mul(NULL, a, b)); 798 a=SIZE_MAX; b=1; EXPECT_TRUE(safe_mul(NULL, a, b)); 799 a=10; b=2; EXPECT_TRUE(safe_mul(NULL, a, b)); 800 return r; 801 } 802 803 /***** MOD *****/ 804 int T_mod_s8() { 805 int r=1; 806 int8_t a, b; 807 a=SCHAR_MIN; b=-1; EXPECT_FALSE(safe_mod(NULL, a, b)); 808 a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b)); 809 a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b)); 810 return r; 811 } 812 813 int T_mod_s16() { 814 int r=1; 815 int16_t a, b; 816 a=SHRT_MIN; b=-1; EXPECT_FALSE(safe_mod(NULL, a, b)); 817 a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b)); 818 a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b)); 819 return r; 820 } 821 822 int T_mod_s32() { 823 int r=1; 824 int32_t a, b; 825 a=INT_MIN; b=-1; EXPECT_FALSE(safe_mod(NULL, a, b)); 826 a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b)); 827 a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b)); 828 return r; 829 } 830 831 int T_mod_s64() { 832 int r=1; 833 int64_t a, b; 834 a=SAFE_INT64_MIN; b=-1; EXPECT_FALSE(safe_mod(NULL, a, b)); 835 a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b)); 836 a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b)); 837 return r; 838 } 839 840 int T_mod_long() { 841 int r=1; 842 long a, b; 843 a=LONG_MIN; b=-1; EXPECT_FALSE(safe_mod(NULL, a, b)); 844 a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b)); 845 a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b)); 846 return r; 847 } 848 int T_mod_longlong() { 849 int r=1; 850 long long a, b; 851 a=LLONG_MIN; b=-1LL; EXPECT_FALSE(safe_mod(NULL, a, b)); 852 a=100LL; b=0LL; EXPECT_FALSE(safe_mod(NULL, a, b)); 853 a=10LL; b=2LL; EXPECT_TRUE(safe_mod(NULL, a, b)); 854 return r; 855 } 856 int T_mod_ssizet() { 857 int r=1; 858 ssize_t a, b; 859 a=SSIZE_MIN; b=-1; EXPECT_FALSE(safe_mod(NULL, a, b)); 860 a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b)); 861 a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b)); 862 return r; 863 } 864 865 int T_mod_u8() { 866 int r=1; 867 uint8_t a, b; 868 a=0; b=UCHAR_MAX; EXPECT_TRUE(safe_mod(NULL, a, b)); 869 a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b)); 870 a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b)); 871 return r; 872 } 873 874 int T_mod_u16() { 875 int r=1; 876 uint16_t a, b; 877 a=0; b=USHRT_MAX; EXPECT_TRUE(safe_mod(NULL, a, b)); 878 a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b)); 879 a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b)); 880 return r; 881 } 882 883 int T_mod_u32() { 884 int r=1; 885 uint32_t a, b; 886 a=0; b=UINT_MAX; EXPECT_TRUE(safe_mod(NULL, a, b)); 887 a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b)); 888 a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b)); 889 return r; 890 } 891 892 int T_mod_u64() { 893 int r=1; 894 uint64_t a, b; 895 a=0; b=SAFE_INT64_MAX; EXPECT_TRUE(safe_mod(NULL, a, b)); 896 a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b)); 897 a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b)); 898 return r; 899 } 900 901 int T_mod_ulong() { 902 int r=1; 903 unsigned long a, b; 904 a=0; b=LONG_MAX; EXPECT_TRUE(safe_mod(NULL, a, b)); 905 a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b)); 906 a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b)); 907 return r; 908 } 909 910 int T_mod_ulonglong() { 911 int r=1; 912 unsigned long long a, b; 913 a=0ULL; b=~0ULL; EXPECT_TRUE(safe_mod(NULL, a, b)); 914 a=100ULL; b=0ULL; EXPECT_FALSE(safe_mod(NULL, a, b)); 915 a=10ULL; b=2ULL; EXPECT_TRUE(safe_mod(NULL, a, b)); 916 return r; 917 } 918 919 int T_mod_sizet() { 920 int r=1; 921 size_t a, b; 922 a=0; b=SIZE_MAX; EXPECT_TRUE(safe_mod(NULL, a, b)); 923 a=100; b=0; EXPECT_FALSE(safe_mod(NULL, a, b)); 924 a=10; b=2; EXPECT_TRUE(safe_mod(NULL, a, b)); 925 return r; 926 } 927 928 /***** DIV *****/ 929 int T_div_s8() { 930 int r=1; 931 int8_t a, b; 932 a=SCHAR_MIN; b=-1; EXPECT_FALSE(safe_div(NULL, a, b)); 933 a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b)); 934 a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b)); 935 return r; 936 } 937 938 int T_div_s16() { 939 int r=1; 940 int16_t a, b; 941 a=SHRT_MIN; b=-1; EXPECT_FALSE(safe_div(NULL, a, b)); 942 a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b)); 943 a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b)); 944 return r; 945 } 946 947 int T_div_s32() { 948 int r=1; 949 int32_t a, b; 950 a=INT_MIN; b=-1; EXPECT_FALSE(safe_div(NULL, a, b)); 951 a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b)); 952 a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b)); 953 return r; 954 } 955 956 int T_div_s64() { 957 int r=1; 958 int64_t a, b; 959 a=SAFE_INT64_MIN; b=-1; EXPECT_FALSE(safe_div(NULL, a, b)); 960 a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b)); 961 a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b)); 962 return r; 963 } 964 965 int T_div_long() { 966 int r=1; 967 long a, b; 968 a=LONG_MIN; b=-1; EXPECT_FALSE(safe_div(NULL, a, b)); 969 a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b)); 970 a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b)); 971 return r; 972 } 973 int T_div_longlong() { 974 int r=1; 975 long long a, b; 976 a=LLONG_MIN; b=-1LL; EXPECT_FALSE(safe_div(NULL, a, b)); 977 a=100LL; b=0LL; EXPECT_FALSE(safe_div(NULL, a, b)); 978 a=10LL; b=2LL; EXPECT_TRUE(safe_div(NULL, a, b)); 979 return r; 980 } 981 int T_div_ssizet() { 982 int r=1; 983 ssize_t a, b; 984 a=SSIZE_MIN; b=-1; EXPECT_FALSE(safe_div(NULL, a, b)); 985 a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b)); 986 a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b)); 987 return r; 988 } 989 990 int T_div_u8() { 991 int r=1; 992 uint8_t a, b; 993 a=0; b=UCHAR_MAX; EXPECT_TRUE(safe_div(NULL, a, b)); 994 a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b)); 995 a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b)); 996 return r; 997 } 998 999 int T_div_u16() { 1000 int r=1; 1001 uint16_t a, b; 1002 a=0; b=USHRT_MAX; EXPECT_TRUE(safe_div(NULL, a, b)); 1003 a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b)); 1004 a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b)); 1005 return r; 1006 } 1007 1008 int T_div_u32() { 1009 int r=1; 1010 uint32_t a, b; 1011 a=0; b=UINT_MAX; EXPECT_TRUE(safe_div(NULL, a, b)); 1012 a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b)); 1013 a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b)); 1014 return r; 1015 } 1016 1017 int T_div_u64() { 1018 int r=1; 1019 uint64_t a, b; 1020 a=0; b=SAFE_INT64_MAX; EXPECT_TRUE(safe_div(NULL, a, b)); 1021 a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b)); 1022 a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b)); 1023 return r; 1024 } 1025 1026 int T_div_ulong() { 1027 int r=1; 1028 unsigned long a, b; 1029 a=0; b=LONG_MAX; EXPECT_TRUE(safe_div(NULL, a, b)); 1030 a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b)); 1031 a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b)); 1032 return r; 1033 } 1034 1035 int T_div_ulonglong() { 1036 int r=1; 1037 unsigned long long a, b; 1038 a=0ULL; b=~0ULL; EXPECT_TRUE(safe_div(NULL, a, b)); 1039 a=100ULL; b=0ULL; EXPECT_FALSE(safe_div(NULL, a, b)); 1040 a=10ULL; b=2ULL; EXPECT_TRUE(safe_div(NULL, a, b)); 1041 return r; 1042 } 1043 1044 int T_div_sizet() { 1045 int r=1; 1046 size_t a, b; 1047 a=0; b=SIZE_MAX; EXPECT_TRUE(safe_div(NULL, a, b)); 1048 a=100; b=0; EXPECT_FALSE(safe_div(NULL, a, b)); 1049 a=10; b=2; EXPECT_TRUE(safe_div(NULL, a, b)); 1050 return r; 1051 } 1052 1053 int T_magic_constants() { 1054 int r=1; 1055 EXPECT_TRUE(__sio(m)(smin)(((int8_t)0)) == SCHAR_MIN); 1056 EXPECT_TRUE(__sio(m)(smax)(((int8_t)0)) == SCHAR_MAX); 1057 EXPECT_TRUE(__sio(m)(umax)(((uint8_t)0)) == UCHAR_MAX); 1058 1059 EXPECT_TRUE(__sio(m)(smin)(((int16_t)0)) == SHRT_MIN); 1060 EXPECT_TRUE(__sio(m)(smax)(((int16_t)0)) == SHRT_MAX); 1061 EXPECT_TRUE(__sio(m)(umax)(((uint16_t)0)) == USHRT_MAX); 1062 1063 EXPECT_TRUE(__sio(m)(smin)(((int32_t)0)) == INT_MIN); 1064 EXPECT_TRUE(__sio(m)(smax)(((int32_t)0)) == INT_MAX); 1065 EXPECT_TRUE(__sio(m)(umax)(((uint32_t)0)) == UINT_MAX); 1066 1067 EXPECT_TRUE(__sio(m)(smin)(((int64_t)0)) == SAFE_INT64_MIN); 1068 EXPECT_TRUE(__sio(m)(smax)(((int64_t)0)) == SAFE_INT64_MAX); 1069 EXPECT_TRUE(__sio(m)(umax)(((uint64_t)0)) == SAFE_UINT64_MAX); 1070 1071 EXPECT_TRUE(__sio(m)(smin)(((ssize_t)0)) == SSIZE_MIN); 1072 EXPECT_TRUE(__sio(m)(smax)(((ssize_t)0)) == SSIZE_MAX); 1073 EXPECT_TRUE(__sio(m)(umax)(((size_t)0)) == SIZE_MAX); 1074 1075 EXPECT_TRUE(__sio(m)(smin)(((long)0)) == LONG_MIN); 1076 EXPECT_TRUE(__sio(m)(smax)(((long)0)) == LONG_MAX); 1077 EXPECT_TRUE(__sio(m)(umax)(((unsigned long)0)) == ULONG_MAX); 1078 1079 EXPECT_TRUE(__sio(m)(smin)(((long long)0)) == LLONG_MIN); 1080 EXPECT_TRUE(__sio(m)(smax)(((long long)0)) == LLONG_MAX); 1081 EXPECT_TRUE(__sio(m)(umax)(((unsigned long long)0)) == ULLONG_MAX); 1082 1083 return r; 1084 } 1085 1086 1087 1088 1089 int main(int argc, char **argv) { 1090 /* test inlines */ 1091 int tests = 0, succ = 0, fail = 0; 1092 tests++; if (T_div_s8()) succ++; else fail++; 1093 tests++; if (T_div_s16()) succ++; else fail++; 1094 tests++; if (T_div_s32()) succ++; else fail++; 1095 tests++; if (T_div_s64()) succ++; else fail++; 1096 tests++; if (T_div_long()) succ++; else fail++; 1097 tests++; if (T_div_longlong()) succ++; else fail++; 1098 tests++; if (T_div_ssizet()) succ++; else fail++; 1099 tests++; if (T_div_u8()) succ++; else fail++; 1100 tests++; if (T_div_u16()) succ++; else fail++; 1101 tests++; if (T_div_u32()) succ++; else fail++; 1102 tests++; if (T_div_u64()) succ++; else fail++; 1103 tests++; if (T_div_ulong()) succ++; else fail++; 1104 tests++; if (T_div_ulonglong()) succ++; else fail++; 1105 tests++; if (T_div_sizet()) succ++; else fail++; 1106 1107 tests++; if (T_mod_s8()) succ++; else fail++; 1108 tests++; if (T_mod_s16()) succ++; else fail++; 1109 tests++; if (T_mod_s32()) succ++; else fail++; 1110 tests++; if (T_mod_s64()) succ++; else fail++; 1111 tests++; if (T_mod_long()) succ++; else fail++; 1112 tests++; if (T_mod_longlong()) succ++; else fail++; 1113 tests++; if (T_mod_ssizet()) succ++; else fail++; 1114 tests++; if (T_mod_u8()) succ++; else fail++; 1115 tests++; if (T_mod_u16()) succ++; else fail++; 1116 tests++; if (T_mod_u32()) succ++; else fail++; 1117 tests++; if (T_mod_u64()) succ++; else fail++; 1118 tests++; if (T_mod_ulong()) succ++; else fail++; 1119 tests++; if (T_mod_ulonglong()) succ++; else fail++; 1120 tests++; if (T_mod_sizet()) succ++; else fail++; 1121 1122 tests++; if (T_mul_s8()) succ++; else fail++; 1123 tests++; if (T_mul_s16()) succ++; else fail++; 1124 tests++; if (T_mul_s32()) succ++; else fail++; 1125 tests++; if (T_mul_s64()) succ++; else fail++; 1126 tests++; if (T_mul_long()) succ++; else fail++; 1127 tests++; if (T_mul_longlong()) succ++; else fail++; 1128 tests++; if (T_mul_ssizet()) succ++; else fail++; 1129 tests++; if (T_mul_u8()) succ++; else fail++; 1130 tests++; if (T_mul_u16()) succ++; else fail++; 1131 tests++; if (T_mul_u32()) succ++; else fail++; 1132 tests++; if (T_mul_u64()) succ++; else fail++; 1133 tests++; if (T_mul_ulong()) succ++; else fail++; 1134 tests++; if (T_mul_ulonglong()) succ++; else fail++; 1135 tests++; if (T_mul_sizet()) succ++; else fail++; 1136 1137 tests++; if (T_sub_s8()) succ++; else fail++; 1138 tests++; if (T_sub_s16()) succ++; else fail++; 1139 tests++; if (T_sub_s32()) succ++; else fail++; 1140 tests++; if (T_sub_s64()) succ++; else fail++; 1141 tests++; if (T_sub_long()) succ++; else fail++; 1142 tests++; if (T_sub_longlong()) succ++; else fail++; 1143 tests++; if (T_sub_ssizet()) succ++; else fail++; 1144 tests++; if (T_sub_u8()) succ++; else fail++; 1145 tests++; if (T_sub_u16()) succ++; else fail++; 1146 tests++; if (T_sub_u32()) succ++; else fail++; 1147 tests++; if (T_sub_u64()) succ++; else fail++; 1148 tests++; if (T_sub_ulong()) succ++; else fail++; 1149 tests++; if (T_sub_ulonglong()) succ++; else fail++; 1150 tests++; if (T_sub_sizet()) succ++; else fail++; 1151 1152 tests++; if (T_add_s8()) succ++; else fail++; 1153 tests++; if (T_add_s16()) succ++; else fail++; 1154 tests++; if (T_add_s32()) succ++; else fail++; 1155 tests++; if (T_add_s64()) succ++; else fail++; 1156 tests++; if (T_add_long()) succ++; else fail++; 1157 tests++; if (T_add_longlong()) succ++; else fail++; 1158 tests++; if (T_add_ssizet()) succ++; else fail++; 1159 tests++; if (T_add_u8()) succ++; else fail++; 1160 tests++; if (T_add_u16()) succ++; else fail++; 1161 tests++; if (T_add_u32()) succ++; else fail++; 1162 tests++; if (T_add_u64()) succ++; else fail++; 1163 tests++; if (T_add_ulong()) succ++; else fail++; 1164 tests++; if (T_add_ulonglong()) succ++; else fail++; 1165 tests++; if (T_add_sizet()) succ++; else fail++; 1166 tests++; if (T_add_mixed()) succ++; else fail++; 1167 tests++; if (T_add_increment()) succ++; else fail++; 1168 1169 tests++; if (T_magic_constants()) succ++; else fail++; 1170 1171 printf("%d/%d expects succeeded (%d failures)\n", 1172 expect_succ, expect, expect_fail); 1173 printf("%d/%d tests succeeded (%d failures)\n", succ, tests, fail); 1174 /* TODO: Add tests for safe_iopf when upgraded */ 1175 return fail; 1176 } 1177 #endif 1178