summaryrefslogblamecommitdiff
path: root/rapport.tm
blob: cb9a68b4a0d996c2390c1682e7c53c83f64e9f2b (plain) (tree)

















































































































































































































































































































































                                                                                                                                          
<TeXmacs|1.0.7.21>

<style|<tuple|article|french>>

<\body>
  <doc-data|<doc-title|Rapport de projet : interpr�tation
  abstraite>|<doc-author|<author-data|<author-name|Alex AUVOLAT>>>>

  <section|Introduction>

  <subsection|Analyse statique abstraite>

  L'analyse statique abstraite d'un programme consiste � ex�cuter ce
  programme non pas sur une entr�e particuli�re mais sur un domaine abstrait
  qui repr�sente toute un ensemble de donn�es possibles. Cette fa�on de
  tester permet de d�couvrir des propri�t�s qui sont vraies quelle que soit
  l'entr�e sur laquelle le programme est ex�cut�, et ce en une seule passe
  d'analyse statique (dont on est s�re qu'elle termine - contrairement au
  programme lui-m�me).

  L'analyse abstraite consiste � faire se propager le domaine abstrait � tous
  les points du programme. En pla�ant des assertions � des endroits
  judicieux, on peut s'assurer que certaines conditions sont toujours
  v�rifi�es.

  Le domaine abstrait ne peut pas repr�senter avec la pr�cision n�cessaire
  (infinie) exactement tous les �tats du programme, c'est pourquoi nous
  sommes oblig�s d'en consid�rer une sur-approximation. Le but du jeu �tant
  d'avoir la sur-approximation avec le moins de marge par rapport aux
  ensembles d'�tats concrets repr�sent�s, afin de pouvoir prouver un maximum
  de propri�t�s.

  <subsection|Notre t�che>

  Dans le cadre du cours \S s�mantique et application � la v�rification de
  programmes \T, nous avons eu � travailler sur un interpr�teur abstrait pour
  un fragment du langage C. Le travail minimum demand� comportait les aspects
  suivants :

  <\itemize>
    <item>D�finition d'un interpr�teur sur un domaine abstrait prenant en
    compte les d�clarations de variables locales, les affectations, ainsi que
    les constructions <verbatim|if>, <verbatim|while>, <verbatim|assert>,
    <verbatim|print>, <verbatim|halt> ;

    <item>Prise en charge du non-d�terminisme (fonction <verbatim|rand>) ;

    <item>Interpr�tation possible dans plusieurs domaines abstraits : deux
    domaines non-relationnels (treillis des constantes et treillis des
    intervalles) et un domaine relationnel (domaine des polyh�dres).
  </itemize>

  Notre code s'appuie sur de nombreux �l�ments ext�rieurs :

  <\itemize>
    <item>La biblioth�que <name|zarith>, pour la manipulation d'entiers en
    pr�cision arbitraire ;

    <item>La biblioth�que <name|apron>, pour la manipulation du domaine des
    polyh�dres ;

    <item>Un lexer et un parser pour notre fragment de C fourni par
    l'enseignant.
  </itemize>

  <section|D�coupage des modules>

  Pour r�aliser ce projet, nous avons tent� de factoriser notre code au
  maximum. Gr�ce � une interface de modules et de foncteurs astucieuse, nous
  avons �crit un code dont la partie \S interpr�tation abstraite \T fait
  moins de 1000 lignes. Nous pr�sentons maintenant des extraits de cette
  interface, largement inspir�e de celle propos�e par l'enseignant dans les
  transparents de son cours \S Abstract Interpretation II \T.

  Dans tout le code, les entiers sont repr�sent�s par le type <verbatim|Z.t>
  de la biblioth�que <name|zarith>, qui permet de manipuler des entiers en
  pr�cision arbitraire.

  <subsection|La signature de module <verbatim|ENVIRONMENT_DOMAIN>>

  Cette signature de module d�finit les fonctions que doivent impl�menter
  tout module pouvant �tre utilis� comme domaine abstrait (relationnel ou non
  relationnel). Il est utilis� pour param�trer le module
  <verbatim|Interpret.Make>, qui contient le c�ur de l'interpr�teur abstrait.

  <verbatim|>

  <\itemize>
    <item><verbatim|type t>

    Le type abstrait repr�sentant un environnement abstrait de notre
    interpr�teur.

    <item><verbatim|val init, bottom : t>

    Repr�sentations respectives de <math|\<top\>> et <math|\<bot\>>. Remarque
    : l'environnement repr�sentant <math|\<top\>> est diff�rent en fonction
    des variables que cet environnement contient. <verbatim|init> est
    l'environnement <math|\<top\>> ne contenant aucune variable. Il y a une
    fonction de test <verbatim|is_bot> mais pas de test <verbatim|is_top> car
    celui-ci n'est pas n�cessaire.

    <item><verbatim|val addvar, rmvar : t -\<gtr\> id -\<gtr\> t>

    Ajoute une variable � un environnement (elle est initialis�e sans aucune
    contrainte, c'est-�-dire � <math|\<top\>> dans le cas des environnements
    non-relationnels) ; supprime une variable d'un environnement.

    <item><verbatim|val assign : t -\<gtr\> id -\<gtr\> expr ext -\<gtr\> t>

    R�alise l'affectation d'une expression � une variable :
    <math|S<around*|\<llbracket\>|x\<leftarrow\>e|\<rrbracket\>>>.

    <item><verbatim|val compare_leq, compare_eq : t -\<gtr\> expr ext
    -\<gtr\> expr ext -\<gtr\> t>

    Restreint le domaine abstrait � une portion v�rifiant une �quation :
    <math|S<around*|\<llbracket\>|e<rsub|1>\<leqslant\>e<rsub|2>?|\<rrbracket\>>>
    et <math|S<around*|\<llbracket\>|e<rsub|1>=e<rsub|2>?|\<rrbracket\>>>.

    <item><verbatim|val join, meet, widen : t -\<gtr\> t -\<gtr\> t>

    Impl�mentation de l'union abstraite <math|\<sqcup\>>, de l'intersection
    abstraite <math|\<sqcap\>> et de l'op�ration de widening
    <math|\<nabla\>>.

    <item><verbatim|val subset: t -\<gtr\> t -\<gtr\> bool>

    Impl�mentation de la condition d'inclusion <math|\<sqsubseteq\>>. Une
    seule implication : <verbatim|subset a b>
    <math|\<Rightarrow\>a\<sqsubseteq\>b>.
  </itemize>

  \ 

  <subsection|La signature de module <verbatim|VALUE_DOMAIN>>

  Cette signature de module d�finit les fonctions requises pour tout module
  d�crivant un domaine de valeurs pour une abstraction non relationnelle.
  Cette signature est le param�tre du module <verbatim|NonRelationnal> qui
  contient le code g�n�rique pour un <verbatim|ENVIRONMENT_DOMAIN> non
  relationnel.

  <\itemize>
    <item><verbatim|type t>

    Le type abstrait d'une valeur abstraite

    <item><verbatim|val top, bottom : t>

    Les repr�sentations de <math|\<top\>> et <math|\<bot\>>. Il n'y a pas de
    fonctions de tests <verbatim|is_bot> et <verbatim|is_top>, les
    repr�sentations sont uniques.

    <item><verbatim|val const : Z.t -\<gtr\> t>

    Obtenir la repr�sentation d'une constante.

    <item><verbatim|val rand : Z.t -\<gtr\> Z.t -\<gtr\> t>

    Obtenir la repr�sentation d'un intervalle.

    <item><verbatim|val subset : t -\<gtr\> t -\<gtr\> bool>

    Impl�mentation de la relation d'inclusion <math|\<sqsubset\>> sur les
    valeurs.

    <item><verbatim|val join, meet, widen : t -\<gtr\> t -\<gtr\> t>

    Impl�mentation de l'union <math|\<sqcup\>>, de l'intersection
    <math|\<sqcap\>> et du widening <math|\<nabla\>>.

    <item><verbatim|val neg : t -\<gtr\> t>

    N�gation unaire abstraite

    <item><verbatim|val add, sub, mul, div, rem : t -\<gtr\> t -\<gtr\> t>

    Op�rateurs binaires abstraits

    <item><verbatim|val leq : t -\<gtr\> t -\<gtr\> t * t>

    Restreint deux valeurs <math|a\<nocomma\>> et <math|b> aux meilleurs
    sur-approximations que l'on peut avoir en restreignant le domaine avec
    une condition de la forme <math|a\<leqslant\>b>.
  </itemize>

  <subsection|Le module <verbatim|Constants>>

  Ce module impl�mente un <verbatim|VALUE_DOMAIN> correspondant au treillis
  des constantes. Le code est extr�mement simple et impl�mente directement la
  s�mantique vue en cours.

  <subsection|Le module <verbatim|Intervals>>

  Ce module impl�mente un <verbatim|VALUE_DOMAIN> correspondant au treillis
  des intervales. Le code est extr�mement simple et impl�mente directement la
  s�mantique vue en cours.

  <subsection|Le module <verbatim|NonRelationnal>>

  Ce module impl�mente toutes les fonctions communes aux domaines
  non-relationnels (constantes, intervalles). Il est param�tr� par un
  <verbatim|VALUE_DOMAIN> <verbatim|V>.

  <\itemize>
    <item>Le type <verbatim|t> repr�sentant un environnement abstrait est
    soit un map des identifieurs vers les �l�ments de <verbatim|V>, soit
    <math|\<bot\>>. D�s qu'une valeur vaur <math|\<bot\>>, on s'interdit de
    la mettre dans le map et on transforme tout l'environnement abstrait en
    <math|\<bot\>>. La fonction <verbatim|strict> permet de s'en assurer.

    <item>Les expressions sont �valu�es selont des modalit�s tr�s simples :
    on r�cup�re les valeurs abstraites correspondant aux constantes et aux
    variables et on applique les op�rateurs de <verbatim|V> qui
    correspondent, ce qui donne une nouvelle valeur. L'�valuation d'une
    expression de cette mani�re est utili�e pour l'affectation ainsi que dans
    les operations <verbatim|compare_leq> et <verbatim|compare_eq>.

    <item>Pour un op�rateur <math|\<ltimes\>\<in\><around*|{|\<leqslant\>,=|}>>,
    les filtrages du type <math|S<around*|\<llbracket\>|e<rsub|1>\<ltimes\>e<rsub|2>?|\<rrbracket\>>>
    sont impl�ment�s comme suit (fonction <verbatim|compare>) :

    <\itemize>
      <item><math|S<around*|\<llbracket\>|x\<ltimes\>y?|\<rrbracket\>>> : on
      applique l'op�rateur (<verbatim|leq> pour <math|\<leqslant\>> ou
      <verbatim|meet> pour <math|=>) de <verbatim|V> sur les deux valeurs, ce
      qui donne deux nouvelles valeurs pour <math|x> et <math|y> (ou deux
      fois <math|\<bot\>> si la conditin ne peut pas �tre remplie). On
      utilise ces deux valeurs pour mettre � jour l'environnement.

      <item><math|S<around*|\<llbracket\>|x\<ltimes\>e?|\<rrbracket\>>> et
      <math|S<around*|\<llbracket\>|e\<ltimes\>x?|\<rrbracket\>>> : on �value
      l'expression <math|e> et on applique l'op�rateur de <verbatim|V> sur
      cette valeur et la valeur de <math|x>, ce qui restreint �ventuellement
      la valeur de <math|x>, ou peut donner <math|\<bot\>>.

      <item><math|S<around*|\<llbracket\>|e<rsub|1>\<ltimes\>e<rsub|2>?|\<rrbracket\>>>
      : on �value les expressions <math|e<rsub|1>> et <math|e<rsub|2>> et on
      applique l'op�rateur de <verbatim|V>. Aucune valeur n'est restreinte
      dans l'environnement mais on peut d�tecter une condition impossible,
      auquel cas l'environnement est pass� � <math|\<bot\>>.
    </itemize>

    <item>Les op�rateurs <math|\<sqcup\>>, <math|\<sqcap\>> et
    <math|\<nabla\>> sur les environnements appliquent l'op�rateur
    correspondant sur les valeurs point-par-point pour chaque variable. Pour
    que ces op�rateurs n'�chouent pas, il faut que les m�mes variables soient
    d�clar�es dans les deux environnements.

    <item>L'op�rateur <math|\<sqsubset\>> sur les environnements fonctionne
    aussi point-par-point mais n'�choue pas dans le cas de deux
    environnements ne d�clarant pas les m�mes variables.
  </itemize>

  <subsection|Le module <verbatim|RelationnalDomain>>

  Ce module impl�mente le domaine abstrait des polyh�dres (domaine
  relationnel) en faisant appel � la biblioth�que Apron. En pratique, ce
  module fait une simple traduction entre les appels et structures de notre
  programme et ceux de la biblioth�que Apron.

  <subsection|Le module <verbatim|Interpret.Make>>

  TODO
</body>

<\initial>
  <\collection>
    <associate|page-medium|paper>
    <associate|page-screen-margin|false>
  </collection>
</initial>

<\references>
  <\collection>
    <associate|auto-1|<tuple|1|1>>
    <associate|auto-10|<tuple|2.6|?>>
    <associate|auto-11|<tuple|2.7|?>>
    <associate|auto-2|<tuple|1.1|1>>
    <associate|auto-3|<tuple|1.2|1>>
    <associate|auto-4|<tuple|2|2>>
    <associate|auto-5|<tuple|2.1|2>>
    <associate|auto-6|<tuple|2.2|2>>
    <associate|auto-7|<tuple|2.3|2>>
    <associate|auto-8|<tuple|2.4|2>>
    <associate|auto-9|<tuple|2.5|2>>
  </collection>
</references>

<\auxiliary>
  <\collection>
    <\associate|toc>
      <vspace*|1fn><with|font-series|<quote|bold>|math-font-series|<quote|bold>|1<space|2spc>Introduction>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <no-break><pageref|auto-1><vspace|0.5fn>

      <vspace*|1fn><with|font-series|<quote|bold>|math-font-series|<quote|bold>|2<space|2spc>D�coupage
      des modules> <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <no-break><pageref|auto-2><vspace|0.5fn>

      <with|par-left|<quote|1tab>|2.1<space|2spc>La signature de module
      <with|font-family|<quote|tt>|language|<quote|verbatim>|ENVIRONMENT_DOMAIN>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <no-break><pageref|auto-3>>

      <with|par-left|<quote|1tab>|2.2<space|2spc>La signature de module
      <with|font-family|<quote|tt>|language|<quote|verbatim>|VALUE_DOMAIN>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <no-break><pageref|auto-4>>

      <with|par-left|<quote|1tab>|2.3<space|2spc>Le module
      <with|font-family|<quote|tt>|language|<quote|verbatim>|Constants>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <no-break><pageref|auto-5>>

      <with|par-left|<quote|1tab>|2.4<space|2spc>Le module
      <with|font-family|<quote|tt>|language|<quote|verbatim>|Intervals>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <no-break><pageref|auto-6>>

      <with|par-left|<quote|1tab>|2.5<space|2spc>Le module
      <with|font-family|<quote|tt>|language|<quote|verbatim>|NonRelationnal>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <no-break><pageref|auto-7>>

      <with|par-left|<quote|1tab>|2.6<space|2spc>Le module
      <with|font-family|<quote|tt>|language|<quote|verbatim>|RelationnalDomain>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <no-break><pageref|auto-8>>

      <with|par-left|<quote|1tab>|2.7<space|2spc>Le module
      <with|font-family|<quote|tt>|language|<quote|verbatim>|Interpret.Make>
      <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
      <no-break><pageref|auto-9>>
    </associate>
  </collection>
</auxiliary>