Techniques and tools are described for analyzing software. For example, an
analysis tool performs abstract interpretation with a congruence abstract
domain and/or a heap succession abstract domain. For the congruence
abstract domain, the tool tracks equivalence classes between alien
expressions and base domain variables. For the heap succession abstract
domain, the tool tracks updates to a heap. In either case, to preserve
information after updates, the tool may identify an expression having an
unreachable value then determine an equivalent expression that lacks the
unreachable value.