1. Background

Dynamic storage allocation plays an important role in C programming; it is also the breeding ground of numerous hard-to-track-down bugs. Freeing an allocated block twice, running off the edge of the malloc'ed buffer, and failing to keep track of addresses of allocated blocks are common errors which frustrate the programmer - debugging them is very difficult due to the errors manifesting themselves as mysterious behavior at places far off from the point where the programmer actually committed the blunder.