Semantics and application to program verification

Project

The goal of the project is to write a simple static analyzer by abstract interpretation in OCaml to discover automatically numeric invariants about the variables of programs written in a simple programming language.

The project is due on the day of the exam, on May the 28th. The project should be sent by email to the teachers.

Result

For the project, you should deliver an archive that contains the following items:

Required features

Input language

The input language can be based on the language used in the lab session, or you can design your own language with similar features. To get started, you can download the codeV1x.tgz package (see the first practical session for an explanation of the syntax of the language).

More precisely, the language must feature at least:

(You are free to reject programs using other language constructions, such as functions, non-integer variable declarations, gotos, etc.)

Analysis

The analyzer should contain an iterator that analyzes the program forwards, by induction on the abstract syntax tree. Loops can be unrolled a fixed number of times (e.g., 3 times), but you should ultimately use iterations with widening in order to always terminate for domains with infinite increasing chains. To increase the precision, the first few (e.g., 3) applications of the widening may be replaced with a join.

The analysis should be parametric in the choice of a numeric abstract domain. At least the three following domains must be provided:

Depending on the domain, at least the following kinds of expressions should be handled precisely:

All the expressions allowed in the program syntax must be handled (no "not implemented" exception); however, any expression not belonging to the above categories may be handled in a coarse way (e.g., considering assignments as non-deterministic and ignoring conditions).

Output

The analysis should at least output a textual file containing:

For debugging, it can be useful to implement a trace mode that outputs the abstract element computed at each step of the analysis.

Tests

To help you test your analyzer, we provide a set of small test programs, written in the small language used in the practical sessions. We also provide the output of their analysis using our reference analyzer, so that you can easily check the correctness and the precision of your analyzer.

Extensions

In addition to the mandatory features described above, you may implement one or several extensions, such as for instance:

Resources

Files

Documentation



Author: Antoine Miné