Astrazione e Concretizzazione
In una Interpretazione Astratta ci aspettiamo che il
seguente diagramma commuti (correttezza):

 (e )   ( (e ))
 (e )   ({  (e )})
Tino Cortesi
Exp
Tecniche di Analisi di Programmi
A

 
  2D
1
Correttezza
Per la correttezza dell’analisi sono sufficienti le
seguenti condizioni:
 e  formano una Galois insertion
id    , id   
 e  sono monotone
x  y   (x )   ( y )
Le operazioni astratte op sono corrette localmente :
 (op(s1 ,..., sn ))  op( (s1 ), ...,  (sn ))
Tino Cortesi
Tecniche di Analisi di Programmi
2
Correttezza locale
La condizione di correttezza locale garantisce che il risultato
dell’applicazione dell’operazione agli elementi astratti si sia una
corretta approssimazione di tutte le operazioni concrete (sugli
elementi rappresentati dagli si ).
 (op(s1 ,..., sn ))  op( (s1 ),...,  (sn ))
Per ogni operazione concreta, una operazione astratta corretta
c’e’ sempre (quella che restituisce sempre l’elemento massimo
del dominio astratto)
Tino Cortesi
Tecniche di Analisi di Programmi
3
Correttezza locale
A
op
A


D
2
 (op(s1 ,..., sn ))
op
D
2
op( (s1 ),...,  (sn ))
Tino Cortesi
Tecniche di Analisi di Programmi
4
Inserzione di Galois
x  2D . x   ( (x ))
a  A. x   ( (x ))
{-1,0,1}
T
{-1,0}
{-1,1}
{0,1}
{-1}
{0}
{1}

0



Tino Cortesi
Tecniche di Analisi di Programmi
5
Prova di correttezza
Proviamo per induzione sulla struttura di e che
 (e )   ( (e ))
Passo base:
 (i )

i
def. di 
 {i }
  ( ({i }))
  ( (i))
Tino Cortesi
inserzione di Galois
def di 
Tecniche di Analisi di Programmi
6
Prova di correttezza
Proviamo per induzione sulla struttura di e che
Step
 (e )   ( (e ))
 (e1 op e2 )
  (e1 ) op  (e2 )
def. di 
  ( (e1 )) op  ( (e2 )) per ipotesi induttiva
  ( (e1 ) op  (e2 ))

Tino Cortesi
 ( (e1 op e2 ))
correttezza locale
def di 
Tecniche di Analisi di Programmi
7
Correttezza
Possiamo definire la correttezza utilizzando
l’astrazione al posto della concretizzazione:
 (e )   ( (e ))   ({  (e )})   (e )
direzione 
 (e )   ( (e ))
{  (e )}   ( (e ))
 ({  (e )})   ( ( (e ))) monotonia
 ({  (e )})   (e )
   id
Tino Cortesi
Tecniche di Analisi di Programmi
8
Correttezza
L’altra direzione
 (e )   ( (e ))   ({  (e )})   (e )
direzione 
 ({  (e )})   (e )
 ( ({  (e )}))   ( (e )) monotonia
{  (e )}   ( (e ))
id   
 (e )   ( (e ))
Tino Cortesi
Tecniche di Analisi di Programmi
9
Aggiungere input
Il prossimo passo consiste nell’estendere il nostro
“tiny language” aggiungendo input.
Questo può essere modellato con la presenza di
variabili libere nelle espressioni
e  i | e  e | e | ... | x
Tino Cortesi
Tecniche di Analisi di Programmi
10
Semantica concreta
La firma della funzione semantica  diventa quindi
 : Exp  Int  Int
Un modo per scrivere questa funzione è pensarla come un
insieme di funzioni da Int a Int indicizzate con espressioni
i ( j )
x ( j )
e e ( j )
e e ( j )
Tino Cortesi
1
2
1
2
...


i
j
 e1 ( j ) e2 ( j )
 e1 ( j )  e2 ( j )

...
Tecniche di Analisi di Programmi
11
Semantica Astratta
La semantica astratta è data dalla funzione 
 : Exp  A  A
Come per la semantica concreta, possiamo indicizzare 
i ( j )
 i
x (j )
 j
 e e ( j )   e ( j )   e ( j )
1
2
1
2
 e e ( j )   e ( j )   e ( j )
...
i
Tino Cortesi
1
2
 ...
1
2
  ({i })
Tecniche di Analisi di Programmi
12
Correttezza
Bisogna generalizzare le condizioni di correttezza
Le seguenti condizioni sono equivalenti
i . e (i )   ( e ( ({i })))
e D   e 
A

 e A  e 
2
D
Tino Cortesi
Tecniche di Analisi di Programmi
e
A

 
e  2D
13
Correttezza locale
La correttezza locale la possiamo esprimere mediante
la seguenta regola:



op  ( e1 ( j )),...,  ( en ( j ))   op ( e1 ( j ),...,  en ( j ))
Tino Cortesi
Tecniche di Analisi di Programmi
14

La correttezza locale è sufficiente
Teorema: e ( j )   ( e ( j ))
Dimostrazione (per induzione)
Base
i ( j )  i   (i )   ( i ( j ))
x ( j )  j   ( j )   ( x ( j ))
Step
op (e ,...,e ) ( j )
 op ( e ( j ),..., e ( j ))
n
1
n
1
def. di 
 op ( ( e1 ( j )),...,  ( en ( j )) induzione
  (op ( e1 ( j ),...,  en ( j )))

Tino Cortesi
 ( op (e ,...,e ) ( j ))
1
n
correttezza locale
def. di 
Tecniche di Analisi di Programmi
15
Comando condizionale
e  ... | if e  e then e else e | ...
semantica concreta
 e3 (i ) if e1 (i )  e2 (i )
if e1 e2 then e3 else e4 (i )  
 e4 (i ) if e1 (i )  e2 (i )
semantica astratta
 if e e
1
2
then e3 else e4
(i )   e3 (i )



 e (i )
4
Si osservi l’utilizzo del least upper bound nel dominio astratto
Tino Cortesi
Tecniche di Analisi di Programmi
16
Comando condizionale :
correttezza
Assumiamo che sia vero il primo ramo del comando condizionale
(l’altro caso si dimostra allo stesso modo).
e (i )
3
  ( e3 (i ))
  ( e3 (i ))

   e3 (i )

 ( if e e
1
Tino Cortesi
2
per induzione
 ( e (i ))
4
 e (i ) 
monotonia di 
4
then e3 else e4
(i ))
Tecniche di Analisi di Programmi
17
Ricorsione
Aggiungiamo funzioni ricorsive (in una sola variabile,
per semplicità). Le funzioni possono essere dichiarate
e chiamate
program 
def f (x )  e
e  ... | f (e )
La funzione semantica che abbiamo considerato
finora è del tipo
 : Exp  Int  Int
Tino Cortesi
Tecniche di Analisi di Programmi
18
Semantica concreta rivista
Generalizziamo la funzione , per tener conto delle
chiamate di funzione.
  : Exp  (Int  Int )  Int  Int
f (e ) ( g )( j )  g ( e ( g )( j ))
x ( g )( j )
j
e e ( g )( j )  e ( g )( j )  e ( g )( j )
1
Tino Cortesi
2
1
Tecniche di Analisi di Programmi
2
19
Semantica delle funzioni ricorsive
  : Exp  (Int  Int )  Int  Int
Consideriamo una funzione
def f  e
Definiamo una catena ascendente f0 ,f1 ,... in Int  Int
f0  x . 
fi 1  e (fi )
Definiamo f 
Tino Cortesi
i
fi
Tecniche di Analisi di Programmi
20
Semantica delle funzioni ricorsive
def f = if x=0 then 1 else f(x - 1)
f0(i) = 
per ogni i
f1(i) = ’if x=0 then 1 else f(x - 1)(f0)(i) =
’1(f0)(i)
se
i=0
1
’f(x - 1)(f0)(i)
altrimenti
= f0 (’x - 1(f0)(i))
= f0 (’x (f0)(i)) - f0 (’1 (f0)(i))
= f0 (i) - f0 (1)
=
=
=
Tino Cortesi
Tecniche di Analisi di Programmi
21
def f = if x=0 then 1 else f(x - 1)
f0(i) =  per ogni i
f1(i) = 1 se i=0,  altrimenti
f2(i) = ’if x=0 then 1 else f(x - 1)(f1)(i) =
’1(f1)(i)
se
i=0
1
’f(x - 1)(f1)(i)
altrimenti
= f1 (’x - 1(f1)(i))
= f1 (’0 (f1)(i))
se x=1 [’0 (f1)(i)=0]
= f1(0) = 1
= f1 (j) (j#0)
altrimenti
=
=
=
Tino Cortesi
Tecniche di Analisi di Programmi
22
def f = if x=0 then 1 else f(x - 1)
f0(i)
f1(i)
f2(i)
f3(i)
f4(i)
...
=
=
=
=
=
(f) =
Tino Cortesi

1
1
1
1
per ogni i
se
i=0,  altrimenti
se
i=0,1,  altrimenti
se
i=0,1,2,  altrimenti
se
i=0,1,2,3,  altrimenti
Ui>=0 fi
Tecniche di Analisi di Programmi
23
Semantica astratta
In modo analogo, dobbiamo estendere la definizione della
semantica astratta .
Richiediamo che tutte le funzioni siano monotone.
  : Exp  (A  A)  A  A
 f (e ) ( g )(i )  g ( e ( g )(i ))
 x ( g )(i )
i
 e e ( g )(i )   e ( g )(i )   e ( g )(i )
1
Tino Cortesi
2
1
Tecniche di Analisi di Programmi
2
24
Semantica della ricorsione
 ': Exp  (A  A)  A  A
Consideriamo una funzione
def f  e
Definiamo una catena ascendente f 0 ,f 1 ,... in A  A
f 0  a . 
f i 1   e (f i )
Definiamo  f 
Tino Cortesi
fi
i
Tecniche di Analisi di Programmi
25
Correttezza
f2 ( j )

f1 ( j )

f0 ( j )



f2 ( j )

f 1(j )

f 0(j )
Elementi corrispondenti nelle due catene sono nella relazione
giusta
Tino Cortesi
Tecniche di Analisi di Programmi
26
Correttezza (continua)
i . fi ( j )   (f i ( j ))

i 0
fi ( j ) 
 (f i ( j ))
le catene convergono
i 0



fi ( j )    f i ( j )  monotonia di 
i 0
 i 0

 f ( j )   ( f ( j ))
per definizione
Tino Cortesi
Tecniche di Analisi di Programmi
27
Esempio
Consideriamo una funzione ricorsiva
def f(x) 
if x  0 then 1 else x  f(x  -1)
Astrazione
lfp   if x  0 then 1 else x  f(x  -1)  
Semplificando


lfp  f. x.   x  f(x  )
Tino Cortesi
Tecniche di Analisi di Programmi

28


lfp  f. x.   x  f(x  )

f 0  a . 
T
f i 1   e (f i )
f0

  0  T

    
f1 
0


  0  T
   

  0  T
f2 
 T T  T
f3 
Tino Cortesi


0
 T
 T T T T
Tecniche di Analisi di Programmi
29
Esempio (ctd)
Osserviamo che in questo caso l’astrazione non porta a nessuna
informazione utile
Le catene ascendenti sono strettamente crescente, fino a che
non convergono
f0  f1  f2  f3  f4  f5  ...
Ma non è detto che considerando un un singolo valore la catena
ascendente concreta sia strettamente crescente
f0 ()  f1 ()  f2 ()  f3 ()  f4 ()  f5 ()  ...
Tino Cortesi
Tecniche di Analisi di Programmi
30
Riassumendo…
Applicare le tecniche di Interpretazione
astratta significa
Definire semantica concreta ed astratta del
programma: domini ed operazioni
Applicare un algoritmo di punto fisso
Tino Cortesi
Tecniche di Analisi di Programmi
31
Conclusioni
Il lavoro in Cousot&Cousot ‘77 ha generato
un’enorme quantità di lavori scientifici
Uno slogan riassuntivo:
Analisi Statica = Reticoli + Funzioni monotone
E’ una teoria unificante. Ad es. le tecniche dataflow e
di model checking si possono esprimere in termini di
Interpretazione Astratta.
Tino Cortesi
Tecniche di Analisi di Programmi
32
Scarica

Analisi e Verifica di Programmi