Metodi formali per la verifica dell’affidabilità di sistemi software (e hardware) (Peled, Software Reliability Methods, cap. 1) Importanza della verifica di sistemi (safety-critical, commercially critical, mission critical) Il baco del 2000: gli US spesero più di 100.000 milioni di dollari per combattere il Y2K-bug. Non successe niente. Sistemi SW controllano gran parte della nostra vita (telefoni, banche, aerei,...) Lo sviluppo del SW è cambiato coinvolge decine o centinaia di programmatori su uno stesso progetto migliaia/milioni di linee di codice persone dislocate Difficoltà di controllare il processo di sviluppo del SW ⇒ metodologie di progettazione ⇒ metodi formali per identificare errori Problema della validazione di un progetto: assicurare la correttezza del progetto fin dai primi stadi dello sviluppo: • simulazione e test • verifica formale 1 Metodi Formali per la verifica di sistemi Collezione di notazioni e tecniche per descrivere a analizzare sistemi Formali: basati su qualche teoria matematica (logica, automi, teoria dei grafi) Verifica: applicazione di una tecnica manuale o automatica che possa aiutare a stabilire se un sistema soddisfa una data proprietà o si comporta in accordo a una specifica data. Una tecnica di verifica formale include: 1. Una metodologia per modellare sistemi: rappresentare un sistema in termini di oggetti matematici, astraendo e semplificandone la descrizione 2. Un linguaggio di specifica, per descrivere le proprietà del sistema modellato. Si utilizzano formalismi logici, in genere una logica temporale. 3. Un metodo di verifica: tecniche di analisi formale per verificare se un sistema soddisfa la sua specifica. Quindi escludiamo i metodi di test, che agiscono sul sistema reale (e non coprono comunque tutte le esecuzioni possibili). Limiti intrinseci dei metodi formali: • non garantiscono la correttezza del sistema, ma di qualche suo modello astratto (costruito manualmente) • la formulazione della specifica è eseguita manualmente, può essere incompleta 2 Approcci fondamentali alla verifica di sistemi Verifica deduttiva. Inizialmente con lo scopo di assicurare la correttezza di un programma. Il sistema è descritto da un insieme di formule S (in una logica adatta allo scopo), la specifica è una formula A. Il metodo di verifica consiste nel dimostrare che S ⊢ A. Normalmente non sono metodi completamente automatizzabili. Influenza sullo sviluppo del SW: nozione di invariante. Verifica basata su model checking. Il sistema è rappresentato da una struttura matematica M, rappresentabile in modo finito, che corrisponde a un’interpretazione o un insieme di interpretazioni di una logica (adatta allo scopo). La specifica è una formula A. Il metodo di verifica consiste nel dimostrare che M |= A. Il metodo di verifica è generalmente automatizzabile. Applicabile a sistemi a stati finiti (dove l’insieme di valori che può assumere ciascuna variabile è finito). Metodi adatti a verificare protocolli di comunicazione, sistemi concorrenti, o rappresentazioni astratte di algoritmi. L’applicazione di metodi formali di verifica è oggi spesso integrata nel processo di sviluppo del SW (piuttosto che eseguita a posteriori): metodologia di sviluppo per raffinamenti (specifica e test), conservando la correttezza da uno stadio dello sviluppo al successivo. 3 Verifica automatica Restrizione teorica: la verifica completamente automatica di tutti i programmi è impossibile (indecidibilità del problema della fermata). • restringere la classe di programmi (programmi a stati finiti) • verificare soltanto le parti cruciali del programma • semplificare il programma mediante astrazione (manualmente) • usare metodi di verifica semi-automatica Verifica di programmi a stati finiti: lo spazio degli stati si può visitare come un grafo a partire da I, ad esempio per verificare le invarianti. Programmi a stati finiti rappresentabili mediante sistemi di transizioni basati su un linguaggio proposizionale. Rappresentazione degli stati: importante non distinguere stati che sono essenzialmente lo stesso. Spesso sono mantenuti in una tabella hash e si usano tecniche di compressione. 4 Logica del primo ordine (Peled, Cap. 3) Notazioni e terminologia del libro: Segnatura (linguaggio) G = (V, F, R) contiene un insieme di variabili V , un insieme di simboli funzionali F e un insieme di simboli di relazione R. terms(G): insieme dei termini f orms(G): insieme delle formule Struttura del primo ordine (linguaggio + interpretazione) S = (G, D, F, R, f ) dove: • G è una segnatura (V, F, R) • D un insieme (il dominio) • F un insieme di funzioni su D • R un insieme di relazioni su D • f la funzione di interpretazione semantica f :F ∪R →F ∪R associa una funzione a ogni simbolo funzionale e una relazione a ogni simbolo di relazione, conservando la arità Noi utilizzeremo il simbolo M (eventualmente con indici) per indicare una interpretazione (D, F , R, f ) – o semplicemente (D, f ) – di una segnatura. Assegnazione a : V → D a[d/v]: variante di a che assegna d a v 5 Interpretazione di termini e formule Interpretazione semantica dei termini: Ta : terms(G) → D Interpretazione delle formule: Ma : f orms(G) → {T RU E, F ALSE} a |=S ϕ : |=S ϕ : (S, a) |= ϕ cioè Ma (ϕ) = T RU E S |= ϕ (per ogni a, a |=S ϕ) 3.8: presenta PVS Riferimenti a mechanized thorem provers 6