En lille indrykningsfejl eller sådan noget

gotofailteaser_apps

For snart mange år siden holdt jeg et fjernundervisningskursus i algoritmeteori; de studerende var folk med nogle års erhvervserfaring, der nu ville have en bachelorgrad i datalogi. Mange faldt fra, andre gik ned på matematikken. Et halvt år efter eksamen fik studienævnet en klage fra tre studerende, der hver var dumpet i deres tre første eksamensforsøg. De anførte at de, da kurset skulle afholdes, fejlagtigt havde fået at vide at eksamen ville være mundtlig. Men de havde været til skriftlig eksamen – hele tre gange. Det var da for galt! Og så var der en indrykningsfejl i en af opgaverne. Det var da for galt! De tre studerende, der hver var dumpet tre gange, mente på denne baggrund at de skulle have kurset meritoverført som bestået. Det fik de ikke medhold i.

Jeg vil ikke påstå at jeg har fået øget respekt for de pågældende studerende, men jeg har fået øget respekt for indrykningsfejl i programmer. Det er ikke tit, man ser populærvidenskabelige artikler, der handler om programanalyse, men Slate skriver om et mindre sikkerhedshul i Apples software. Alene dét er et tegn på hvor væsentligt et problem der dukkede op.

Og det skyldes noget, der ligner en indrykningsfejl.  Der er tale om en fejl, der har eksisteret i både iOS og Mac OS X, så både iPhone-, iPad og Mac-brugere har været berørt. (På dette tidspunkt er det at jeg kryber ned under skrivebordet og indrømmer at jeg er sådan én. Bevares, der er en god sandsynlighed for at en del andre derude også har sådanne kasser.) Fejlen dukker op i den kode, der skal teste om en krypteret forbindelse er sikker:

OSStatus err;

if ((err = ReadyHash(&SSLHashSHA1, &hashCtx)) != 0)
goto fail;

if ((err = SSLHashSHA1.update(&hashCtx,  &clientRandom)) != 0)
goto fail;

if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0)
goto fail;

if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
goto fail;
goto fail;

if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
goto fail;

fail:

return err;

Denne lille stump kode tester om tre bestemte tal hver især er forskellig fra 0 (dette er et C-lignende sprog, så egentlig er det sandhedsværdier); hvis det er tilfældet for mindst én af dem, hopper vi til fail. Dette er programmering med goto, noget man plejer at advare imod – men programmet er skrevet i et C-lignende sprog, så sådan er det nødt til at være. Men bemærk at der ét sted i koden er to goto fail lige efter hinanden. Det betyder at den sidste goto fail er uafhængig af testene ovenfor og altid vil blive udført, uanset hvad! Det var jo ikke meningen.

Fejlen har allerede fået sit eget websted. Den er af den slags, som studerende på et indledende programmeringskurser vil kunne begå og sidde og slås med alt for længe. Som artiklen fra Slate påpeger, skyldes den dog nok ikke inkompetence, men at den ekstra goto fail har sneget sig ind da to versioner af samme program blev flettet af en programmør. Den slags biks kender jeg da også selv til.

Løsningen på denne slags problemer er så vidt jeg kan se derfor ikke nødvendigvis de metoder til programanalyse, jeg så ofte ender med at være fortaler for, men vel snarere en bedre editor, der gjorde det nemmere at få overblik over programteksten, eller et versionskontrolværktøj, der var strukturorienteret. Denne slags strukturorienterede værktøjer interesserede man sig meget for i datalogi for 20-25 år siden, men så fandt man på noget andet at kaste sig over.

I en strukturorienteret editor ville programmøren kunne se problemet med det samme, for det andet goto fail ville aldrig være rykket ind på samme niveau som det første. Og i et strukturorienteret værktøj til fletning af programversioner ville man simpelthen kunne undgå at der blev to forekomster af goto fail lige efter hinanden.

Hvis man skal sige noget godt om hele denne misère, er det at fejlen blev opdaget fordi den pågældende programkode var open source og derfor frit tilgængelig til granskning. Mere af den slags, tak.

(Visited 33 times, 1 visits today)

Flattr this!

Loading Facebook Comments ...

Skriv et svar