__builtin_add_overflow
,
__builtin_sub_overflow
and __builtin_mul_overflow
and for compatibility with clang also other variants. These
builtins have two integral arguments (which don't need to have
the same type), the arguments are extended to infinite
precision signed type, +
, -
or *
is performed on those, and the result is stored in an integer
variable pointed to by the last argument. If the stored value
is equal to the infinite precision result, the built-in
functions return false
, otherwise true
.
The type of the integer variable that will hold the result can
be different from the types of the first two arguments. The
following snippet demonstrates how this can be used in
computing the size for the calloc
function:
On e.g. i?86 or x86-64 the above will result in avoid * calloc (size_t x, size_t y) { size_t sz; if (__builtin_mul_overflow (x, y, &sz)) return NULL; void *ret = malloc (sz); if (ret) memset (res, 0, sz); return ret; }
mul
instruction followed by a jump on overflow.