La qualità di gran lunga più ricercata è la correttezza, cioè assicurare che il programma non contenga errori che portano a risultati sbagliati.
Si noti che in questo momento non interessa verificare la rispondenza alle specifiche in senso lato, ma i veri e propri errori di programmazione che conducono a blocchi del sistema, a risultati palesemente scorretti, a danneggiamento logico o fisico degli archivi.
E valida la tecnica di provare i programmi? Un programma che supera indenne la fase di test è un programma privo di errori?
Un test, per assicurare la correttezza assoluta di un programma, dovrebbe eseguire tutti i possibili percorsi con tutte le possibili combinazioni di dati. Purtroppo questo progetto è di difficile realizzazione.
Consideriamo i possibili percorsi allinterno di un programma.
Se questo è costituito di una sequenza di istruzioni vi è un unico modo di eseguirle: una dopo laltra.
In questo caso il percorso è uno solo.
Appena inseriamo una istruzione di selezione, una IF, i percorsi possibili diventano 2, uno che passa per la parte TRUE e uno che passa per la parte FALSE.
Se le istruzioni di IF sono due, i percorsi possibili diventano quattro:
TRUE-TRUE, TRUE-FALSE, FALSE-TRUE, FALSE-FALSE.
Si vede immediatamente che il numero di precorsi è 2 elevato al numero di IF, quindi con 16 istruzioni di selezione abbiamo:
216 = 65536 percorsi possibili.
Chiaramente un programma con 16 IF è un programma piccolissimo, ma siamo già arrivati ad un numero spropositato di percorsi possibili!

Ancora più sorprendenti sono le considerazioni rispetto alle possibilità aperte dai dati.
Immaginiamo di voler testare in modo esaustivo loperazione di moltiplicazione tra numeri interi fino a 60 bit (operazione che viene compiuta ogni giorno da tutti i computer).
Se il tempo necessario per eseguire una moltiplicazione è di un microsecondo, il tempo totale di test è:
2 2 * 60 * 10 -6 sec. = 3.2 * 1022 anni.
Da queste considerazioni deriva limpossibilità di garantire la correttezza del programma provando ad eseguirlo, al massimo verranno rilevati parte degli errori presenti.
Lunico modo sicuro di creare un programma corretto è costruirlo senza errori.
Non bisogna costruire e poi controllare se è giusto, bisogna costruire bene e poi verificare se si sono rispettati i criteri di "giustezza".