www.digitalmars.com         C & C++   DMDScript  

D.gnu - GCC5 adds builtins for overflow checking


A new set of built-in functions for arithmetics with overflow checking
has been added: __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.

void *
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;

On e.g. i?86 or x86-64 the above will result in a mul instruction
followed by a jump on overflow.

Clang had these for quite some time. This might be useful to implement
the core.checkedint for GDC.
Nov 30 2014