Designing multithreaded software systems is prone to errors due to the difficulty of reasoning about multiple interleaved
threads of control operating on shared data. Static checking, with the potential to analyze the program’s behavior over all
execution paths and for all thread interleavings, is a powerful debugging tool. We have built a scalable and expressive static
checker called Calvin for multithreaded programs. To handle realistic programs, Calvin performs modular checking of each procedure
called by a thread using specifications of other procedures and other threads. The checker leverages off existing sequential
program verification techniques based on automatic theorem proving. To evaluate the checker, we have applied it to several
real-world programs. Our experience indicates that Calvin has a moderate annotation overhead and can catch defects in multithreaded
programs, including synchronization errors and violation of data invariants.
Supported in part by a NDSEG Fellowship.