La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Sistemi e Tecnologie Informatiche Verifica di correttezza di un programma.

Presentazioni simili


Presentazione sul tema: "Sistemi e Tecnologie Informatiche Verifica di correttezza di un programma."— Transcript della presentazione:

1 Sistemi e Tecnologie Informatiche Verifica di correttezza di un programma

2 In questa lezione impareremo che … L’implementazione di programmi è intrinsecamente soggetta alla possibilità di errori. E’ possibile intervenire: a monte, riducendo la possibilità di errori a valle, semplificando l’individuazione di errori Testing Stampe tracciati di esecuzione

3 Livelli correttezza Un programma si definisce corretto quando rispetta le specifiche iniziali (e.g., un programma di ricerca ci restituisce l’indice corretto dell’elemento ricercato in una sequenza) Il malfunzionamento di un programma può dipendere sia da un errore che si annida nel programma stesso sia dall’utilizzo di dati di input non corretti (e.g. se ci viene chiesto di inserire un valore numerico, inseriamo un carattere alfabetico)

4 Livelli correttezza 1. Il programma è sintatticamente corretto 2. Il programma è sintatticamente corretto, esistono inoltre dei dati di input per i quali il programma termina restituendo il risultato esatto 3. Il programma è sintatticamente corretto e si comporta correttamente per un insieme tipico e sufficentemente grande di input 4. Il programma è sintatticamente corretto e si comporta correttamente per un insieme tipico e sufficentemente grande di input, esso riesce inoltre a rilevare i casi in cui i dati di input sono errati 5. Il programma è sintatticamente corretto e restituisce una risposta corretta per tutti gli input corretti, esso è inoltre in grado di rilevare tutti i casi in cui i dati di input sono errati

5 Tipologie di errori Errori di progetto La strategia risolutiva prescelta non soddisfa i requisiti del problema Errori di programmazione La strategia risolutiva prescelta non è stata implementata correttamente Errori nell’utilizzo del linguaggio I costrutti del linguaggio di programmazione prescelto sono stati utilizzati erroneamente

6 Errori nell’utilizzo del linguaggio E’ possibile rilevare gli errori di utilizzo del linguaggio già durante la compilazione. Questi infatti compromettono la validità formale del programma impedendo al compilatore di interpretarlo #include int main(void { intt numero; numero = 4 printf(“Il valore di numero è %d\n", numero); } 1 2 3 4 5 6 7 8 9 10 11 12

7 Errori di programmazione Gli errori di programmazione, al contrario, spesso non sono individuabili dal compilatore. Essi possono manifestarsi durante l’esecuzione del programma compromettendone lo stato di esecuzione e causandone la terminazione #include int main(void) { int numero1 = 5; int numero2 = 0; printf(“Il risultato della divisione è %f\n", (numero1/numero2)); } 1 2 3 4 5 6 7 8 9 10 11 12 #include int main(void) { int numero1 = 5; int numero2 = 0; if (numero1=numero2) printf(“I due numeri coincidono\n"); } 1 2 3 4 5 6 7 8 9 10 11 12

8 Errori di progetto Gli errori di progetto non sono immediatamente rilevabili durante la compilazione e l’esecuzione del programma stesso Un programma viziato da un errore di progetto è un programma corretto che risolve un problema diverso da quello posto inizialmente E.g: Dato un qualsiasi elenco in input, scrivere un programma che individui efficientemente un elmento al suo interno Soluzione: Utilizziamo la ricerca binaria

9 Testing E’ possibile individuare e risolvere gli errori presenti in un programma attraverso l’esecuzione di test La fase di testing consiste in: eseguire ripetutamente il programma su diversi dati di input verificare la correttezza dei risultati restituiti ad ogni esecuzione La scelta di quali dati di input usare e quante esecuzioni operare è di fondamentale importanza

10 Ispezione del codice Il codice sorgente del programma viene studiato su carta alla ricerca di eventuali errori Si opera simulando virtualmente il flusso di esecuzione del programma ed assicurandosi che questo rispetti le proprie aspettative Si annotano (anche solo mentalmente) gli errori già commessi dal momento che questi, con buona probabilità, si ripresenteranno Le variabili utilizzate sono state in precedenza dichiarate? I parametri passati alle funzioni corrispondono a quelli dichiarati? Esiste una condizione di terminazione per le funzioni ricorsive? Le condizioni di terminazione dei cicli sono corrette? Gli operatori di confronto sono corretti? Le variabili utilizzate sono state in precedenza dichiarate? I parametri passati alle funzioni corrispondono a quelli dichiarati? Esiste una condizione di terminazione per le funzioni ricorsive? Le condizioni di terminazione dei cicli sono corrette? Gli operatori di confronto sono corretti?

11 Test a scatola nera L’unica garanzia totale e certa di buon funzionamento di un programma è costituita dal provare tutti i possibili input Tale approccio non è spesso praticabile La tecnica di test a scatola nera si basa sulla suddivisione degli input in classi di equivalenza Per ciascun diverso tipo di input (classe di equivalenza) scegliamo un esempio che lo rappresenti Se il test ha successo sull’esempio prescelto, assumiamo che il programma funzioni correttamente su tutti gli input appartenenti alla stessa classe di equivalenza

12 Test a scatola nera Supponiamo di aver realizzato un programma per la ricerca di un elemento in una sequenza numerica. Al fine di testare il programma non possiamo fargli ricercare tutti i possibili elementi in tutte le possibili sequenze numeriche (!!) Distinguiamo, al contrario, diversi casi fondamentali: caso 1: INPUT: il vettore ha un solo elemento che coincide con il valore cercato OUTPUT: trovato! caso 2: INPUT: il vettore ha un solo elemento che non coincide con il valore cercato OUTPUT: non trovato! caso 3: INPUT: il vettore ha più di un elemento, uno dei quali è il valore cercato OUTPUT: trovato! caso 4: INPUT: il vettore ha più di un elemento, nessuno dei quali è il valore cercato OUTPUT: non trovato! caso 5: INPUT: il vettore è vuoto OUTPUT: non trovato!

13 Test a scatola nera Il test a scatola nera viene così definito poichè ci disinteressiamo volutamente della logica con la quale il programma è stato implementato L’unico nostro interesse è nell’assicurarci che il programma fornisca delle risposte esatte Questo approccio può comunque rivelarsi inefficiente richiedendoci un numero elevato di prove Inoltre, esso non fornisce indicazioni utili ad individuare all’interno del codice la fonte di un possibile errore

14 Test a scatola trasparente I test a scatola trasparente intervengono direttamente all’interno del codice sorgente di un programma Essi ci forniscono informazioni utili a capire cosa accade in un programma durante la sua esecuzione Intuitivamente, possiamo dire che un programma è corretto solo dopo averlo provato in tutte le sue parti Il metodo della copertura dei programmi afferma quindi che una condizione necessaria affinchè un programma sia corretto è che tutte le sue istruzioni siano state testate Un programma complesso e strutturato può però presentare numerose porzioni di codice che sono eseguite solo in alcuni casi

15 Copertura delle istruzioni Scegliamo un insieme di input in modo tale che tutte le istruzioni del programma siano eseguite almeno una volta #include int Uno(int A, int B, int C) { if (A!=0) B = B + C; if (( A<10)&&(C<20)) B = 2 * B; } 1 2 3 4 5 6 7 8 9 10 11 12 A = 0, B = 10, C = 10 A = 0, B = 8, C = 24 A = 5, B = 10, C = 45 A = 0, B = 8, C = 12 1’ tentativo 2’ tentativo

16 caso 1: la condizione della prima decisione è vera le due condizioni della seconda decisione sono vere caso 2: la condizione della prima decisione è falsa le due condizioni della seconda decisione sono vere caso 3: la condizione della prima decisione è vera la prima condizione della seconda decisione è vera, l’altra è falsa caso 4: la condizione della prima decisione è falsa la prima condizione della seconda decisione è vera, l’altra è falsa … Copertura delle decisioni Scegliamo un insieme di input in modo tale che tutte le condizioni che compaiono all’interno del programma siano almeno una volta vere ed almeno una volta false #include int Uno(int A, int B, int C) { if (A!=0) B = B + C; if (( A<10)&&(C<20)) B = 2 * B; } 1 2 3 4 5 6 7 8 9 10 11 12

17 Trattamento degli errori in input Un significativo fattore di incertezza nel comportamento di un programma è costituito dalla possibilità che i dati forniti in input allo stesso siano errati (e.g., inserire un numero negativo quando ce ne viene richiesto uno positivo) In tale caso un programma, seppur corretto, può restituire una segnalazione di errore Tali errori si combattono andando a controllare sistematicamente tutte le operazioni di Input ed assicurandosi che i valori acquisiti corrispondano alle specifiche E.g., se richiediamo in input un valore positivo, dopo averlo acquisito lo controlliamo ed eventualmente segnaliamo l’errore)


Scaricare ppt "Sistemi e Tecnologie Informatiche Verifica di correttezza di un programma."

Presentazioni simili


Annunci Google