c-template
safe_math.c
Go to the documentation of this file.
1 #include <limits.h>
2 #include <stdbool.h>
3 #include "../../include/utils/safe_math.h"
4 
5 int safe_add_int(int x, int y, bool *passed) {
6  if (x > INT_MAX - y) {
7  *passed = false;
8  return -1;
9  }
10  *passed = true;
11  return x + y;
12 }
13 
14 // subtracts y from x (this might be incorrect)
15 int safe_sub_int(int x, int y, bool *passed) {
16  if (x - y > x) {
17  *passed = false;
18  return -1;
19  }
20  *passed = true;
21  return x - y;
22 }
23 
24 // divides x by y
25 int safe_div_int(int x, int y, bool *passed) {
26  if (y == 0) {
27  *passed = false;
28  return -1;
29  }
30  *passed = true;
31  return x / y;
32 }
33 
34 // modulo x by y
35 int safe_mod_int(int x, int y, bool *passed) {
36  if (y == 0) {
37  *passed = false;
38  return -1;
39  }
40  *passed = true;
41  return x % y;
42 }
43 // subtracts y from x
44 unsigned int safe_sub_uint(unsigned int x, unsigned int y, bool *passed) {
45  if (y > x) {
46  *passed = false;
47  return 0;
48  }
49  *passed = true;
50  return x - y;
51 }
52 
53 // adds x to y
54 unsigned int safe_add_uint(unsigned int x, unsigned int y, bool *passed) {
55  if (x + y < x || x + y < y) {
56  *passed = false;
57  return 0;
58  }
59  *passed = true;
60  return x + y;
61 }
62 
63 // divides x by y
64 unsigned int safe_div_uint(unsigned int x, unsigned int y, bool *passed) {
65  if (y == 0) {
66  *passed = false;
67  return 0;
68  }
69  *passed = true;
70  return x / y;
71 }
72 
73 // modulo x by y
74 unsigned int safe_mod_uint(unsigned int x, unsigned int y, bool *passed) {
75  if (y == 0) {
76  *passed = false;
77  return 0;
78  }
79  *passed = true;
80  return x % y;
81 }
82 
83 // multiply x by y
84 unsigned int safe_mul_uint(unsigned int x, unsigned int y, bool *passed) {
85  if (x == 0 || y == 0) {
86  *passed = true;
87  return 0;
88  }
89  unsigned int z = x * y;
90  if (z < x || z < y) {
91  *passed = false;
92  return 0;
93  }
94  *passed = true;
95  return z;
96 }
safe_mul_uint
unsigned int safe_mul_uint(unsigned int x, unsigned int y, bool *passed)
Definition: safe_math.c:84
safe_mod_uint
unsigned int safe_mod_uint(unsigned int x, unsigned int y, bool *passed)
Definition: safe_math.c:74
safe_add_int
int safe_add_int(int x, int y, bool *passed)
Definition: safe_math.c:5
safe_sub_int
int safe_sub_int(int x, int y, bool *passed)
Definition: safe_math.c:15
safe_div_uint
unsigned int safe_div_uint(unsigned int x, unsigned int y, bool *passed)
Definition: safe_math.c:64
safe_add_uint
unsigned int safe_add_uint(unsigned int x, unsigned int y, bool *passed)
Definition: safe_math.c:54
safe_div_int
int safe_div_int(int x, int y, bool *passed)
Definition: safe_math.c:25
safe_mod_int
int safe_mod_int(int x, int y, bool *passed)
Definition: safe_math.c:35
safe_sub_uint
unsigned int safe_sub_uint(unsigned int x, unsigned int y, bool *passed)
Definition: safe_math.c:44