|
46 | 46 |
|
47 | 47 | #define IS_SAFE_SIZE_T(x) ((x) >= 0 && (unsigned long long)(x) <= SIZE_MAX)
|
48 | 48 |
|
49 |
| -#define IS_MUL_OVERFLOW(m, n) \ |
50 |
| - ((m) != 0 && (n) != 0 && (((size_t)((m)*(n))) != (((size_t)(m)) * ((size_t)(n))))) |
51 |
| - |
52 | 49 | #define IS_SAFE_SIZE_MUL(m, n) \
|
53 | 50 | (IS_SAFE_SIZE_T(m) && IS_SAFE_SIZE_T(n) && \
|
54 |
| - ((m) == 0 || (n) == 0 || (size_t)(n) <= (SIZE_MAX / (size_t)(m))) && \ |
55 |
| - !IS_MUL_OVERFLOW(m, n)) |
| 51 | + ((m) == 0 || (n) == 0 || (size_t)(n) <= (SIZE_MAX / (size_t)(m)))) |
56 | 52 |
|
57 | 53 | #define IS_SAFE_SIZE_ADD(a, b) \
|
58 | 54 | (IS_SAFE_SIZE_T(a) && IS_SAFE_SIZE_T(b) && (size_t)(b) <= (SIZE_MAX - (size_t)(a)))
|
|
75 | 71 | * // Use the allocated array...
|
76 | 72 | */
|
77 | 73 | #define SAFE_SIZE_ARRAY_ALLOC(func, m, n) \
|
78 |
| - (IS_SAFE_SIZE_MUL((m), (n)) ? ((func)((m) * (n))) : FAILURE_RESULT) |
| 74 | + (IS_SAFE_SIZE_MUL((m), (n)) ? ((func)((size_t)(m) * (size_t)(n))) : FAILURE_RESULT) |
79 | 75 |
|
80 | 76 | #define SAFE_SIZE_ARRAY_REALLOC(func, p, m, n) \
|
81 |
| - (IS_SAFE_SIZE_MUL((m), (n)) ? ((func)((p), (m) * (n))) : FAILURE_RESULT) |
| 77 | + (IS_SAFE_SIZE_MUL((m), (n)) ? ((func)((p), (size_t)(m) * (size_t)(n))) : FAILURE_RESULT) |
82 | 78 |
|
83 | 79 | /*
|
84 | 80 | * A helper macro to safely allocate an array of type 'type' with 'n' items
|
|
92 | 88 | * IS_SAFE_... macros to check if the calculations are safe.
|
93 | 89 | */
|
94 | 90 | #define SAFE_SIZE_NEW_ARRAY(type, n) \
|
95 |
| - (IS_SAFE_SIZE_MUL(sizeof(type), (n)) ? (new type[(n)]) : throw std::bad_alloc()) |
| 91 | + (IS_SAFE_SIZE_MUL(sizeof(type), (n)) ? (new type[(size_t)(n)]) : throw std::bad_alloc()) |
96 | 92 |
|
97 | 93 | #define SAFE_SIZE_NEW_ARRAY2(type, n, m) \
|
98 | 94 | (IS_SAFE_SIZE_MUL((m), (n)) && IS_SAFE_SIZE_MUL(sizeof(type), (n) * (m)) ? \
|
99 |
| - (new type[(n) * (m)]) : throw std::bad_alloc()) |
| 95 | + (new type[(size_t)(n) * (size_t)(m)]) : throw std::bad_alloc()) |
100 | 96 |
|
101 | 97 | /*
|
102 | 98 | * Checks if a data structure of size (a + m*n) can be safely allocated
|
103 | 99 | * w/o producing an integer overflow when calculating its size.
|
104 | 100 | */
|
105 | 101 | #define IS_SAFE_STRUCT_SIZE(a, m, n) \
|
106 | 102 | ( \
|
107 |
| - IS_SAFE_SIZE_MUL((m), (n)) && IS_SAFE_SIZE_ADD((m) * (n), (a)) \ |
| 103 | + IS_SAFE_SIZE_MUL((m), (n)) && IS_SAFE_SIZE_ADD((size_t)(m) * (size_t)(n), (a)) \ |
108 | 104 | )
|
109 | 105 |
|
110 | 106 | /*
|
|
116 | 112 | * // Use the allocated memory...
|
117 | 113 | */
|
118 | 114 | #define SAFE_SIZE_STRUCT_ALLOC(func, a, m, n) \
|
119 |
| - (IS_SAFE_STRUCT_SIZE((a), (m), (n)) ? ((func)((a) + (m) * (n))) : FAILURE_RESULT) |
| 115 | + (IS_SAFE_STRUCT_SIZE((a), (m), (n)) ? ((func)((size_t)(a) + (size_t)(m) * (size_t)(n))) : FAILURE_RESULT) |
120 | 116 |
|
121 | 117 |
|
122 | 118 | #endif /* SIZECALC_H */
|
|
1 commit comments
openjdk-notifier[bot] commentedon Nov 30, 2022
Review
Issues