Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

The result of calling malloc(0) or calloc() to allocate 0 bytes ( - calloc(1,0), calloc(0,0), or calloc(0,1)) - to allocate 0 bytes is undefined. From a practical standpoint, allocating 0 bytes with calloc() and malloc()}} can lead to programming errors with critical security implications, such as buffer overflows. This occurs because the result of allocating 0 bytes with {{calloc() and malloc() may not be considered an error, thus the pointer returned may not be NULL. Instead, the pointer may reference a block of memory on the heap of size zero. If memory is fetched from , or stored in this that location, a location serious error could occur.

Non-

...

Compliant Code Example

...

In this example, a dynamic array of integers is allocated to store s elements. However, if s is zero, the call to {{malloc(s)}} will return a reference to a block of memory of size 0. When data is copied to this location, a heap-buffer overflow will occur.

Code Block
list = (int*)malloc(s);
if (list == NULL) {
  /* Handle Allocation Error */
}
/* Continue Processing list */

Compliant Code Example

...

To assure ensure that zero is never passed as a size argument to malloc(), a check must be made on s to assure ensure it is not zero.

Code Block
if (s== 0) {
  /* Handle Error */
}
list = (int*)malloc(s);
if (list == NULL) {
  /* Handle Allocation Error */
}
/* Continue Processing list */

References