Proving that a program never crashes, never returns the wrong answer, never violates a security policy â that is the dream of formal verification. The obstacle has always been the same: real programs have a staggering number of possible states, far too many to check one by one.
Predicate abstraction is the key insight. Instead of tracking every possible value of every variable, you track only a handful of predicates â simple yes/no questions like "is x > 0?" or "is lock held?". This crushes millions of concrete states into a tiny abstract model that a model checker can fully explore in seconds.
But abstraction is lossy. The abstract model may contain behaviors the real program cannot. When the model checker finds a path to an error, that path might be spurious â a ghost that only exists in the abstraction. The CEGAR loop (Counterexample-Guided Abstraction Refinement), introduced by Edmund Clarke and colleagues in 2000, turns these ghosts into teachers: each spurious counterexample reveals exactly which new predicate to add, making the abstraction sharper until either a real bug is confirmed or the model is proved safe.
The loop â abstract, check, diagnose, refine â is now the backbone of industrial software verification tools like SLAM (which found driver bugs in Windows) and BLAST, and it sits at the heart of tools like CPAchecker and CBMC.
Comments
Loading comments...