Digits floating and making an airplane. Illustration.

Med 800 fly i lufta mistet plutselig flyvelederne på Palmdale Air Route Traffic Control Center all radiokontakt midt på en travel tirsdag i september 2004. I hele tre timer var pilotene overlatt til seg selv i det californiske luftrommet. Heldigvis skjedde ingen uhell, men en håndfull fly var urovekkende nær hverandre. Årsaken var tallet 4.294.967.295. 

Skrevet av Anders Norås, Chief Techology Officer i Itera

 

Ved første øyekast ser dette ut som et stort, men ellers nokså ordinært og uskyldig tall. Det er det ikke. Uhellet i California er bare ett av flere forårsaket av tallets natur og litt slurvete programmering. De av dere som kan telle binært vet at tallet 11111111111111111111111111111111 er det høyeste som kan telles med en 32-biters integer. De som ikke kan binærtall pleier å skrive dette tallet som 4.294.967.295. 

Programmererne bak flygeledersystemene brukt i Palmdale hadde skrevet en algoritme som hold styr på tiden ved å telle ned millisekunder fra 4.294.967.295. Når man har talt millisekunder i drøy 49 dager, 17 timer, 2 minutter og 47 sekunder går man tom for tid og man kommer til 0 – et tall som er likt både i alminnelig og binær form. Et usignert 32-biters binærtall kjenner ikke til negative tall, og tallet «flyter over» og kommer tilbake til 32 ettall når det blir mindre enn null. Det var dette som skjedde i den skjebnesvangre høstdagen i 2004 og flere tusen mennesker var i livsfare fordi en programmerer hadde valgt et litt for lite tall. 

 

Boeings programmerer hadde en annen oppfattelse av tid; i stedet for å telle ned, talte de oppover. Boeings programvare for Dreamliner-flyenes strømgeneratorer holdt styr på tiden ved å øke en teller hundre ganger i sekundet, helt til de hadde talt 2.147.483.647 ganger. Da kuttet generatorene strømmen, og programmet kunne ikke ha talt videre enten det ville eller ikke. 

2.147.483.647 er sånn sirka halvparten av 4.294.967.295. Begge er 32-biters tall, men det første er «signert» noe som betyr at det også kan være negativt. Signerte tall setter av en bit til å fortelle om tallet er positivt eller negativt. 

 

Kombinasjonen av tallvalg og algoritme førte til en overflytfeil etter at flyet hadde stått på i snaue 248 dager, 13 timer og 14 minutter. Denne feilen førte i andre rekke til at strømgeneratorene sluttet produsere strøm og dermed mistet flyet strømmen. Løsningen på problemet på en så stor maskin som en Dreamliner er det samme som i det fleste andre IT-support-tilfeller – skru maskinen av og på igjen.  

Lærdommen fra disse to nokså enkle «buggene» er at man må forstå betydningen av datatypene- og strukturene man benytter. Og ikke minst: man må teste alle scenarier, ikke bare solskinnsversjonene man forventer. 

Ps. Dersom du skal ut og fly så kan jeg betrygge deg om at Boeing har rettet feilen i sine Dreamliner-fly. Nå benytter de et 64-biters tall. Det betyr at flyet ikke trenger omstart før om en halv milliard år. Det skulle holde. 

Anders Norås

Anders Norås

Chief Technology Officer

anders.noras@itera.no

+47 906 65 828