@node Safe Allocation Macros
@section Safe Allocation Macros

@mindex safe-alloc
The standard C library malloc/realloc/calloc/free APIs are prone to a
number of common coding errors.  The @code{safe-alloc} module provides
macros that make it easier to avoid many of them.  It still uses the
standard C allocation functions behind the scenes.

This module is obsolete, as it does not seem to have caught on in
practice and some of its features could not be ported to unusual
platforms.

Some of the memory allocation mistakes that are commonly made are

@itemize @bullet
@item
passing the incorrect number of bytes to @code{malloc}, especially
when allocating an array,
@item
unchecked integer overflow when calculating array sizes,
@item
fail to check the return value of @code{malloc} and @code{realloc} for
errors,
@item
forget to fully initialize memory just allocated with @code{malloc},
@item
duplicate calls to @code{free} by forgetting to set the pointer
variable to @code{NULL},
@item
leaking memory in calls to @code{realloc} when that call fails.
@end itemize

The @code{safe-alloc} module addresses these problems in the following way:

@itemize @bullet
@item
It defines macros that wrap around the standard C allocation
functions.  That makes it possible to use the compiler's knowledge of
the size of objects for allocation; it also allows setting pointers
passed in as arguments when appropriate.
@item
It uses return values only for a success/failure error condition flag,
and annotates them with GCC's @code{__warn_unused_result__} attribute.
@item
When allocating a fresh array, it uses @code{calloc} instead of
@code{malloc} so that the array's contents are zeroed.
However, memory added to an already-existing array is uninitialized.
@end itemize

@defmac {int} ALLOC (ptr)
@findex ALLOC
Allocate @code{sizeof *ptr} bytes of memory and store the address of
allocated memory in @code{ptr}.  Fill the newly allocated memory with
zeros.

Returns @minus{}1 on failure, 0 on success.
@end defmac

@defmac {int} ALLOC_N (ptr, count)
@findex ALLOC_N
Allocate an array of @code{count} elements, each @code{sizeof *ptr}
bytes long, and store the address of allocated memory in
@code{ptr}.  Fill the newly allocated memory with zeros.

Returns @minus{}1 on failure, 0 on success.
@end defmac

@defmac {int} ALLOC_N_UNINITIALIZED (ptr, count)
@findex ALLOC_N_UNINITIALIZED
Allocate an array of @code{count} elements, each @code{sizeof *ptr}
bytes long, and store the address of allocated memory in
@code{ptr}.  The allocated memory is not initialized.

Returns @minus{}1 on failure, 0 on success.
@end defmac

@defmac {void} FREE (ptr)
@findex FREE
Free the memory stored in @code{ptr} and set @code{ptr} to
@code{NULL}.
@end defmac
