Metodi formali per la verifica dell`affidabilit`a di sistemi software (e

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