Bibliografia
[ACH+95] R. Alur, C. Courcobetis, N. Halbwachs, T.A. Henzinger, P.H. Ho, X. Nicollin, A. Oliviero, J. Sifakis, S. Yovine. The algorithmic Analysis of Hybrid systems. TCS, 138(1):3-34, 1995.
[ACB+01] R. Alur, C. Belta, F. Ivancic, V. Kumar, M. Mintz, G.J. Pappas, H. Rubin, J. Schug. Hybrid Modeling and Simulation of Biomolecular Networks. Proceedings of 4th Int Workshop Hybrid Systems: Computation and Control, 18-32, 2001.
[AMSS98] T. Armstrong, K. Marriott, P. Schachte, and H. Sondergaard. Two classes of Boolean functions for dependency analysis. Sci. Comput. Program, 31(1):3--45, 1998.
[BS96] D.F. Bacon and P.F. Sweeney. Fast Static Analysis of C++ Virtual Function Calls, in Proc. of OOPSLA'96, ACM SIGPLAN Notices 31(10), 324-341, 1996.
[BCDR04] T. Ball, B. Cook, S. Das, and S. K. Rajamani. Refining approximations in software predicate abstraction. TACAS04, 2004.
[BPR02] T. Ball, A. Podelski and S. K. Rajamani. Relative Completeness of Abstraction Refinement for Software Model Checking. TACAS02, LNCS 2280 158-172, 2002.
[B99] B. Blanchet. Escape Analysis for Object-Oriented Languages: Application to Java, in OOPSLA'99, ACM SIGPLAN Notices 34(1), 20-34, 1999.
[Bra95] M.S. Branicky, Studies in Hybrid Systems: Modeling, Analysis, and Control. Doctor of Science Thesis, Department of Electrical Engineering and Computer Science, Massachusetts Institute of Technology, June 1995.
[B86] R.E. Bryant, Graph-Based Algorithms for Boolean Function Manipulation, in IEEE Trans. on Computers, 35(8), 677-691, 1986.
[CGSSM99] J.-D. Choi, M. Gupta, M.J. Serrano, V.C. Sreedhar and S.P. Midkiff. Escape Analysis for Java, in OOPSLA'99, ACM SIGPLAN Notices 34(1), 1-19, 1999.
[CGL94] E. Clarke, O. Grumberg, D. Long. Model Checking and Abstraction. ACM TOPLAS 16(5):1512-1542, 1994.
[CGJL00] E.M. Clarke, O. Grumberg, S. Jha, Y. Lu and H. Veith. Counterexample-guided abstraction refinement. In CAV'00, LNCS 1855, 154-169. 2000.
[CFH+02] E.M. Clarke, A Fehnker, Zhi Han, B. Krogh, J. Ouaknine, O. Stursberg, M. Theobald. Abstraction and Counterexample-guided Refinement of Hybrid Systems. J. of Foundations of Computer Science, 14(3), 2002.
[CLH94] A. Cortesi, B. Le Charlier, and P. Van Hentenryck. Combinations of abstract domains for logic programming. ACM POPL'94, 227-239, 1994.
[CFGPR97] A. Cortesi, G. File', R. Giacobazzi, C. Palamidessi, and F. Ranzato. Complementation in abstract interpretation. ACM TOPLAS 19(1):7-47, 1997.
[CC77] P. Cousot and R. Cousot. Abstract interpretation: a unified lattice model for static analysis of programs by construction or approximation of fixpoints. ACM POPL'77, 238-252. 1977.
[CC79] P. Cousot and R. Cousot. Systematic design of program analysis frameworks. ACM POPL'79, 269-282. 1979.
[CC94] P. Cousot and R. Cousot. Higher-order abstract interpretation. IEEE ICCL'94, 95-112. 1994.
[CC99] P. Cousot. The Calculational Design of a Generic Abstract Interpreter. In Calculational System Design. NATO ASI Series. 1999.
[CC00test] P. Cousot and R. Cousot. Abstract Interpretation Based Program Testing. In SSGRR 2000 Computer & Business Int. Conf.. 2000.
[D76] D.E. Denning. A Lattice model of secure information flow. Comm. of ACM, 19(5):236-242, 1976.
[DPPR00] A. Dovier, C. Piazza, E. Pontelli and G. Rossi. Sets and Constraint Logic Programming, ACM TOPLAS, 22(5), 861-931, 2000.
[FGR96] G. File', R. Giacobazzi, and F. Ranzato. A unifying view on abstract domain design. ACM Computing Surveys, 28(2), 1996.
[GS00] D. Gay and B. Steensgaard. Fast Escape Analysis and Stack Allocation for Object-Based Programs, Compiler Construction'00, LNCS 1781, 82-93, 2000.
[GGM04] S. Genaim, R. Giacobazzi, I. Mastroeni. Modeling Secure Information Flow with Boolean Functions. To appear in WITS'04.
[GM03] R. Giacobazzi andI. Mastroeni. Domain Compression for Complete Abstractions. In VMCAI'03, LNCS 2575, 146-160. 2003.
[GM04] R. Giacobazzi and I. Mastroeni. Abstract Non-Interference. ACM POPL'04, 186-197. 2004.
[GQ01] R. Giacobazzi and E. Quintarelli. Incompleteness, counterexamples and refinements in abstract model-checking. In SAS'01, LNCS 2126, 356-373. 2001.
[GR97] R. Giacobazzi and F. Ranzato. Refining and compressing abstract domains. In ICALP'97, LNCS 1256, 771-781. 1997.
[GR97b] R. Giacobazzi and F. Ranzato. Completeness in abstract interpretation: A domain perspective. In AMAST'97. LNCS 1349, 231-245. 1997.
[GR98] R. Giacobazzi and F. Ranzato. Optimal domains for disjunctive abstract interpretation. Sci. of Comp. Prog., 32(1-2):177-210, 1998.
[GR98unif] R. Giacobazzi and F. Ranzato. Uniform closures: order-theoretically reconstructing logic program semantics and abstract domain refinements. Inform. and Comput. 145(2):153-190, 1998.
[GR99] R. Giacobazzi and F. Ranzato. The reduced relative power operation on abstract domains. TCS 216:159-211, 1999.
[GS98] R. Giacobazzi and F. Scozzari. A logical model for relational abstract domains. ACM TOPLAS 20(5):1067-1109, 1998.
[GRS00] R. Giacobazzi and F. Ranzato and F. Scozzari. Making abstract interpretations complete. J. of the ACM. 47(2):361-416, 2000.
[GM84] J. A. Goguen and J. Meseguer. Unwinding and inference control. In Proc. IEEE Symp. on Security and Privacy, 75-86. 1984.
[HM00] T. Henzinger, R. Majumdar. A classification of symbolic transition systems. STACS 00, 13-34, 2000.
[J92] T.P. Jensen. Disjunctive strictness analysis. In Proc. of the 7th IEEE Symp. LICS'92, 174-185. 1992.
[HHP93] R. Harper, F. Honsell and G. Plotkin. A framework for defining logics. Journal of the ACM, 40(1):143-184, 1993.
[HS02b] P.M. Hill and F. Spoto. A Foundation of Escape Analysis. Proc. of AMAST'02, LNCS 2422, 380-395, 2002.
[HS02] P.M. Hill and F. Spoto. A Refinement of the Escape Property. Proc. of VMCAI'02, LNCS 2294, 154-166, 2002.
[HS03] P.M. Hill and F. Spoto. Logic Programs as Compact Denotations. Computer Languages, Systems and Structures 29(3), 45-73, 2003.
[LSS03] N. Lynch, R. Segala, F. Vaandrager. Hybrid I/O Automata. Information and Computation, 185:105-157, 2003.
[MH98a] P. Malacaria and C. Hankin. Generalised Flowcharts and Games. In ICALP'98, LNCS. 1998.
[MH98b] P. Malacaria and C. Hankin. A new approach to control flow analysis. In Compiler Construction, CC'98, LNCS 1383. 95-110, 1998.
[MMP92] O. Maler, Z. Manna, and A. Pnueli. From Timed to Hybrid Systems. In REX Workshop ``Real-Time: Theory in Practice'', LNCS 600, 447-484. 1992.
[N97] G.C. Necula. Proof-carrying code. ACM Symp. POPL'97, 106-119. 1997.
[N85] F. Nielson. Tensor products generalize the relational data flow analysis method. In Proc. of the 4th Hungarian Computer Science Conf., 211-225, 1985.
[PS91] J. Palsberg and M.I. Schwartzbach. Object-Oriented Type Inference, in Proc. of OOPSLA'91, ACM SIGPLAN Notices 26(11), 146-161, 1991.
[RT04] F. Ranzato and F. Tapparo. Strong preservation as completeness in abstract interpretation. ESOP'04, 2004.
[SM03] A. Sabelfeld and A.C. Myers. Language-based information-flow security. IEEE J. on selected ares in communications. 21(1):5-19, 2003.
[S02] F. Scozzari. Logical optimality of groundness analysis. TCS, 277(1-2):149--184, 2002.
[S01] F. Spoto. Watchpoint Semantics: A Tool for Compositional and Focussed Static Analyses, SAS'01, LNCS 2126, 127-145, 2001.
[julia] F. Spoto. The Julia Generic Static Analyser, 2004 www.sci.univr.it/~spoto/julia
[SJ03] F. Spoto and T. Jensen. Class Analyses as Abstract Interpretations of Trace Semantics, ACM TOPLAS 25(5), 578-630, 2003.
[TP00] F. Tip and J. Palsberg, Scalable Propagation-Based Call Graph Construction Algorithms, in Proc. of OOPSLA'00, ACM SIGPLAN Notices 35(10), 281-293, 2000.
[VS97] D. Volpano and G. Smith. A type-based approach to program security. In TAPSOFT'97, LNCS 1214. 607-621, 1997.
[W84] M. Weiser. Program slicing. IEEE Trans. on Software Engineering, 10(4):352-357, 1984.
[WR99] J. Whaley and M.C. Rinard. Compositional Pointer and Escape Analysis for Java Programs, in OOPSLA'99, ACM SIGPLAN Notices 34(1), 187-206, 1999.
Il team di Verona ha maturato una grande esperienza nella teoria e nella pratica dell'interpretazione astratta, in particolare nei campi del design sistematico di domini astratti, nell'analisi statica di programmi, nel model checking astratto e nella sicurezza basata sui linguaggi. Il tema di ricerca comune nel nostro gruppo e' la definizione e la sistematica derivazione di domini astratti che modellino proprieta' rilevanti del sistema da analizzare. Contiamo di contribuire al progetto AIDA in questa direzione nei campi dell'analisi statica di programmi, della sicurezza nei linguaggi, della verifica di sistemi ibridi per mezzo di interpretazione astratta, model checking astratto e testing astratto. WP1: "Analisi statica di programmi" Task VR1.1: "Design sistematico di trasformatori di domini astratti". Siamo interessati alla definizione di un quadro generale per il design sistematico di trasformatori di domini astratti. L'idea principale nell'approccio di questo problema e' usare l'interpretazione astratta in questo caso portata all'ordine superiore: l'oggetto del discorso sono i domini anziche' le descrizioni degli stati dei programmi. L'uso dell'interpretazione astratta all'ordine superiore mostrera' il potenziale dell'interpretazione astratta nel definire adeguatamente analizzatori di programmi che siano versatili, cioe' parametrici sulle proprieta' che essi vogliono indurre o preservare nell'approssimazione. Questa ricerca e' una prospettiva fondamentale per WP1, WP2 e WP6. Uno degli aspetti principali di questa algebra di trasformatori di domini e' la caratterizzazione della reversibilita' degli operatori. Questo gioca un ruolo fondamentale per associare ad ogni operazione di raffinamento di domini una corrispondente semplificazione o compressione di domini. Intendiamo generalizzare i risultati in [GR98unif] per studiare come rendere reversibile un raffinamento. Questo corrisponde a specificare nuove operazioni di ordine superiore che producano trasformatori reversibili. Task VR1.2: "Analisi statica di bytecode Java". Intendiamo continuare lo sviluppo di un analizzatore statico generico per il bytecode Java. Un analizzatore statico per bytecode Java basato sull'interpretazione astratta, chiamato Julia [Julia], e' stato implementato a Verona ed e' disponibile sotto licenza pubblica GNU. Ci sono alcuni aspetti che devono essere migliorati in Julia. Maggiore attenzione deve essere posta alla sua efficienza per rendere possibile l'analisi di applicazioni sempre piu' grandi. In particolare studieremo come la possibilita' di suddividere l'analisi in differenti flussi di esecuzione possa rendere l'esecuzione di Julia parallela o distribuita. Questo aspetto sara' studiato nel contesto di nuovi domini astratti per escape analysis, analisi di classi e non-interferenza (vedi Obiettivi VR1.4 e VR2.1). Un ulteriore aspetto da sviluppare e' l'interfaccia dell'analizzatore, che dovrebbe permettere all'utente di controllare facilmente l'analisi e specificare i punti del programma dove essa deve essere concentrata. Insieme ad una tecnica basata su una semantica watchpoint sviluppata nell'Obiettivo VR1.3, questo consentira' una risposta veloce e focalizzata alle interrogazioni dell'utente sul comportamento astratto del programma da analizzare. Task VR1.3: "Analisi Watchpoint". Le dimensioni e la complessita' del software odierno sono una sfida per l'applicabilita' dell'interpretazione astratta e dell'analisi statica in generale. Poiche' il costo dell'analisi cresce con la dimensione del programma, molte applicazioni non possono essere analizzate per la mancanza di risorse computazionali. Per ovviare a questo problema spesso si deve ridurre la precisione dell'analisi: tipicamente si sacrifica l'analisi del flusso o del controllo. L'obiettivo della ricerca sara' quindi 1) mostrare come la semantica watchpoint possa essere applicata ad un linguaggio complesso e non strutturato come il bytecode Java; 2) istanziare la metodologia per escape analysis e class analysis. Per risolvere il punto 1 ricostruiremo la struttura nascosta del bytecode Java come un grafo di frammenti di codice, simile al grafo dei dominatori nella tecnologia dei compilatori. Si noti che non abbiamo garanzie che il codice in analisi derivi effettivamente dalla compilazione di Java. Per risolvere il punto 2 useremo i domini astratti definiti in [SJ03,HS02,HS02b] e li adatteremo alla filosofia basata sull'uso degli stack della macchina virtuale Java. Considereremo gli elementi dello stack come variabili e descriveremo ogni bytecode attraverso una funzione di trasferimento sugli stati costituiti da variabili locali e variabili di stack. Task VR1.4: "Escape analysis con vincoli". Il concetto di vincolo e' stato usato diffusamente per l'analisi statica di codice a oggetti. Comunque i vincoli sono stati usati fino ad ora solo per compilare un programma in un vincolo la cui soluzione esprime informazioni astratte corrette per il programma. Questo porta ad analisi veloci ma poco informative, che non analizzano il flusso ne' il controllo. Il nostro obiettivo e' di usare i vincoli per esprimere le funzioni astratte di trasferimento di istruzioni (o framemnti di bytecode) per migliorare l'escape analysis. In particolare vogliamo un'implementazione dell'escape analysis definita in [HS02, HS02b] e di alcune delle class analysis definite in [SJ03] attraverso vincoli insiemistici [DPPR00]. Poiche' le funzioni di trasferimento astratte per queste analisi lavorano su insiemi di punti di creazione di oggetti, i vincoli insiemistici sembrano la soluzione naturale, rispetto ad una rappresentazione in termini di diagrammi binari di decisione. Per esempio un'istruzione come v:=w, che copia il valore di w in quello di v, puo' essre modellata in termini astratti da una funzione di trasferimento che copia i punti di creazione (e le classi) di w in quelli di v. I vincoli devono essere mantenuti piccoli e facili da manipolare. Una possibile scelta e' usare solo i vincoli ottenuti per unione e intersezione. Questa scelta potrebbe imporre restrizioni nella rappresentazione di funzioni astratte di trasferimento, per cui dovrebbero essere usate rappresentazioni sub-ottimali invece di quelle ottimali delineate in [HS02, HS02b, SJ03]. WP2: "Sicurezza" Task VR2.1: "Non-interferenza astratta" La nozione di non-interferenza astratta in [GM04] e' generale e in principio applicabile a qualunque problema di sicurezza su linguaggi. Uno degli aspetti piu' interessanti della non-interferenza astratta sta nel fatto che essa e' una nozione semantica, quindi raffinando la semantica possiamo raffinare la corrispondente nozione di segretezza. In particolare questo permetterebbe di rivelare anche covert channels [SM03] dovuti alla non-terminazione, timing channels dovuti a diversi tempi di terminazione delle computazioni e canali probabilistici dovuti a differenti probabilita' di computazione. Noi vorremmo estendere la non-interferenza astratta anche a linguaggi concorrenti e multi-threaded, dove l'interleaving di processi aggiunge nuove possibili interferenze. Questa estensione richiede la definizione di una semantica di bisimulazione parametrica sull'attaccante specificato come astrazione. Questo sarebbe particolarmente utile per applicare la non-interferenza astratta per verificare protocolli di comunicazione sicuri, o per derivare condizioni di sicurezza per l'esecuzione di protocolli. Al fine di verificare la non-interferenza astratta in programmi reali possiamo intraprendere differenti strade. Un primo approccio e' quello di definire un sistema di prova corretto per la non-interferenza astratta basato sulla sintassi, questo permetterebbe di definire anche una architettura proof-carrying code (PCC) per la non-interferenza astratta [N97]. In questo caso il produttore di codice potrebbe creare un certificato di non-interferenza astratta che attesta il fatto che la segretezza del codice non puo' essere violata dal corrispondente modello dell'attaccante. Quindi l'utilizzatore del codice puo' convalidare il certificato per verificare che il codice e' sicuro per il corrispondente modello dell'attaccante. L'implementazione di questa tecnologia richiede un'appropriata scelta di un logical framework [HHP93] per specificare le astrazioni. Questo permetterebbe ai programmi di trasportare le dimostrazioni della loro non-interferenza astratta e ai processi ospitanti di verificare efficientemente la dimostrazione trasportata. Un altro importante aspetto applicativo della non-interferenza astratta e' lo slicing di programmi [W84]. Solitamente i criteri di slicing usati per lo slicing di programmi devono considerare le relazioni di dipendenza tra le variabili. Possiamo notare che se una variabile dipende da un'altra variabile, allora esiste un'interferenza. Questo significa che possiamo studiare come usare gli algoritmi di slicing esistenti in modo da verificare la non-interferenza astratta, o inversamente possiamo usare la non-interferenza astratta per indebolire i criteri di slicing not. Task VR2.2: "Modelli per flussi di controllo/dati" Siamo interessati nell'uso di funzioni booleane per modellare flussi di controllo/dati nella sicurezza su linguaggi. In particolare siamo interessati nella costruzione sistematica di domini per i flussi di informazione ottenuti combinando funzioni booleane e analisi di dipendenze. Siamo interessati allo studio del legame tra analisi del flusso di informazione e analisi di groundness nei programmi logici. Dal punto di vista del flusso dell'informazione, possiamo considerare i termini ground come oggetti sui quali l'informazione non puo' fluire. Questo approccio puo' ulteriormente essere generalizzato per modellare la non-interferenza astratta generalizzando le tecniche in [GM04] per modellare dipendenze di flussi di informazioni astratti. Inoltre siamo interessati nell'estendere le tecniche presentate in [GGM04] ad un linguaggio di programmazione piu' ricco con procedure, classi, ricorsione, ecc. Un buon linguaggio candidato per applicare l'analisi dei flussi di informazione e' Java. Siamo interessati ad estendere Julia in modo da renderlo un verificatore di bytecode per proprieta' di non-interferenza astratta di Java bytecode. Questo richiede tecnologie avanzate di domini astratti in modo da combinare funzioni booleane con informazione type-like per modellare non-interferenza astratta. WP3: "Testing e debugging" Task VR3.1: "Testing astratto" Il nostro interesse nel program testing e' principalmente connesso con la non-interferenza (Task VR2.1). La specifica e' una prescrizione di cosa il sistema dovrebbe fare: l'obiettivo del testing e' quello di verificare se il sistema implementato di fatto soddisfa questa prescrizione. Questo tipo di testing e' chiamato "conformance testing". A partire dai concetti dell' ISO 9646, l'aggettivo conformance e' interpretato come la soddisfazione di un insieme di requisiti di "conformance", che derivano dalla specifica stessa del sistema. Data una specifica formale, l'insieme dei requisiti di conformance definiti dalla specifica possono essere ottenuti mediante una particolare relazione. Questi requisiti sono un insieme di proprieta' che tutte le implementazioni dovrebbero soddisfare. Molte tecniche di testing sono basate sull'iniezione di errori, ovvero esse eseguono delle perturbazioni dell'ambiente, considerate come errori, e osservano cosa succede nell'esecuzione dell'implementazione. Per noi esiste una relazione tra questi metodi di testing e alcune nozioni di non-interferenza. Studiare queste relazioni permetterebbe di modellare il testing nel framework della non-interferenza astratta, fornendo sia una relazione tra testing astratto [CC00test] e non-interferenza astratta [GM04], sia un framework formale basato sulla semantica per gestire la regressione di test nel testing di programmi. WP4: "Sistemi ibridi e real-time" Task VR4.1: "Verifica di sistemi ibridi" In questo ambito di lavoro siamo interessati principalmente nella verifica automatica di sistemi ibridi mediante model checking astratto. La discretizzazione di un automa ibrido puo' essere vista nel contesto dell'interpretazione astratta come una sua astrazione completa, e quindi puo' essere visto come una istanza dell'interpretazione astratta. Il model checking e' interessato ad astrazioni complete, esse sono molto costose dal punto di vista computazionale, e la teoria dell'interpretazione astratta potrebbe essere un buon punto di partenza per derivare nuovi tipi di astrazioni e tecniche di verifica (widening e narrowing) che sono computazionalmente efficienti anche se non necessariamente complete. Noi siamo interessati a studiare la classificazione dei sistemi ibridi ottenuta da Henzingher et al. [HM00], nel contesto dell'interpretazione astratta, dimostrando che le classi di Henzingher sono relazionate da astrazioni e che ogni classe puo' essere vista come un'astrazione completa del modello concreto di un automa ibrido. L'interesse in questo approccio sta nel fatto che esso rende i metodi sistematici per derivare astrazioni complete in [GRS00], applicabili alla derivazione di sistemi di transizione simbolici a partire dalle logiche che devono essere preservate. Infatti, l'interpretazione astratta fornisce le costruzioni piu' efficienti, mentre le costruzioni usate nel model checking standard risultano essere semplicemente le migliori costruzioni ottenibili in base all'esperienza. Noi vorremmo capire come il widening e il narrowing possono essere usati come basi per nuovi algoritmi approssimati di model checking. In particolare siamo interessati nell'uso dei frattali come una base per il widening nei sistemi ibridi rettangolari. Infine, ci piacerebbe capire come i risultati che deriviamo per i sistemi ibridi possono essere estesi a sistemi ibridi stocastici. WP6: "Verifica". In questa area di lavoro siamo interessati ad applicazioni di trasformatori di domini astratti sia per semplificare il model checking astratto sia per ottenerne la preservazione forte. L'attivita' in questa area di lavoro e' un'applicazione delle tecniche sviluppate nel Task VR1.1. Task VR6.1: "Compressione di model checking astratti" In [GM03] viene introdotto un algoritmo per la compressione dei domini astratti relativamente a raffinamenti di completezza. Questo potrebbe essere importante per nel model checking astratto dal momento che in [GQ01,RT04] il problema di rendere i modelli strong preserving e' stato caratterizzato come raffinamento di completezza. Questo implica che comprimere i modelli corrisponde ad aggiungere tutti i possibili controesempi, astraendo il piu' possibile il sistema di transizione in modo che esso abbia comunque lo stesso raffinamento di completezza originale. A questo punto il raffinamento guidato dai controesempi per una data formula in [CGJL00] raffinerebbe il sistema di transizione astratto solo per rendere il modello fortemente preservante per la stessa formula, ottenendo in questo modo il piu' astratto sistema che preserva fortemente la formula data. Task VR6.2: "Raffinamento di semantiche" Un aspetto simmetrico in relazione alle tecniche di raffinamento dei domini astratti e' il raffinamento delle semantiche. Con questo intendiamo il problema di trasformare semantiche, ovvero funzioni Scott-continue, in modo che la loro approssimazione rispetto ad un dato dominio fissato sia completa. Questo problema e' importante al fine di caratterizzare quali sono le operazioni per le quali un dato dominio e' completo. La piu' importante applicazione di questa tecnologia si trova nel model checking astratto, per derivare la piu' concreta (piu' forte) logica per la quale il model checking astratto, sotto una certa astrazione fissata, e' completo o fortemente preservante. Questo fornirebbe una caratterizzazione basata sulla logica di una tassonomia di astrazioni nel model checking astratto sotto il requisito della preservazione forte.