Corso di Laurea Triennale in Ingegneria Informatica Ingegneria del software Metodi formali nell’ingegneria del software Guasti software Sistemi critici Metodi formali Verifica formale Model checking Ingegneria del software I guasti software Classificazione dei guasti: • Natura dei guasti: – Accidentali: che si verificano fortuitamente – Intenzionali: creati con scopi malevoli • Origine dei guasti: – Cause fenomenologiche: • Guasti fisici: dovuti a fenomeni fisici • Guasti causati dall’uomo – Confini del sistema: • Guasti interni: parti del sistema che producono errori • Guasti esterni: causati dall’interferenza dell’ambiente fisico nel sistema o dall’interazione con l’uomo – Fase di creazione: • Guasti di progetto • Guasti operativi – Persistenza temporale: • Guasti permanenti • Guasti temporanei Ingegneria del software Errori • Catena – Guasto->errore->fallimento • Ogni sistema è inteso in maniera ricorsiva come strutturato in componenti, fino al livello dei componenti atomici non ulteriormente scomponibili – Un guasto di un componente nel sistema, se non gestito opportunamente può determinare uno stato erroneo detto errore. – Errore: è uno scostamento del sistema dallo stato nominale, ed è l’effetto di un guasto, non è il guasto. – Fallimento: si verifica se lo stato di errore non viene gestito, rappresenta la deviazione del comportamento del sistema rispetto a quello atteso secondo le specifiche. Ingegneria del software Classificazione dei fallimenti • Il fallimento di un sistema avviene quando un errore si manifesta come deviazione dal servizio offerto. – Vi sono diversi failure modes, che possono essere caratterizzati secondo tre punti di vista: • il dominio • la percezione del fallimento da parte degli utenti del sistema • le conseguenze sull’ambiente – Consideriamo di seguito la classificazione relativa soltanto alle conseguenze del fallimento sull’ambiente, ossia alla gravità: • Fallimenti benigni: – le conseguenze sono dello stesso ordine di grandezza del beneficio dato dal servizio erogato in assenza di fallimento • Fallimenti catastrofici: – le conseguenze sono incommensurabilmente più grandi dei benefici prodotti dal servizio in assenza di fallimento Ingegneria del software Fallimenti benigni • Le conseguenze sono dello stesso ordine di grandezza del beneficio dato dal servizio erogato in assenza di fallimento: – Il costo del fallimento si limita alla perdita economica dovuta alla mancanza del servizio stesso: • Es. se un aereo non può partire per un guasto, i viaggiatori non possono raggiungere velocemente la destinazione. – Sistemi fail-safe: sistemi i cui fallimenti possono essere solo benigni Ingegneria del software Fallimenti catastrofici • Le conseguenze sono incommensurabilmente più grandi dei benefici prodotti dal servizio in assenza di fallimento: – Es. se il guasto all’ aereo provoca un incidente, le conseguenze sono ovviamente diverse e meno desiderabili rispetto al in relazione alla gravità dei possibili fallimenti si identifica la criticità di un sistema: – Se il fallimento di un sistema ha la potenzialità di essere catastrofico si parla di sistema critico, altrimenti si parla di sistema non critico. Ingegneria del software Classificazione dei sistemi critici • A seconda della categoria degli effetti dei fallimenti i sistemi critici possono essere classificati in: • Sistemi safety-critical: – Sistemi il cui fallimento può causare ferimenti, perdite di vite o seri danni ambientali( sistemi di controllo di impianti chimici, centrali nucleari, sistemi fly-by-wire, o sistemi drive-by-wire) • Sistemi mission-critical: – Sistemi il cui fallimento può causare la cancellazione di attività mirate ad un obiettivo importante (sistema di navigazione di una sonda spaziale) • Sistemi business-critical: – Sistemi il cui fallimento può causare ingenti perdite di denaro (sistema di gestione dei conti correnti di una banca) Ingegneria del software Dependability • Definizione: – la proprietà di un sistema di essere adeguato a che un essere umano, o una collettività, possa dipendere da esso, senza correre rischi inaccettabili [indicare i riferimenti bibliografici] – Un termine utilizzato spesso con la stessa accezione è affidabilità (reliability) – Caratterizzazione della dependability: • La credibilità di un sistema di calcolo, ossia il grado di fiducia che può essere ragionevolmente riposto nei servizi che il sistema offre. Ingegneria del software Attributi della dependability • I servizi offerti da un sistema di calcolo sono rappresentati dal suo comportamento così come viene percepito dagli utenti: – A seconda dei servizi che il sistema deve fornire, la garanzia di funzionamento può essere interpretata in relazione a proprietà distinte, ma complementari: • Availability: disponibilità - se l’aspettativa principale sul servizio è data dalla sua prontezza di risposta • Reliability: affidabilità – se l’aspettativa riguarda la fornitura continua del servizio per un tempo sufficientemente lungo, • Safety: sicurezza – se l’aspettativa principale è la garanzia di evitare situazioni catastrofiche e danni all’ambiente o alle persone • Security: sicurezza - se l’aspettativa è la prevenzione di accessi non autorizzati e/o manipolazioni di informazioni private Ingegneria del software Altri aspetti della dependability • Pervasività: il principale aspetto da studiare a proposito di dependability è la pervasività e l’inevitabilità della presenza di guasti: – La presenza di guasti rende necessaria la possibilità di riparare i guasti • Maintainability: la capacità di un sistema dependable di essere riparato in tempi e con costi prevedibili: – La manutenzione è l’attività di rimozione dei guasti durante il funzionamento o comunque nella vita operativa di un sistema Ingegneria del software Attributi di dependability dei sistemi embedded • Si tratta di sistemi chiusi in cui attributi fondamentali sono: – – – – Reliability Availability Maintainability Safety • Nei sistemi aperti (che comunicano cioè con altri sistemi) attributo fondamentali è la safety intesa come protezione dai guasti intenzionali e security intesa come protezione dei dati relativamente alla facile diffusione su nternet Ingegneria del software Metodi per ottenere dependability • Protezione dai guasti (fault prevention): tecniche mirate a prevenire e minimizzare le occorrenze di guasti: – Comprende l’uso di tecniche di progettazione e ingegnerizzazione adeguate allo scopo: • Es. tecniche di ingegneria del software per minimizzare la presenza di bugs nel codice • Tolleranza ai guasti (fault tolerance): la possibilità di guasti in un sistema può permanere nonostante l’adozione di tecniche di progettazione: – Si tratta di tecniche che si occupano di garantire un servizio che si mantenga conforme alla specifiche nonostante i guasti • Eliminazione dei guasti (fault removal): debugging, svolto o durante la fase di sviluppo del software o successivamente al rilascio (manutenzione correttiva) • Predizione di guasti (fault forecasting): consiste nello stimare il numero, la frequenza e la probabilità di incidenza presente e futura, e nel prevedere le possibili conseguenze Ingegneria del software Guasti software • Un guasto software (bug) è un guasto interno, umano, di progetto, in genere non intenzionale. Ingegneria del software Dependability del software • Software fault tolerance: tolleranza ai guasti del software • Software fault forecasting: software reliability • Software fault avoidance: tecniche di ingegneria del software e di buona programmazione (già note); inoltre vi sono tecniche di metodi formali di sviluppo del software, che permettono di evitare l’introduzione di guasti nel software • Software fault removal: rimozione dei guasti software debugging Ingegneria del software Il caso Ariane 5 • 4 giugno 1996, il primo lancio del vettore spaziale Ariane 5 risultò un fallimento: • In termini della catena: guasto-errore-fallimento – – – – – – – Dopo 36 secondi dall’inizio della sequenza di volo il razzo deviò dalla rotta ed il vettore espose con una perdita stimata di oltre 500 milioni di dollari, ma nessun danno a persone o cose Missile esploso per la procedura di autodistruzione Decisione errata presa dai computer di bordo dovuta ad un messaggio proveniente dalle piattaforme inerziali Le due piattaforme avevano subito uno shutdown a causa di una eccezione Ada Operand Error non trattata L’eccezione era stata sollevata durante la conversione di dati da floating point a 64 bit a signed integer a 16 bit poiché il numero da convertire ( il valore dell’accelerazione laterale) aveva un valore superiore a quello rappresentabile con un signed integer 16 bit Le piattaforme inerziali erano state ereditate dall’Ariane 4 in cui il software funzionava poiché non si raggiungevano tali accelerazioni laterali • Il software era stato riusato ma in condizioni non analoghe a quelle per cui era stato collaudato La funzione in cui veniva utilizzata la conversione era necessaria sull’Ariane 4 ma inutile nell’Ariane 5, non eliminata per non modificare il codice già collaudato Ingegneria del software Cause dell’incidente • Incapacità del software di bordo di distinguere il messaggio di shutdown delle piattaforme inerziali • Omissione di controllo a run-time delle eccezioni • Riuso del software in un ambiente diverso da quello per cui era stato progettato e testato • Mantenimento dell’esecuzione di funzionalità diventate inutili • Mancanza di test adeguato nelle condizioni di utilizzo del software • Mancanza di un corretto flusso di informazione sulle specifiche di funzionamento del software delle piattaforme inerziali dal progetto Ariane 4 ad Ariane 5 Ingegneria del software Tipologia dei guasti nell’Ariane 5 • Si tratta di guasti interni, umani, di progetto, non intenzionali Ingegneria del software Altri esempi di guasti software • Il baco del processore Pentium 5 – L’errore era dovuto a un difetto di progettazione dell’algoritmo di divisione in floating point (FDIV) – FDIV è l'istruzione in assembly x86 – il processore sbagliava a calcolare espressioni semplici come se x fosse un numero contenente diverse cifre dopo la virgola: • es. dividendo 4195835.0/3145727.0 si otteneva 1,33374 invece di 1,33382 un errore dello 0,006 per cento. • Anche se il problema interessa poche persone diventa un danno di immagine per Intel • Stimando tra i 3.000 e i 5000 chips difettosi in circolazione la Intela dapprima si impegna a sostituirli soltanto per gli utenti che avessero necessità di effettuare calcoli con elevata precisione, successivamente cede e sostituisce i chips a chiunque ne avesse fatto richiesta. Il danno economico ammonta a 475milioni di dollari. – L’errore non era presente nel processore 486 – La scoperta avvenne nell'estate del 1994 quando il professore Thomas Nicely tentò di calcolare il risultato di una particolare espressione matematica Ingegneria del software Altri guasti software • 2005 - Automaker Toyota announced a recall of 160,000 of its Prius hybrid vehicles following reports of vehicle warning lights illuminating for no reason, and cars' gasoline engines stalling unexpectedly. But unlike the large-scale auto recalls of years past, the root of the Prius issue wasn't a hardware problem -- it was a programming error in the smart car's embedded code. The Prius had a software bug. • January 15, 1990 -- AT&T Network Outage. A bug in a new release of the software that controls AT&T's #4ESS long distance switches causes these mammoth computers to crash when they receive a specific message from one of their neighboring machines - a message that the neighbors send out when they recover from a crash. – One day a switch in New York crashes and reboots, causing its neighboring switches to crash, then their neighbors' neighbors, and so on. Soon, 114 switches are crashing and rebooting every six seconds, leaving an estimated 60 thousand people without long distance service for nine hours. The fix: engineers load the previous software release. Ingegneria del software Altri guasti software • July 28, 1962 -- Mariner I space probe. A bug in the flight software for the Mariner 1 causes the rocket to divert from its intended path on launch. Mission control destroys the rocket over the Atlantic Ocean. The investigation into the accident discovers that a formula written on paper in pencil was improperly transcribed into computer code, causing the computer to miscalculate the rocket's trajectory. • 1982 -- Soviet gas pipeline. Operatives working for the Central Intelligence Agency allegedly plant a bug in a Canadian computer system purchased to control the trans-Siberian gas pipeline. The Soviets had obtained the system as part of a wide-ranging effort to covertly purchase or steal sensitive U.S. technology. The CIA reportedly found out about the program and decided to make it backfire with equipment that would pass Soviet inspection and then fail once in operation. The resulting event is reportedly the largest non-nuclear explosion in the planet's history. Ingegneria del software Altri guasti software • 1985-1987 -- Therac-25 medical accelerator. A radiation therapy device malfunctions and delivers lethal radiation doses at several medical facilities. Based upon a previous design, the Therac25 was an "improved" therapy system that could deliver two different kinds of radiation: either a low-power electron beam (beta particles) or X-rays. The Therac-25's X-rays were generated by smashing high-power electrons into a metal target positioned between the electron gun and the patient. A second "improvement" was the replacement of the older Therac-20's electromechanical safety interlocks with software control, a decision made because software was perceived to be more reliable. – What engineers didn't know was that both the 20 and the 25 were built upon an operating system that had been kludged together by a programmer with no formal training. Because of a subtle bug called a “race condition“, a quick-fingered typist could accidentally configure the Therac-25 so the electron beam would fire in high-power mode but with the metal X-ray target out of position. At least five patients die; others are seriously injured. Ingegneria del software Metodi formali Tecniche basate su fondamenti matematici, di aiuto al corretto sviluppo ed alla verifica del software. • Problema: Indecibilità della verifica di correttezza di un programma rispetto ad una specifica • Soluzione: – Una metodologia model driven Ingegneria del software Definizione • Metodo di specifica e produzione del software che comprende: – Una collezione di notazioni matematiche indirizzate alle fasi di specifica, di progetto e di sviluppo – Un sistema di inferenza logica ben fondato in cui si possano formulare dimostrazioni di correttezza e altre proprietà – Un contesto metodologico mediante il quale il software possa essere sviluppato dalla specifica all’implementazione in modo formalmente verificabile Ingegneria del software Verifica formale del codice sorgente • Hoare alla fine degli anni 60 propose l’uso di asserzioni nel codice sorgente: – si usa la logica di Hoare • Un sistema formale con lo scopo di fornire un insieme di regole per studiare la correttezza di programmi col rigore della logica matematica. – Si basa sulla tripla di Hoare, che descrive come l’esecuzione di un pezzo di codice cambia lo stato della computazione. Ingegneria del software Logica di Hoare Si presenta nella forma: • [P]C[Q] dove – P e Q sono asserzioni, formule valide in logica dei predicati sulle variabili del programma – C un comando • P precondizione • Q postcondizione – La logica definisce assiomi e regole di inferenza per tutti i costrutti di un linguaggio di programmazione imperativo basate sulla semantica del linguaggio Ingegneria del software Regole della logica di Hoare • Le regole permettono di derivare la postcondizione Q a partire dalla precondizione P e dalla semantica del comando C • Esempio: i=0; while (i<n) {a[i]=0; i++; } ==n Precondizione i==0 0<j<=k => a[j-1]==0&&i==k invariante al k-esimo ciclo Postcondizione 0<j<=n => a[j-1]==0 &&i Ingegneria del software Invariante • Per comandi semplici (es. assegnamento ) la postcondizione si ottiene dalla precondizione modificando l’asserzione sul valore della variabile toccata dall’assegnamento • Se il comando è un ciclo, al fine di calcolare la postcondizione occorre definire l’invariante del ciclo, ovvero un’asserzione che vale in un punto del corpo del ciclo and ogni iterazione. Ingegneria del software Model checking • Tecnica di verifica: – Le proprietà del sistema diventano decidibili (cioè verificabili algoritmicamente) se un sistema è modellato mediante una macchina a stati finiti. – Model checking • Consiste nel descrivere un sistema (software o altro) mediante una finite state machine, nell’esprimere una proprietà d’interesse mediante una formula e nel verificare se il comportamento del sistema soddisfi la proprietà stessa. • La dimostrazione della proprietà può essere fatta automaticamente • Il model checking coniuga le proprietà del test con quelle delle prove matematiche di correttezza Ingegneria del software Model checking Model checking Definito da Edmund Clarke ( cmu), Allan Emerson ( univ. Of texas), Joseph Sifakis ( cmu), che ricevono nel 2007 l’ACM Turing Award, [E.M. Clarke, E.A. Emerson, A.P. Sistla,” Automatic Verification of Finite-state Concurrent Systems using Temporal Logic Specification, “ACM Transaction on Programming Languages and Systems, 8(2),April 1986, pp.244-263] Ingegneria del software Vantaggi • definizione di un modello formale del sistema conforme alla implementazione • possibilità di specificare proprietà del sistema mediante formalismi logici • dimostrazione della validità di tali proprietà rispetto al modello • disponibilità di un modello eseguibile ossia di un modello su cui si possono effettuare simulazioni – definire un modello utilizzando un formalismo – verificare proprietà del modello rispetto a specifiche formulate tramite logiche temporali Ingegneria del software Model checker • È l’algoritmo che verifica le proprietà, fornisce o una prova che la proprietà in esame risulta verificata oppure un contro-esempio, ossia un caso di test che dimostra il fallimento del sistema nel comportamento corretto rispetto alla proprietà. Ingegneria del software Struttura di Kripke • È una macchina a stati finiti, una quintupla M=(S, S0,R,AP,L) dove: – S insieme finito di stati – S0 è l’insieme degli stati iniziali – R⊆SxS è la relazione di transizione di stato che deve essere totale ossia per ogni stato sєS esiste s’єS tale che sia definita R(s, s’) – AP è un insieme di proposizioni atomiche – L: S→2AP è una funzione che assegna ad ogni stato un’etichetta che contiene le proposizioni atomiche vere in quello stato. Ingegneria del software Computation Tree Logic (CTL) • Branching time logic – Syntax: • Propositional atoms & connectives AND, OR, NOT • Temporal connectives (F, G, U, X) • Quantifiers over paths (A, E) – Semantics • Paths on a Kripke structure Ingegneria del software • Quantifiers and Operators Path Quantifiers – A - for All paths... – E - there Exists a path... • Temporal Operators – G - Globally in a path... – F - sometime in the Future... – U - ...Until... – X …in the neXt state... Allowed combinations: – Quantifier + Operator • • • • AG f AF f A(f1 U f2) AX f • • • • EG f EF f E( f1 U f2) EX f Ingegneria del software Sintassi • La logic CTL è definita mediante due categorie sintattiche: • Formule di stato φ: • φ ≔∼ φ | φ ∧ φ | true |p | A ψ |E ψ – Formule di cammino ψ: • ψ ≔X φ | φU φ |F φ |G φ • La negazione si applica solo alle formule di stato, consentendo la dualità solo tra operatori preceduti dal quantificatore: ∼AF φ= EG ∼ φ ∼EF φ= AG ∼ φ ∼EX φ= AX ∼ φ Ingegneria del software Definizioni • Un cammino π è una sequenza finita di stati tale che per ogni i≥0, (si,si+1) ∈ R • Se φ è una formula di stato, • M,s ⊨ φ significa che φ è valida nello stato s nella struttura di Kripke M • Se ψ è una formula di cammino, • M, π ⊨ ψ significa che ψ è valida lungo il cammino π nella struttura di Kripke M • Generalmente M può essere omesso se è evidente dal contesto Ingegneria del software Semantica La relazione ⊨ è definita induttivamente come segue: • Se φ1 ,φ2 sono formule di stato e ψ 1, ψ 2 sono formule di cammino • s ⊨ true sempre • s ⊨ p ⇔ p ∈ L(S) • s ⊨ φ1 ∧ φ2 ⇔ (s ⊨ φ1) ∧ (s ⊨ φ2) • • • • • • • s⊨∼φ⇔∼s⊨ φ s ⊨ A ψ ⇔ ∀π a partire da s, π ⊨ ψ s ⊨ E ψ ⇔ ∃π a partire da s, tale che π ⊨ ψ π⊨ X φ ⇔ π=s0,s1,s2,…,sn,.. ∧ s1⊨ φ π⊨ φ1 U φ2 ⇔ π=s0,s1,s2,…,sn,.. ∧ ∃i: si⊨ φ2 ∧ ∀k<i, S k ⊨ φ1 π⊨ Fφ ⇔ π =s0,s1,s2,…,sn,.. ∃i: si⊨ φ π⊨ Gφ ⇔ π=s0,s1,s2,…,sn,.. ∀i: si⊨ φ Ingegneria del software L’algoritmo • Data una struttura di Kripke M ed una formula φ, il model checking consiste nel verificare se M soddisfa φ. – La formula rappresenta una proprietà che si desidera che M abbia. – Il model checking consiste nel verificare che M sia un modello per φ cioè M ⊨ φ. • Emerson e Clarke hanno proposto un algoritmo che risolve il model checking per la Logica CTL. – Consiste nell’etichettare tutti gli stati di M con sottoformule di φ soddisfatte in tali stati, iniziando con le sottoformule di lunghezza 0, (cioè con i predicati atomici), passando a sottoformule di lunghezza 1, dove si applica un solo operatore logico a formule con predicati atomici, quindi a sottoformule di lunghezza 2 dove si applica un operatore logico a sottoformule di lunghezza 1 e così via. Ingegneria del software Verifica • Il risultato si evince dalla formule che etichettano lo stato iniziale: – La formula è verificata se e solo se essa etichetta lo stato iniziale. Ingegneria del software Model checking CTL • Data una stuttura di Kripke che rappresenta una macchina a stati finiti ed una formula espressa in logica temporale che specifica lamproprietà che si desidera verificare, il problema del model checking consiste nel determinare tutti gli stati in S che soddisfano la formula Ingegneria del software Esempio mutua esclusione • Due processi concorrenti: – Eseguono alcune operazioni usando una risorsa condivisa – Entrambi i processi: • eseguono alcune operazioni non critiche rappresentate dallo stato Ni con i=1,2 • cercano di accedere alla risorsa (stato Ti trying con i=1,2) • Eseguono operazioni critiche sulla risorsa condivisa (stato Ci i=1,2) Ni Ti Ci Ingegneria del software Esempio: mutua esclusione • Problema: – Implementare un meccanismo di mutua esclusione che impedisca ai processi di accedere alla risorsa condivisa contemporaneamente: – Ogni stato è una combinazione degli stati dei due processi • nessuno stato deve implementare la combinazione degli stati C1 e C2 • l’implementazione non deve consentire che tutti e due i processi si trovino nella sezione critica Ingegneria del software Esempio: mutua esclusione N1 N2 T1 N2 C1 N2 N1 T2 T1 T2 C1 T2 N1 C2 T1 T2 T1 C2 Ingegneria del software Formula da verificare In logica temporale la formula è la seguente: AG ~(C1 ∧ C2) Si vuole, inoltre, verificare che non vi sia starvation ossia che quando un processo entra nella fase di trying prima o poi riesca ad accedere alla risorsa: AG (Ti⇒ AF Ci) Cioè AG (~Ti ∨ AF Ci) Ingegneria del software Etichettamento 1. Il processo di etichettamento inizia con l’etichettatura delle formule di lunghezza 1 ~Ti e AF Ci 2. Quindi procede con l’etichettatura dei nodi per cui valgono le formule di lunghezza 2. Cioè la formula: ~Ti ∨ AF Ci 3. Si procede con l’etichettatura delle formule di lunghezza 3. Cioè la formula: AG (~Ti ∨ AF Ci) Che andrà ad etichettare lo stato iniziale, essendo tutti gli altri stati già etichettati con le formule di lunghezza 2. Ingegneria del software Esempio: mutua esclusione etichettamento N1 N2 ~ T1 ~ T1 ν AF C1 T1 N2 AF C1 ~ T1 ν AF C1 C1 N2 ~ T1 AF C1 ~ T1 ν AF C1 N1 T2 ~ T1 ~ T1 ν AF C1 C1 N2 ~ T1 AF C1 ~ T1 ν AF C1 C1 T2 ~ T1 AF C1 ~ T1 ν AF C1 N1 C2 ~ T1 ~ T1 ν AF C1 T1 T2 AF C1 ~ T1 ν AF C1 T1 C2 AF C1 ~ T1 ν AF C1 Ingegneria del software Osservazioni • La descrizione dello spazio degli eventi ci permette di astrarre dalle funzionalità dei processi • La complessità dell’algoritmo nel caso peggiore è lineare in termini della grandezza della formula e in termini dello spazio degli stati • In caso di fallimento l’algoritmo permette di tracciare gli stati che l’hanno causato • Il numero degli sati del sistema cresce al più esponenzialmente con il numero dei processi indipendenti Ingegneria del software Riferimenti • E. M. Clarke, E. A. Emerson, A.P. Sistla, “ Automatic Verification of Finite-State Concurrent Systems using Temporal Logic Specifications”, “ACM Transaction on Programming Languages and Systems”, 8(2), april 1986, pp. 244-263. • E.M. clarke, Jr. O Grumberg, D.A. Peled, “ Model checking”, The MIT Press, 1999. • A. Fantechi ,“Informatica Industriale”, CittàStudi Edizioni,2009.