A.4 Garanzie del software

La maggior parte delle software house, cioè quelle aziende che incentrano il proprio business sullo sviluppo del software, forniscono al cliente soltanto il codice eseguibile, ovvero la versione in linguaggio macchina del software stesso, senza fornire i file sorgenti che lo hanno prodotto.

Per l’utente è sì fondamentale avere il codice eseguibile per poterlo far eseguire dal sistema, fruendo così delle funzionalità del software, ma in questo modo non è possibile verificare la bontà del software stesso. Si supponga infatti che per qualche motivo nel software vi siano dei meccanismi che fanno in modo che il software fornito non si comporti esattamente come indicato dal fornitore, oppure abbia funzionalità non documentate. Chi può scoprirlo? Ad esempio, si consideri un semplice programma come potrebbe essere quello indicato come primo esempio per chi si avvicina all’apprendimento di un linguaggio di programmazione, a tutti noto come helloworld. Esso non fa altro che scrivere sullo schermo le parole “Hello world!”. Nel linguaggio di programmazione C una sua implementazione potrebbe essere la seguente (file helloworld.c):

#include <stdio.h>
main()
{
printf("Hello world!\n");
return(0);
}
Il file eseguibile (helloworld) può essere prodotto dal sorgente precedente con il comando:

 
$ gcc helloworld.c -o helloworld  
Lanciando in esecuzione tale file eseguibile si ha il seguente comportamento:

 
[daniele@Zeus ~]$ ./helloworld
Hello world!
[daniele@Zeus ~]$ _  
Ma avendo soltanto il file eseguibile di tale programma (helloworld), non si può affermare con certezza assoluta che quello che esso fa è esattamente l’effetto che si nota di scrittura sullo schermo di “Hello world!”. Infatti, si supponga di compilare il seguente programma (helloworld1.c)

#include <stdio.h>
main()
{
FILE *fp;
printf("Hello world!\n");
                                                                        
                                                                        
if ((fp = fopen("helloworld.txt","w")) != NULL)
{
  fprintf(fp,"File creato da helloworld.\n");
  fclose(fp);
}
return(0);
}
con il comando

 
$ gcc helloworld1.c -o helloworld  
Lanciando in esecuzione il file eseguibile helloworld così ottenuto, si può riscontrare un comportamento simile al precedente

 
[daniele@Zeus ~]$ ./helloworld
Hello world!
[daniele@Zeus ~]$ _  
Il nuovo helloworld, non si limita a scrivere sullo schermo “Hello world!”, ma crea anche un file helloworld.txt al cui interno scrive “File creato da helloworld.”. Questa operazione secondaria non è così evidente agli occhi dell’utente che crederà che il nuovo helloworld abbia le stesse funzionalità di quello vecchio. In realtà fa qualcosa in più. Questo è soltanto un esempio, ma helloworld potrebbe fare chissà quali altre cose ancor più nascoste agli occhi dell’utente (e più pericolose) rispetto alla creazione di un file: potrebbe cancellare dei file, lanciare altri processi, inviare e-mail a terzi, ... tutto ciò senza che l’utente sia avvisato. Ovviamente tali operazioni “poco evidenti” sarebbero individuabili avendo a disposizione i file sorgenti.

Quindi, l’uso del software dovrebbe essere fatto in maniera oculata. Disponendo dei sorgenti è possibile analizzarli e verificare che il software non abbia funzionalità non desiderate. Se non si hanno le competenze tecniche per analizzarli si potrebbe decidere di ingaggiare qualcuno in grado di farlo. Visto che sono disponibili i sorgenti del software in questione, è comunque possibile che qualcun’altro li abbia già analizzati e magari abbia rese note le eventuali “strane” caratteristiche in essi presenti, ed addirittura potrebbe aver modificato il software stesso togliendo le funzionalità indesiderate, rendendo disponibile la nuova versione del software. Questo possibile circolo virtuso non può essere creato con il software di cui non si dispone dei sorgenti. Dunque, dal punto di vista della conoscenza delle funzionalità, in generale è più sicuro l’utilizzo di software open source o software libero rispetto a quello di software i cui sorgenti non sono disponibili (software closed source).