| 45044 |      1 | \chapter{Introduction}
 | 
|  |      2 | \label{sec:intro}
 | 
|  |      3 | 
 | 
|  |      4 | This document describes a link between Isabelle/HOL and the \SPARK{}/Ada tool
 | 
|  |      5 | suite for the verification of high-integrity software.
 | 
|  |      6 | Using this link, verification problems can be tackled that are beyond reach
 | 
|  |      7 | of the proof tools currently available for \SPARK{}. A number of examples
 | 
|  |      8 | can be found in the directory \texttt{HOL/SPARK/Examples} in the Isabelle
 | 
|  |      9 | distribution. An open-source version of the \SPARK{} tool suite is available
 | 
|  |     10 | free of charge from \hbox{\href{http://libre.adacore.com}{libre.adacore.com}}.
 | 
|  |     11 | 
 | 
|  |     12 | In the remainder of \secref{sec:intro},
 | 
|  |     13 | we give an introduction to \SPARK{} and the HOL-\SPARK{} link. The verification
 | 
|  |     14 | of an example program is described in \secref{sec:example-verification}. In
 | 
|  |     15 | \secref{sec:vc-principles}, we explain the principles underlying the generation
 | 
|  |     16 | of verification conditions for \SPARK{} programs. Finally, \secref{sec:spark-reference}
 | 
|  |     17 | describes the commands provided by the HOL-\SPARK{} link, as well as the encoding
 | 
|  |     18 | of \SPARK{} types in HOL.
 | 
|  |     19 | 
 | 
|  |     20 | \section{\SPARK{}}
 | 
|  |     21 | 
 | 
|  |     22 | \SPARK{} \cite{Barnes} is a subset of the Ada language that has been designed to
 | 
|  |     23 | allow verification of high-integrity software. It is missing certain features of
 | 
|  |     24 | Ada that can make programs difficult to verify, such as \emph{access types},
 | 
|  |     25 | \emph{dynamic data structures}, and \emph{recursion}. \SPARK{} allows to prove
 | 
|  |     26 | absence of \emph{runtime exceptions}, as well as \emph{partial correctness}
 | 
|  |     27 | using pre- and postconditions. Loops can be annotated with \emph{invariants},
 | 
|  |     28 | and each procedure must have a \emph{dataflow annotation}, specifying the
 | 
|  |     29 | dependencies of the output parameters on the input parameters of the procedure.
 | 
|  |     30 | Since \SPARK{} annotations are just written as comments, \SPARK{} programs can be
 | 
|  |     31 | compiled by an ordinary Ada compiler such as GNAT. \SPARK{} comes with a number
 | 
|  |     32 | of tools, notably the \emph{Examiner} that, given a \SPARK{} program as an input,
 | 
|  |     33 | performs a \emph{dataflow analysis} and generates \emph{verification conditions}
 | 
|  |     34 | (VCs) that must be proved in order for the program to be exception-free and partially
 | 
|  |     35 | correct. The VCs generated by the Examiner are formulae expressed in
 | 
|  |     36 | a language called FDL, which is first-order logic extended with
 | 
|  |     37 | arithmetic operators, arrays, records, and enumeration types. For example,
 | 
|  |     38 | the FDL expression
 | 
|  |     39 | \begin{alltt}
 | 
|  |     40 |   for_all(i: integer, ((i >= min) and (i <= max)) ->
 | 
|  |     41 |     (element(a, [i]) = 0))
 | 
|  |     42 | \end{alltt}
 | 
|  |     43 | states that all elements of the array \texttt{a} with indices greater or equal to
 | 
|  |     44 | \texttt{min} and smaller or equal to \texttt{max} are $0$.
 | 
|  |     45 | VCs are processed by another \SPARK{} tool called the
 | 
|  |     46 | \emph{Simplifier} that either completely solves VCs or transforms them
 | 
|  |     47 | into simpler, equivalent conditions. The latter VCs
 | 
|  |     48 | can then be processed using another tool called
 | 
|  |     49 | the \emph{Proof Checker}. While the Simplifier tries to prove VCs in a completely
 | 
|  |     50 | automatic way, the Proof Checker requires user interaction, which enables it to
 | 
|  |     51 | prove formulae that are beyond the scope of the Simplifier. The steps
 | 
|  |     52 | that are required to manually prove a VC are recorded in a log file by the Proof
 | 
|  |     53 | Checker. Finally, this log file, together with the output of the other \SPARK{} tools
 | 
|  |     54 | mentioned above, is read by a tool called POGS (\textbf{P}roof \textbf{O}bli\textbf{G}ation
 | 
|  |     55 | \textbf{S}ummariser) that produces a table mentioning for each VC the method by which
 | 
|  |     56 | it has been proved.
 | 
|  |     57 | In order to overcome the limitations of FDL and to express complex specifications,
 | 
|  |     58 | \SPARK{} allows the user to declare so-called
 | 
|  |     59 | \emph{proof functions}. The desired properties of such functions are described
 | 
|  |     60 | by postulating a set of rules that can be used by the Simplifier and Proof Checker
 | 
|  |     61 | \cite[\S 11.7]{Barnes}. An obvious drawback of this approach is that incorrect
 | 
|  |     62 | rules can easily introduce inconsistencies.
 | 
|  |     63 | 
 | 
|  |     64 | \section{HOL-\SPARK{}}
 | 
|  |     65 | 
 | 
|  |     66 | The HOL-\SPARK{} verification environment, which is built on top of Isabelle's object
 | 
|  |     67 | logic HOL, is intended as an alternative
 | 
|  |     68 | to the \SPARK{} Proof Checker, and improves on it in a number of ways.
 | 
|  |     69 | HOL-\SPARK{} allows Isabelle to directly parse files generated
 | 
|  |     70 | by the Examiner and Simplifier, and provides a special proof command to conduct
 | 
|  |     71 | proofs of VCs, which can make use of the full power of Isabelle's rich
 | 
|  |     72 | collection of proof methods.
 | 
|  |     73 | Proofs can be conducted using Isabelle's graphical user interface, which makes
 | 
|  |     74 | it easy to navigate through larger proof scripts. Moreover, proof functions
 | 
|  |     75 | can be introduced in a \emph{definitional} way, for example by using Isabelle's
 | 
|  |     76 | package for recursive functions, rather than by just stating their properties as axioms,
 | 
|  |     77 | which avoids introducing inconsistencies.
 | 
|  |     78 | 
 | 
|  |     79 | \begin{figure}
 | 
|  |     80 | \begin{center}
 | 
|  |     81 | \begin{tikzpicture}
 | 
|  |     82 | \tikzstyle{box}=[draw, drop shadow, fill=white, text width=3.5cm, text centered]
 | 
|  |     83 | \tikzstyle{rbox}=[draw, drop shadow, fill=white, rounded corners, minimum height=1cm]
 | 
|  |     84 | 
 | 
|  |     85 | \node[box] (src) at (5,0) {Source files (\texttt{*.ads, *.adb})};
 | 
|  |     86 | \node[rbox] (exa) at (5,-2) {Examiner};
 | 
|  |     87 | \node[box] (fdl) at (0.5,-4) {FDL declarations \\ (\texttt{*.fdl})};
 | 
|  |     88 | \node[box] (vcs) at (5,-4) {VCs \\ (\texttt{*.vcg})};
 | 
|  |     89 | \node[box] (rls) at (9.5,-4) {Rules \\ (\texttt{*.rls})};
 | 
|  |     90 | \node[rbox] (simp) at (5,-6) {Simplifier};
 | 
|  |     91 | \node[box] (siv) at (5,-8) {Simplified VCs \\ (\texttt{*.siv})};
 | 
|  |     92 | \node[rbox] (isa) at (5,-10) {HOL-\SPARK{}};
 | 
|  |     93 | \node[box] (thy) at (9.5,-10) {Theory files \\ (\texttt{*.thy})};
 | 
|  |     94 | \node[box] (prv) at (5,-12) {Proof review files \\ (\texttt{*.prv})};
 | 
|  |     95 | \node[rbox] (pogs) at (5,-14) {POGS};
 | 
|  |     96 | \node[box] (sum) at (5,-16) {Summary file \\ (\texttt{*.sum})};
 | 
|  |     97 | 
 | 
|  |     98 | \draw[-latex] (src) -- (exa);
 | 
|  |     99 | \draw[-latex] (exa) -- (fdl);
 | 
|  |    100 | \draw[-latex] (exa) -- (vcs);
 | 
|  |    101 | \draw[-latex] (exa) -- (rls);
 | 
|  |    102 | \draw[-latex] (fdl) -- (simp);
 | 
|  |    103 | \draw[-latex] (vcs) -- (simp);
 | 
|  |    104 | \draw[-latex] (rls) -- (simp);
 | 
|  |    105 | \draw[-latex] (simp) -- (siv);
 | 
|  |    106 | \draw[-latex] (fdl) .. controls (0.5,-8) .. (isa);
 | 
|  |    107 | \draw[-latex] (siv) -- (isa);
 | 
|  |    108 | \draw[-latex] (rls) .. controls (9.5,-8) .. (isa);
 | 
|  |    109 | \draw[-latex] (thy) -- (isa);
 | 
|  |    110 | \draw[-latex] (isa) -- (prv);
 | 
|  |    111 | \draw[-latex] (vcs) .. controls (-1,-6) and (-1,-13) .. (pogs);
 | 
|  |    112 | \draw[-latex] (siv) .. controls (1,-9) and (1,-12) .. (pogs);
 | 
|  |    113 | \draw[-latex] (prv) -- (pogs);
 | 
|  |    114 | \draw[-latex] (pogs) -- (sum);
 | 
|  |    115 | \end{tikzpicture}
 | 
|  |    116 | \end{center}
 | 
|  |    117 | \caption{\SPARK{} program verification tool chain}
 | 
|  |    118 | \label{fig:spark-toolchain}
 | 
|  |    119 | \end{figure}
 | 
|  |    120 | Figure \ref{fig:spark-toolchain} shows the integration of HOL-\SPARK{} into the
 | 
|  |    121 | tool chain for the verification of \SPARK{} programs. HOL-\SPARK{} processes declarations
 | 
|  |    122 | (\texttt{*.fdl}) and rules (\texttt{*.rls}) produced by the Examiner, as well as
 | 
|  |    123 | simplified VCs (\texttt{*.siv}) produced by the \SPARK{} Simplifier. Alternatively,
 | 
|  |    124 | the original unsimplified VCs (\texttt{*.vcg}) produced by the Examiner can be
 | 
|  |    125 | used as well. Processing of the \SPARK{} files is triggered by an Isabelle
 | 
|  |    126 | theory file (\texttt{*.thy}), which also contains the proofs for the VCs contained
 | 
|  |    127 | in the \texttt{*.siv} or \texttt{*.vcg} files. Once that all verification conditions
 | 
|  |    128 | have been successfully proved, Isabelle generates a proof review file (\texttt{*.prv})
 | 
|  |    129 | notifying the POGS tool of the VCs that have been discharged.
 |