Verifica e validazione: analisi statica
Premessa
Un software di buona qualità deve possedere le capacità funzionali specificate nei requisiti e le caratteristiche non funzionali[1] necessarie al buon funzionamento del sistema. Bisogna quindi verificare che il software possegga determinate caratteristiche di costruzione (progettazione, codifica, integrazione), d'uso e di funzionamento.
Tanto più un linguaggio di programmazione è espressivo, tanto meno è verificabile. Nel fissare il liguaggio di programmazione (e nel sceglierne i costrutti), occorre quindi trovare il giusto compromesso tra funzionalità (potere espressivo) e integrità (costo di verifica). Inoltre, è bene adottare uno standard di codifica che tenga conto delle esigenze di verifica (per esempio, vietando alcuni costrutti): così facendo, si rende possibile una verifica che non sia retrospettiva ma che accompagna la codifica.
Infatti, il costo di rilevazione e correzione di un errore è tanto maggiore quanto più avanzato è lo stadio di sviluppo. Ecco perché ci interessa accompagnare la produzione con la verifica, invece di posticipare la verifica il più tardi possibile.
Tracciamento
Parte fondamentale dell'analisi statica è il tracciamento. Il tracciamento è una verifica atta a dimostrare due caratteristiche di una soluzione:
- Completezza della soluzione: tutti i requisiti sono soddisfatti; matematicamente, vuol dire che la soluzione è condizione sufficiente per il problema.
- Economicità della soluzione: nessuna funzionalità superflua, nessun componente ingiustificato; matematicamente, vuol dire che la soluzione è condizione necessaria per il problema.
Il tracciamento ha luogo su ogni passaggio dello sviluppo (ramo discendente del modello a "V") e su ogni passaggio della verifica (ramo ascendente).
Tipi di analisi statica
L'analisi statica si effettua con diversi metodi:
- analisi di flusso di controllo;
- analisi di flusso dei dati;
- analisi di flusso dell'informazione;
- esecuzione simbolica;
- verifica formale del codice;
- verifica di limite;
- analisi d'uso dello stack;
- analisi temporale;
- analisi d'interferenza;
- analisi del codice oggetto.
L'analisi statica costruisce modelli astratti del software in esame; questi modelli considerano ogni programma come un grafo orientato e ne studiano i cammini possibili.