summaryrefslogtreecommitdiff
path: root/rapport.tm
blob: cb9a68b4a0d996c2390c1682e7c53c83f64e9f2b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
<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>