Il quizzettino oltre che farci conoscere Alessandro (è uno studente del dr.prof, vero?) mi ha fatto tornare in mente un episodio di trent’anni fa. Siccome credo sia ormai caduto in prescrizione lo racconto.

Io sono un pasticcione. Ma allora capitava, con i computer mini (armadi con diversi terminali collegati) che si usavano allora che sullo stesso programma ci mettessero le mani diverse persone, magari in tempi diversi e senza documentare niente. Per cui i pasticci erano più probabili.
Il codice dell’esempio può essere preso come esempio: nessun test, nessuna indicazione dell’autore.
Il mio caso era un po’ diverso: c’era uno switch (che in Fortran allora si faceva con dei GOTO) per una condizione che poteva assumere valori minori di 3, uguale a 3 e maggiore di 3. Il secondo caso era estremamente improbabile e io l’avevo testato in fase di implementazione, dimenticandomi di riprovarlo nella versione finale, con l’output definitivo e lì c’era un bug che è rimasto nascosto per un paio d’anni. Poi è saltato fuori in un momento in cui ero fuori, allora non c’erano i telefoni cellulari e io ero giovane e cazziabile.
Solo per gioco ho provato a riprodurre una condizione di errore simile, in quattro linguaggi, quelli che conosco.
#include <stdio.h>
int mai(int x)
{
int d = 0;
return x / d;
}
int main()
{
//int r = 42;
int r = mai(5);
printf("risultato = %d\n", r);
return 1;
}
def mai(x): d = 0 return x / d #r = 42 r = mai(5) print "risultato =", r
(define (mai x)
(set 'd 0)
(/ x d)
)
;(set 'r 42)
(set 'r (mai 5))
(println "risultato = " r)
(exit)
implicit none integer :: r !r = 42 call mai(5, r) print *, "risultato =", r end subroutine mai(x, r) integer :: x, r integer :: d = 0 r = x / d end subroutine
In ogni caso se è presente una funzione che non viene mai usata non c’è alcuna segnalazione d’errore.
In caso di errore il comportamento varia, ecco:

Notare che il comportamento del C e del Fortran è identico (entrambi usano GCC) e molto in stile Unix, quello dei due linguaggi interpretati più verboso e chiaro (e il più lisposo è Python
).
Tornando al mini di allora (il Pr1me, il mio primo amore) le cose potevano essere ancora peggio. Se una funzione (a proposito per il Fortran uso le subroutine, più mainstream) non era mai chiamata non era necessario che ci fosse: il link pensava che fosse da qualche parte, in qualche libreria. Questo codice sarebbe passato indenne da compilatore e link.
implicit none integer :: r r = 4 if (r > 10) call mai(50, r) print *, "risultato =", r end !subroutine mai(x, r) !"integer :: x, r !integer :: d = 2 !r = x / d !end subroutine
Adesso invece

Trent’anni non sono passati invano.
Ah! per chi fosse curioso di sapere com’è poi finita la storia del mio bug: il capo aveva fatto cambiare leggermente i dati di input in modo da uscire dalla condizione che dava errore. Tutto bene quindi? No perché il fatto aveva rafforzato la convinzione che i calcolatori (allora i ‘puter si chiamavano così) non erano affidabili; e i programmatori ancora meno.

Commenti
OT si sono uno studente del prof. Lipari.