The FLINT Project

Research

People

Publications

Software

Support

Links

Internal

Research Overview

Last modified: Tue Apr 17 17:28:22 2007 GMT.

The correctness of computer software is vital to the world's safety-critical systems (where software bugs can cause injury or death) and security-critical applications (where an attacker is deliberately searching for, and exploiting, software bugs). Among all the engineering disciplines, computer software is probably today's least reliable artifact widely used in our society. Every year major corporations and government agencies worldwide invest huge amounts of resources fixing software bugs, but the prospect of building reliable software remains grim. An important reason for this difficulty comes from the sheer complexity of software systems: if each line in a program is considered as an individual part, software programs are easily the most complicated things people have ever built. Nevertheless, a software program is strictly a mathematical entity; if all hardware components perform as expected, the behavior of each software program (including the underlying operating system) should be possible to rigorously specify and reason about.

The FLINT group is interested in attacking the following pressing question on software reliability: "Is it possible to build certified bug-free software? If yes, how to develop new tools that would make writing certified programs easier, more scalable, and more accessible?" We intend to construct a practical infrastructure for building large-scale certified systems software, focusing on the development of integrated programming and proof tools and new program verification techniques.

Certified software consists of a machine executable plus a complete rigorous proof (also stored inside a computer) that the software is free of bugs with respect to a particular specification. Both the proof and the specification are written using a general-purpose mathematical logic, the same logic which we use (in reasoning) in our daily life. The logic is also a programming language: everything written in logic (including proofs and specifications) is developed using a software known as proof assistants; they can be mechanically checked for correctness by a small program known as proof checker. As long as the logic we use is consistent, and the specification meets what the user wants, we can be sure that the underlying software is free of bugs with respect to the specification. A developer writing certified software need to put in much more work initially since she also has to build the proof. Machine checked proofs of real software systems are difficult but are now possible given the recent advances in the theory and engineering of mechanized proof systems applied to software verification.

Software at different scale has different cost-benefits from verification. For example, software that controls the anti-lock brake system must be proved correct in the entire software-hardware stack of an automobile; software that controls the web server must be proved resistant of certain kinds of attacks; on the other hand, many large business applications would be inappropriate to be fully specified and proved correct, however, the protection mechanism of the operation system (or runtime system) in which they operate might well be proved correct to guard against the uncontrolled exchanges of data.

Certifying large software requires more powerful and integrated programming and proof tools. We will apply language-based techniques (for building large software) to make existing proof assistants more suitable for building large proofs. Both Coq and Isabelle/HOL were primarily developed for reasoning about mathematics. To use them to reason about low-level code, we must add support for general-purpose programming constructs and machine-level instructions and data types. Proofs should also be more modular and readable. We will develop a shared program logic with independent proof checker so that certified code developed for different languages, in different proof assistants, can be reused and linked together. Certified software would only be practical if the underlying core system software (e.g., operating system kernels, device drivers) are also certified. We will develop new formal frameworks (including innovative program logics and type systems) for reasoning about vanilla C and assembly programs. We will also build certified (and certifying) compilers, program verifiers, and analysis tools to support better proof automation.

If successful, the technology of building certified software will have a profound impact on the software industry and the society in general. It will dramatically improve the reliability and security of many key components in the world's critical infrastructure. It will advance the human knowledge on what is possible in building bug-free software and whether future software will ever be built on top of a reliable core. Software components with machine-checkable specifications and proofs will be easier to understand, more maintainable, and more portable.


Copyright © 1996-2007 The FLINT Group <flint at cs dot yale dot edu>
Yale University Department of Computer Science
Validate this page
colophon