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