xref: /OK3568_Linux_fs/external/recovery/safe_iop.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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