stdckdint —
checked integer arithmetic
#include
<stdckdint.h>
bool
ckd_add(type1
*result, type2 a,
type3 b);
bool
ckd_sub(type1
*result, type2 a,
type3 b);
bool
ckd_mul(type1
*result, type2 a,
type3 b);
The function-like macros ckd_add,
ckd_sub, and ckd_mul perform
checked integer addition, subtraction, and multiplication, respectively. If
the result of adding, subtracting, or multiplying a
and b as if their respective types had infinite range
fits in type1, it is stored in the location pointed to
by result and the macro evaluates to
false. Otherwise, the macro evaluates to
true and the contents of the location pointed to by
result is the result of the operation wrapped to the
range of type1.
The ckd_add,
ckd_sub, and ckd_mul macros
evaluate to true if the requested operation
overflowed the result type and false otherwise.
#include <assert.h>
#include <limits.h>
#include <stdckdint.h>
int main(void)
{
int result;
assert(!ckd_add(&result, INT_MAX, 0));
assert(result == INT_MAX);
assert(ckd_add(&result, INT_MAX, 1));
assert(result == INT_MIN);
assert(!ckd_sub(&result, INT_MIN, 0));
assert(result == INT_MIN);
assert(ckd_sub(&result, INT_MIN, 1));
assert(result == INT_MAX);
assert(!ckd_mul(&result, INT_MAX / 2, 2));
assert(result == INT_MAX - 1);
assert(ckd_mul(&result, INT_MAX / 2 + 1, 2));
assert(result == INT_MIN);
return 0;
}
The ckd_add,
ckd_sub, and ckd_mul macros
were first introduced in FreeBSD 14.0.
The ckd_add,
ckd_sub, and ckd_mul macros
and this manual page were written by Dag-Erling
Smørgrav
<des@FreeBSD.org>.