Dood door softwarefout

000e04
Een eenvoudig informatica-vuistregeltje zegt dat iedere duizend regels computerprogramma één fout bevatten. De meeste van deze ‘bugs’ komen nooit aan het licht, maar er zijn er ook die fikse ravages kunnen aanrichten.

Programmeerfouten zijn er in alle soorten en gedaanten, van irritant tot levensbedreigend. In de eerste categorie valt de ‘Ping of Death’, een fout die vorige maand ontdekt werd en nu nog steeds de nodige programmeurs overuren bezorgd. De fout komt er in het kort op neer dat iedere bezitter van een pc met Windows 95 en een Internet-aansluiting met een éénregelige opdracht computers elders op de wereld, ook pc’s van nietsvermoedende netsurfers, kan lamleggen.

Aanstichter van dit alles is het programma Ping. Alle op Internet aangesloten computers versturen met Ping kleine pakketjes naar elkaar om te melden dat ze er nog zijn – een routineprocedure die dagelijks miljoenen malen herhaald wordt. De versie van Ping die in Windows 95 en enkele andere besturingssystemen zit, kan ook pakketten versturen die enkele bytes groter zijn dan het gebruikelijke maximum. Als de ontvangende computer die extra bytes niet afvangt, komen ze soms in een vitaal deel van het computergeheugen terecht, met als gevolg dat het systeem er de brui aan geeft. Windows 95 zelf is niet gevoelig voor te grote pakketten, maar veel andere besturingssystemen voor pc’s, Apples en grotere machines zijn dat wel.

De Ping of death is een typisch voorbeeld van hoe fouten ontstaan in computernetwerken die bestaan uit losse systemen. De makers van de verschillende programma’s met een versie van Ping erin hielden zich aan een conventie, de maximumgrootte van een pakketje. De interactie tussen die verschillende Pings leidde zo niet tot ongelukken. Het ging pas mis toen Windows 95 zich niet meer aan de conventie hield. Dat was iets waar de programmeurs van oudere systemen geen rekening mee hadden gehouden – wat ze wel hadden moeten doen. Anderzijds zou zelfs de meest uitgebreide praktijktest de fout niet opgespoord hebben, simpelweg omdat de fatale omstandigheid pas door Windows 95 gecreëerd werd. Met andere woorden: systemen kunnen perfect werken bij introductie, maar verborgen gebreken hebben die pas aan het licht komen als voorheen niet bestaande omstandigheden waarheid worden.

Kanker

Hoe dan ook, wat computer-ongemak is nog niet zo’n ramp. Het kan erger. Op 11 april 1986 lag de 66-jarige buschauffeur Vernon Kidd onder het bestralingsapparaat Therac 25 in het East Texas Cancer Center om de huidkanker aan de rechterkant van zijn gezicht te laten behandelen. Maar in plaats van het gebruikelijke niks voelde hij deze keer een brandende pijn. Drie weken later overleed hij aan een hersenbeschadiging ten gevolge van een overdosis straling.

Uit het onderzoek dat volgde naar aanleiding van zes ernstige incidenten, waaronder drie dodelijke, bleek dat de software van de Therac 25 een rommeltje was, een slordige collage van nieuwe code en meer dan tien jaar oude stukjes uit de programma’s van voorgangers. Telkens dacht de fabrikant de fout gevonden te hebben, maar iedere keer dook een nieuwe fout op. Zo bleek de volgorde waarin de behandel-instelling werd ingevuld van invloed te zijn op de timing van het apparaat. Iets fout intikken en vervolgens herstellen had ook een ander effect dan het direct goed intypen. Kortom, er gebeurde niet altijd precies wat het scherm aangaf.

Dergelijke fouten kunnen binnensluipen via minieme slippertjes van de programmeur. Als een ingetypte waarde veranderd moet worden, roept het hoofdprogramma een deelprogramma aan dat de cursor op de juiste plek zet, de nieuwe waarde van het toetsenbord leest en die op het scherm weergeeft. Maar de nieuwe waarde moet ook expliciet doorgegeven worden aan het hoofdprogramma, anders handhaaft dat de oude waarde. Er zijn nu eenmaal ook gevallen waar een deelprogramma juist niet aan de waarden van het hoofdprogramma mag morrelen. In dit geval is het echter zo logisch dat de waarde aan het hoofdprogramma doorgegeven moet worden, dat een slordige programmeur licht vergeet een expliciete opdracht te geven.

De fouten in de Therac 25 zouden bij een degelijke testprocedure zeker achterhaald zijn. Bij een goede test krijgt het programma een grote hoeveelheid verschillende invoer te verwerken, waarbij de testers erop letten dat alle delen van het programma, ook degene die geacht worden uitzonderingen op te vangen, aan bod komen. Een deelprogramma dat systematisch dezelfde fout maakt is zo makkelijk te ontdekken, in tegenstelling tot een deelprogramma dat, zoals Ping, alleen onder zeer specifieke omstandigheden de mist in gaat. Een programma van een beetje omvang kent namelijk zoveel invoercombinaties dat die onmogelijk allemaal te testen zijn. De praktijk is zodoende onvermijdelijk de enige ultieme test, waarbij de gebruikers eigenlijk altijd wel erin slagen omstandigheden te vinden waar de ontwerpers van de software niet aan gedacht hadden.

Airbus

Eerder dit jaar deed zich bijvoorbeeld een incident voor met een Airbus 320 van Northwest Airlines, een toestel dat geheel elektronisch bestuurd wordt. Tijdens de daling naar het vliegveld van Washington DC maakte het plotseling een draai van dertig graden waar de piloot niet om gevraagd had. Het systeem bleek bij erg intensieve manoeuvres, zoals het dalen, gevoelig te zijn voor overbelasting. De computer kreeg dan zoveel opdrachten tegelijk dat hij ze niet meer allemaal aankon en sommige in de wachtkamer zette. De piloot merkte dat er nog te weinig gebeurde en corrigeerde verder totdat hij wel op de juiste koers zat. Op dat moment zaten er echter nog een heleboel correcties in de wachtkamer en toen die ook doorgevoerd werden, schoot het vliegtuig te ver door. Dit incident liep net als tiental gelijksoortige goed af, maar in voorgaande jaren crashten al drie van deze toestellen. Daarbij luidde het oordeel steeds: fout van de piloot. Cynici beweren dat zondebok wel eens de belangrijkste rol van de piloot in de toekomstige generatie vliegtuigen zou kunnen zijn.

Vliegtuigbouwers en makers van andere kritieke systemen (kerncentrales, space shuttles, enz.) getroosten zich veel moeite om middels strenge procedures, voortdurende dubbel-checks en uitgebreide tests het aantal fouten tot een minimum te beperken. Boeing gooide met het oog hierop het hele ontwerpproces van de 777 om. Ondanks alle voorzorgen bleek echter al snel na de introductie dat de boordcomputer de gevolgen van windstoten overcompenseerde, waardoor de staart onnodig heen en weer zwaaide. Voor de zekerheid stopte Boeing ook een beperkt mechanisch systeem in de 777, zodat de piloot iets achter de hand heeft als het echt mis gaat met de elektronica.

Makers van consumentensoftware als tekstverwerkers en spelletjes brengen vaak gratis zogenaamde beta-versies in omloop en recruteren zo een legertje gratis testers. Aan de hand van hun bevindingen komt de definitieve versie tot stand. Die ligt in de winkel met de nadrukkelijke boodschap aan de consument dat hij niet moet zeuren als er toch nog fouten in zitten.

Opletten

Tussen de twee extremen zit een breed scala aan kleine en grote systemen die voor specifieke doeleinden gebouwd zijn, van het besturingsprogramma van de magnetron tot de enorme databases van de bank. De magnetron is nog vrij simpel te testen, maar het testen van grotere programma’s kost zoveel tijd en geld dat ze vaak te snel in het diepe gegooid worden. Dit is de bron van de eindeloze reeks berichten over ‘moeilijkheden bij de invoer van een nieuw computersysteem’. In bijna alle gevallen betekent dat: te haastig geweest en over de eigen voeten gestruikeld. Veel managers accepteren niet dat een programma nog lang niet af is als de laatste regel code is ingetikt.

Tegen programmeerfouten helpt alleen wat in het algemeen helpt tegen fouten: opletten en geconcentreerd blijven. Er wordt weliswaar gewerkt aan methoden om de juistheid van programma’s te ‘bewijzen’, maar die kijken alleen of het uiteindelijke programma overeenkomt met de specificaties. Een fout als die in de Therac 25 zou zo waarschijnlijk aan het licht komen. De meeste fouten worden echter in het voortraject gemaakt: tijdens het exact specificeren van wat het programma moet doen. Dat blijft het werk van mensen die het opnemen tegen een wirwar van mogelijkheden waarin het bos regelmatig achter de bomen schuil gaat. Ieder programma bevat tientallen, zoniet honderden fouten, maar zelfs het best getrainde oog kijkt over de meeste heen.

Sterker nog, er zijn fouten die achter elkaar door gemaakt worden, terwijl duizenden mensen toekijken en niemand iets doorheeft. De Amerikaanse overheid vond onlangs een fout uit 1972, die betekende dat sinds die tijd in totaal bijna anderhalf miljard dollar te weinig aan pensioenen was uitgekeerd. De 400.000 gedupeerden krijgen hun geld alsnog, maar voor 57.500 van hen komt het te laat. Zij zijn in de tussentijd overleden.

Eerder verschenen in de Volkskrant, 23 november 1996 (in iets andere vorm).