Interpretazione astratta in pratica Un analizzatore generico per Java

Riassunto puntate precedenti Progetto Java
Interpretazione astratta in pratica
Un analizzatore generico per Java
Pietro Ferrara
Università Ca’ Foscari di Venezia
I-30170 Venezia (Italy)
[email protected]
Ecole Polytechnique, Paris
F-91128 Palaiseau (France)
[email protected]
April 28, 2008
Pietro Ferrara
Interpretazione astratta in praticaUn analizzatore generico per Ja
Abbiamo visto
Semantica concrete di C con e senza puntatori, Java,
bytecode di Java
Astrazione del dominio
Astrazione degli indirizzi
Grafo di controllo, propriet
Domini numerici
Cosa dovete fare voi!
Implementare due domini numerici che vi verranno
assegnato/sceglierete e il loro prodotto ridotto
Segni
Parità
Intervalli
Congruenze
Insieme di interi
Insieme di intervalli
Implementare il “visitor” per una proprietà che vi verrà
assegnata
Accesso a un indirizzo che può essere null
Divisione per zero
Overflow in una moltiplicazione
Accesso a un array con un indice troppo grande
Accesso a un array con un indice minore di zero
Relazione
MINI relazione (max 10 pagine, non voglio chiacchere!)
Capitolo 1: formalizzazione operatori aritmetici
Capitolo 2: formalizzazione valutazione di condizioni
Capitolo 3: formalizzazione ordinamento, upper bound, e
widening
Capitolo 4: formalizzazione proprietà
Capitolo 5: qualche esempio pratico e cosa restituisce la
vostra analisi
In pratica
Dovrete implementare in Java due interfacce
Dominio numerico
Proprietà
Vi darò l’analizzatore che ho implementato
Versione alpha 0.00000000000000000000001
Mi fate pure da tester!
Vi spiegherò come interfacciarvi al sistema
Potrete testare il vostro dominio e la vostra proprietà su delle
classi Java
Valutazione
Dominio numerico (in ordine di importanza)
Correttezza
Commenti (Javadoc quando possibile!) e chiarezza del codice
Precisione (tanti più casi considerate, tanto meglio è!)
Efficenza
Proprietà (in ordine di importanza):
Correttezza (se può esserci un errore DEVE segnalarlo)
Commenti (Javadoc quando possibile!) e chiarezza del codice
Quantità e qualità di informazione dell’errore segnalato
Relazione
Correttezza e completezza della formalizzazione rispetto
all’implementazione
Qualità degli esempi presentati (meglio di quelli che ho fatto
io!)
Domini numerici
Livello 1:
Dominio dei segni
Dominio di parit
Dominio di interi
Livello 2:
Dominio degli intervalli
Dominio di insiemi di interi
Dominio delle congruenze
Livello 3:
Dominio di insiemi di intervalli
Avete la scelta tra implementare:
Un domino di livello 1 e uno di livello 2, e il loro prodotto ridotto
Il dominio di livello 3
Classe Object
Alcuni metodi definiti nella classe object:
public int hashCode()
public boolean equals(Object o)
Usati dalle strutture dati di java.util
Esempio:
set.contains(o) ritorna true se e solo se
∃o1 ∈ set : o1.equals(o) = true
Semantica (per l’analizzatore):
this.equals(o) se e solo se this==o (non come indirizzo ma
come contenuto!)
se this.equals(o) allora this.hashCode() == o.hashCode()
Tipi generici
A partire da Java 1.5
Classi parametrizzate su un tipo
public class Classe < T > {...}
Il tipo generico pu essere poi utilizzato all’interno della classe
Un esempio
public class Classe < T > {
T value;
public Classe(T o) {
value = o;
}
public T get() {
return value;
}
public void set(T o) {
value = o;
}
}
java.util.ArrayList<E>
Classe che implementa una lista ordinata di elementi
public int size()
public boolean contains(Object elem)
public boolean add(E o)
java.util.HashSet<E>
Classe che implementa un insieme
boolean add(E o): Adds the specified element to this set if it
is not already present
public boolean contains(E elem)
public boolean remove(Object o): Removes the specified
element from this set if it is present
java.util.HashMap<K, V>
Classe che implementa una funzione
public V get(Object key): Returns the value to which the
specified key is mapped in this identity hash map, or null if the
map contains no mapping for this key
public V put(Object key, Object value): Associates the
specified value with the specified key in this map.
public Set < K > keySet(): Returns a set view of the keys
contained in this map
for(Object o:set)
Per leggere tutti i valori contenuti in un insieme/lista/...:
for(Object o : set)...
L’oggetto set deve essere:
Un array
Di tipo Iterable (come HashSet e ArrayList, ma non
HashMap)
for (Iterator i = set.iterator(); i.hasNext(); ) {
Object o = i.next();
...
}