# Therac-25

Il Therac-25 è stata una macchina per la radioterapia, prodotta dalla canadese AECL come succeditrice alle unità Therac-6 e Therac-20, realizzate inizialmente insieme alla francese Compagnie Generale de Radiologie.
Questa macchina, che tra il 1985 ed il 1987 venne installata in 11 esemplari in alcuni ospedali degli Stati Uniti e del Canada, è stata affetta da una serie di bug nel programma informatico responsabile del suo funzionamento, che provocarono sei incidenti durante i quali ai pazienti venne somministrata una dose di radiazioni 100 volte superiore a quella necessaria (in alcuni casi l'apparecchio si attivò anche senza aver ricevuto l'apposito comando), causando un avvelenamento da radiazioni e, direttamente, il decesso di tre dei sei pazienti. Questi incidenti dimostrarono i pericoli che si possono manifestare in caso di errori nei software usati per comandare apparecchiature medicali e, più in generale, sistemi che possono causare danni a cose e/o persone in caso di malfuzionamento, e sono divenuti un tipico caso di studio nelle materie di informatica medica e ingegneria informatica.

## Descrizione del problema
### L'interfaccia utente

L'interfaccia utente veniva visualizzata e gestita tramite un terminale video VT100 con tastiera, situato in uno studio dal quale il tecnico radiologo poteva supervisionare la terapia e interagire con il paziente mediante una telecamera con relativo monitor e un microfono. Di norma il tecnico faceva accomodare il paziente sul lettino radiografico e posizionava il macchinario nel punto necessario affinché la radiazione fosse diretta verso il punto del corpo del paziente da trattare, poi lasciava la sala di trattamento e, tornato nello studio, immetteva i dati richiesti nel terminale: il nominativo del paziente, la tipologia di terapia da eseguire, l'energia della radiazione da erogare, la quantità di radiazione da emettere per unità di tempo, la durata del trattamento e la posizione in cui era stata sistemata la macchina. Il software controllava che i dati inseriti corrispondessero alla reale situazione della macchina e consentiva di continuare il processo solo quando corrispondevano, mostrando la scritta "VERIFIED" (verificato), altrimenti la procedura veniva bloccata. Solo quando tutti i dati risultavano corretti e verificati, si poteva procedere ad avviare il trattamento digitando il comando "B" nella riga "COMMAND". La procedura di verifica dei dati, piuttosto lunga e noiosa per l'operatore, permetteva un doppio controllo sulle impostazioni della terapia. A seguito di lamentele, la AECL consentì, per il Therac-25, di ricopiare i dati che comparivano nella colonna "PRESCRIBED" nella colonna "ACTUAL" semplicemente premendo il pulsante di "carriage return", escludendo quindi il doppio controllo.
Interfaccia utente della macchina Therac-25 :
* PATIENT NAME : JOHN DOE
* TREATMENT MODE : FIX BEAM TYPE: X ENERGY (MeV): 25
* ACTUAL PRESCRIBED
* UNIT RATE/MINUTE 0 200
* MONITOR UNITS 50 50 200
* TIME (MIN) 0.27 1.00
* GANTRY ROTATION (DEG) 0.0 0.0 VERIFIED
* COLLIMATOR ROTATION (DEG) 349.2 359 VERIFIED
* COLLIMATOR X (CM) 13.2 14.3 VERIFIED
* COLLIMATOR Y (CM) 21.2 27.3 VERIFIED
* WEDGE NUMBER 1 1 VERIFIED
* ACCESSORY NUMBER 0 0 VERIFIED
* DATE : 84-DEC-27 SYSTEM : BEAM READY OP. MODE : TREAT AUTO
* TIME : 12:55: 8 TREAT : TREAT PAUSE X-RAY 173777
* OPR ID : T25V02-R03 REASON : OPERATOR COMMAND:

### La terapia

La macchina offriva due diverse tipologie di radioterapia:
* Terapia a base di fasci di elettroni, che erogava un fascio di elettroni con energia regolabile da 5 MeV a 25 MeV;
* Terapia a base di raggi X ad alta energia, che erogava raggi X tramite il bombardamento di un bersaglio metallico con un fascio di elettroni con energia di 25 MeV.
Esisteva inoltre una terza modalità di funzionamento, chiamata "field light mode", che era utile unicamente in fase di preparazione per sistemare l'apparecchio nel punto adatto, in quanto in tale modalità non venivano emessi elettroni ma un sottile fascio di luce visibile, che illuminava il paziente nel punto in cui il raggio si sarebbe diretto azionando la macchina nella posizione in cui si trovava.
Quando la macchina era impostata per erogare elettroni, veniva prodotto un fascio di elettroni all'energia impostata mediante i comandi, indirizzato e diffuso tramite dei magneti di guida e un diffusore. Quando si effettuava la terapia a raggi X, invece, la macchina emetteva un fascio di elettroni alla massima energia che attraversava 4 componenti, posizionati meccanicamente in modo automatico solo quando era attiva questa modalità di trattamento: un bersaglio metallico, che emetteva i raggi X quando colpito dagli elettroni; un filtro a diffusione, che diffondeva i raggi X in un'area più grande; un collimatore, che modificava il contorno del fascio di raggi X; una camera a ionizzazione, che misurava la quantità di raggi X emessa.
I primi incidenti accaddero in quanto si verificò l'emissione degli elettroni ad alta energia senza che contemporaneamente fosse stato posizionato il diffusore. Il fascio di elettroni ad alta potenza colpì direttamente i pazienti con una dose circa 100 volte superiore a quella desiderata, causando una sensazione descritta come una scossa elettrica e un forte calore, che portava i pazienti ad urlare chiedendo aiuto e, a volte, a scappare dalla stanza. Alcuni giorni dopo, i pazienti soggetti a questo genere di incidenti mostravano i sintomi di un avvelenamento da radiazione e, sulla parte esposta, esibivano delle bruciature da radiazioni; in seguito all'avvelenamento, tre di queste persone sono decedute.
Un altro tipo di incidente accadde, successivamente, con una modalità diversa: la macchina entrò in funzione emettendo il fascio di elettroni alla massima energia mentre erano ancora in corso le impostazioni e non era ancora stato impartito il comando di avvio.
Le debolezze del programma vennero individuate in una serie di race conditions e in un overflow numerico.

## Cause principali

La commissione di inchiesta concluse che le cause principali erano imputate ad un programma scritto e sviluppato male, senza fare riferimento specifico ai molti errori di programmazione rilevati. Il programma, in particolare, era scritto in modo tale da rendere praticamente impossibile qualsiasi genere di test automatico.
I ricercatori che investigarono sul caso trovarono numerose concause a questo problema, alcune delle quali direttamente imputabili agli organi competenti:
* L'AECL non aveva fatto verificare e validare il software da un organismo indipendente.
* L'AECL non aveva progettato il programma considerando come esso avrebbe dovuto comportarsi in caso di errore.
* Sia il personale della AECL che gli operatori sanitari, inizialmente, non credevano che vi fossero problemi tecnici, probabilmente a causa di un eccesso di sicurezza.
* Quando il sistema rilevava un malfunzionamento, il terminale video mostrava la scritta "MALFUNCTION" seguita da un numero identificativo del problema compreso tra 1 e 64, ma l'emissione dei raggi veniva arrestata solamente per alcuni dei possibili problemi. L'operatore aveva quindi la possibilità di premere il tasto "P" per ignorare l'errore e proseguire il trattamento. Nello specifico, il problema che causava gli incidenti veniva indicato con il messaggio "MALFUNCTION 54" e faceva entrare in pausa la macchina. I manuali forniti agli operatori non riportavano le corrispondenze dei codici di errore con i relativi problemi e, oltretutto, capitava piuttosto di frequente che comparissero messaggi di errore che, anche se ignorati, non impedivano di portare a termine la terapia senza danni; a causa di ciò, probabilmente, gli utilizzatori furono portati ad ignorare le segnalazioni ed a far ripartire il trattamento con il tasto "P".
* L'AECL non aveva mai eseguito test operativi della macchina Therac-25 e del relativo programma prima che i vari esemplari venissero installati negli ospedali.
I ricercatori individuarono anche numerosi problemi di carattere ingegneristico:
* L'errore "MALFUNCTION 54" si verificava quando veniva inserita una particolare sequenza di comandi tramite la tastiera del terminale VT100, che controllava un computer PDP-11: l'inserimento di "X" nel campo "BEAM TYPE", cioè una selezione erronea della modalità raggi X da 25 MeV, e la discesa con i pulsanti a freccia della tastiera fino al campo "COMMAND", seguite negli 8 secondi successivi da un ritorno a "BEAM TYPE" con l'inserimento di "E" per correggere l'errore selezionando, come desiderato, la modalità elettroni a energia variabile e, infine, dal ritorno a "COMMAND" per avviare il trattamento. Le routine di controllo non riuscivano a sincronizzarsi correttamente con il terminale utente durante tale lasso di tempo di 8 secondi, di conseguenza si verificavano delle race conditions a seguito delle quali il programma attivava l'emissione di elettroni a 25 MeV, propria della terapia a raggi X, e al contempo non richiedeva il posizionamento del convertitore, come correttamente previsto nella terapia ad elettroni. Venendo digitata solamente in caso di un errore nell'inserimento del tipo di terapia e di una sua veloce correzione, questa sequenza risultava piuttosto improbabile, così il problema non venne rilevato fino a quando gli operatori che utilizzavano la macchina commisero accidentalmente tale errore dopo aver acquisito un'esperienza tale da utilizzare i comandi piuttosto velocemente.
* Al contrario delle altre macchine della serie Therac, il Therac-25 non era dotato di dispositivi di sicurezza fisici per evitare che il fascio di elettroni venisse azionato alla massima energia senza il convertitore.
* Il produttore aveva riciclato parti di codice presenti nei modelli Therac precedenti, che tuttavia, al contrario di questo modello, erano dotati di interblocchi, ovvero di moduli di programmazione deputati ad ulteriori controlli di sicurezza dello stato della macchina. Tali interblocchi, però, non segnalavano il loro intervento, quindi il problema, presumibilmente, si era manifestato anche sulle macchine dei modelli precedenti, sulle quali veniva gestito senza possibilità di essere rilevato.
* Gli incidenti dovuti all'attivazione della macchina improvvisa e non prevista durante la preparazione furono dovuti all'utilizzo da parte del programma di una variabile numerica che si modificava continuamente a seguito della variazione delle impostazioni ed a cui veniva assegnato il valore di 0 nel momento in cui veniva impartito il comando di avvio del trattamento. Tale variabile era allocata in uno spazio di memoria pari a 1 byte, che può contenere solamente valori numerici compresi tra 0 e 255, pertanto ogni volta che essa raggiungeva il valore di 255 si verificava un overflow che la riportava a 0, e ciò causava l'azionamento della macchina senza prestare attenzione alle reali condizioni in cui essa si trovava.
Il programma era scritto in assembly, linguaggio molto complesso e a basso livello tale da richiedere una grande attenzione nella programmazione. La scelta del linguaggio di programmazione non fu comunque ritenuta una causa. Le macchine inoltre possedevano un proprio sistema operativo.