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(); ... }