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