How does malloc work?
CBMC has several models of malloc.
In one model of malloc (the default model), the function never fails
to allocate an object on the heap and always returns a valid pointer to a
valid object. In particular, malloc will never return NULL,
malloc will never run out of memory, and malloc will never fail.
This is a problem if you are using CBMC to check for memory safety issues,
because malloc can fail and return NULL, and trying to dereference a
null pointer is one of the issues you want to check for.
In other models of malloc, the function can nondeterministically
choose to fail and return NULL, and the function will fail if it is
asked to allocate an object that is larger than CBMC can model (see
the notion of object bits in the discussion of the
CBMC memory model). These models of malloc are used
when CBMC is invoked with the
flags --malloc-may-fail and --malloc-fail-null.
We recommend that you use --malloc-may-fail and --malloc-fail-null.
Do not use the default model of malloc.
The CBMC starter kit uses both flags by default.
One last comment about malloc: The invocation malloc(0) can return
a valid pointer to nothing.
The C standard says that invoking malloc with size 0
should return a pointer that can be passed to free but cannot be
dereferenced.