Two very powerful ones are the placement of control areas e.g. after arrays by writing a certain unique pattern after the end of the array. If the pattern is destroyed then we know that the process writes out of bounds. Memory coloring tracks the state of each memory chunk as "uninitialized, initialized or freed" and logs violations in the order of access. (Purify)