Model checking is a proven successful technology for verifying hardware. It works, however, on only nite state machines, and most software systems have innitely many states. Our approach to applying model checking to software hinges on identifying appropriate abstractions that exploit the nature of both the system, S, and the property, , t o b e v eried. We c heck on an abstracted, but nite, model of S. Following this approach w e v eried three cache coherence protocols used in distributed le systems. These protocols have to satisfy this property: \If a client believes that a cached le is valid then the authorized server believes that the client's copy i s v alid." In our nite model of the system, we need only represent the \beliefs" that a client and a server have about a cached le; we can abstract from the caches, the les' contents, and even the les themselves. Moreover, by successive application of the generalization rule from predicate logic, we need only consider a model with at most two clients, one server, and one le. We used McMillan's SMV model checker; on our most complicated protocol, SMV took less than 1 second to check o v er 43,600 reachable states.
Motivation: Theorem Proving and Model CheckingSoftware systems keep growing in size and complexity. Many large, complex software systems must guarantee certain critical functional, real-time, faulttolerant, and performance properties. Proving that such a system satises these kinds of properties can increase our condence that it will operate correctly and reliably. Proofs based on formal, rather than informal, techniques make our reasoning precise; moreover, they are amenable to mechanical aids such a s syntax and semantics checkers. Formal reasoning entails comparing two formal objects, e.g., establishing the correctness of a program with respect to a specication or showing that one concurrent process simulates another. The starting point i s h a ving two formal objects. There are two general approaches to showing the correspondence between these two objects: theorem proving and model checking. We argue that model checking should and will play a larger role in reasoning about software systems than it does today.The traditional approach to formal reasoning about software is program verication where one formal object is the program text and the other is a specication written in some mathematical logic. The formal technique used to show a correspondence between the two objects is based on theorem proving. Over time this approach has been shown to work on increasingly larger and larger programs, especially as the tool support like theorem provers and proof checkers has become more and more sophisticated. Yet, it still has drawbacks:The size of a program we can prove correct is on the order of only a couple thousand lines of code [14].To do such a proof requires highly-skilled people, such as theorem-proving experts, domain experts, or both.The human time to do such a proof is on the order of months or even years; the machine time, on the order of ho...