Heap Abstractions: The class abstractions that we discussed above are obtained by abstracting each field of base type. The number of instances of that particular class still needs to be bounded; this results in an under-approximation that is still useful for finding bugs. Heap abstractions, on the other hand, abstract the portion of the heap that stores instances of one particular class; therefore, heap abstractions can handle an unbounded number of dynamically allocated objects. These abstractions represent heap cells by shape nodes and sets of indistinguishable runtime locations by a single shape node, called a summary node. For example, a heap abstraction will keep concrete information about memory cells that are directly pointed to by local variables and merge all the memory cells that are not pointed to by a program variable into a summary heap node. Heap abstractions are most often used in static analysis tools, but they are starting to be used in software model-checking approaches.