| (kliknite za veću sliku) |
Bagovi su stalni pratioci kompjuterskih programa i softverske kuće su spremne da investiraju puno novca u njihovo otkrivanje. Popularni operativni sistemi i aplikacije su postali primamljiv teren za dobre programere, ne samo zbog pisanja novih programa, nego zbog lociranja bagova u postojećim programima. Google je do sada uplatio više od 290.000 dolara kao honorare ljudima koji su prijavljivali bagove u Chrome‑u, a garantovani minimalni bonus za ovu uslugu je hiljadu dolara. Postoje i posredničke kuće koje ovakve prijave plaćaju čak i do 20.000 dolara za svaki bag, pa ih potom preprodaju proizvođačima softvera koji su te bagove napravili. Zašto su informacije o bagovima tako skupe? Nekoliko sledećih primera će nam pomoći da pronađemo odgovor na to pitanje.
Greška od 0,1 mikrosekunde odnela 28 života
Tokom Zalivskog rata početkom devedesetih godina prošlog veka Iračani su intenzivno bombardovali izraelske i američke položaje projektilima Scad, ali je skoro svaki od njih bio uspešno uništen projektilom Patriot. Dogodilo se, ipak, da je jedan od projektila prošao neprimećen i ubio 28 američkih vojnika. Kako?
Radarski sistem za detekciju projektila je imao sistemski sat koji je precizno merio vreme s tačnošću do jedne desetinke sekunde, a vreme u sekundama je računato tako što je stanje brojača sistemskog sata množeno sa 0,1. Za ovo je korišćena 24‑bitna aritmetika, što bi (barem na prvi pogled) trebalo da bude dovoljna tačnost, jer je radar slao podatke Patriot‑u, koji je onda precizno locirao projektil i uništavao ga.
| (kliknite za veću sliku) |
Decimalni broj 0,1 se u 24‑bitnoj binarnoj aritmetici predstavlja kao 0,000.110.011.001.100.110.011.001, a to je pri konverziji za svaku desetinku sekunde stvaralo grešku od 0,000.000.095 sekundi, što je tek nešto manje od 0,1 mikrosekunde. Problem je nastao zbog toga što je sistem neprekidno radio oko 100 sati, za koje vreme se akumulirala greška od, sada više ne zanemarljivih 0,36 s.
Patriot je takođe imao sistemski sat, pa kada je dobio vreme detekcije projektila, potražio ga je na delu neba na kome ga je očekivao. Pošto Scad za 0,36 sekundi preleti 600 metara, Patriot ga na tom delu neba nije video i učinio ono što se više puta pokazalo kao ispravan zaključak – proglasio ga je za pogrešno detektovanu metu ili metu koja se u međuvremenu srušila sama od sebe. Posle nekoliko sekundi, Scad je pogodio cilj i 28 vojnika je izgubilo život, a 98 je povređeno. To se dogodilo 25. februara 1991. godine.
Zanimljivo je da je bag bio primećen i prijavljen 14 dana ranije, pa je proizvođač softvera počeo da radi na ispravci i u međuvremenu savetovao vojnicima da povremeno restartuju sistem, kako bi se izbegla akumulacija greške. Nažalost, izostavljen je podatak koliko često ga treba restartovati, pa su ofciri ignorisali taj savet. Nova verzija softvera, sa ispravljenim bagom, stigla je 26. februara – sa samo jednim danom zakašnjenja.
Zašto je eksplodirala Ariana 5?
Evropska svemirska agencija je 4. juna 1996. godine lansirala raketu bez posade nazvanu Ariana 5. Samo pola minuta po lansiranju raketa je eksplodirala. Posle dve nedelje istrage, objavljen je nalaz da je za katastrofu kriv softverski bag, koji se ponovo odnosio na nedovoljnu tačnost aritmetičkih operacija.
Sistem za merenje horizontalne brzine je radio u 64‑bitnoj aritmetici sa pomičnim zarezom (floating point), posle čega je rezultat, radi dalje obrade, konvertovan u 16‑bitni broj. Nije se očekivalo da taj broj bude veći od 65.535, što je maksimalni prikaz 16‑bitnog broja, ali je neko „za svaki slučaj“ upotrebio aritmetiku s predznakom (signed integer), pa je ovaj opseg prepolovljen i iznosio je samo 32.767. S obzirom na to da je horizontalna brzina modela Ariana 5 značajno veća nego kod Ariana rakete četvrte generacije, najviši dopušteni 15‑bitni broj je samo malo prekoračen, što je najnepovoljniji slučaj, jer se u celobrojnoj binarnoj aritmetici sledeći broj (32.768) predstavlja kao najveća moguća brzina, ali sa negativnim predznakom, dakle u suprotnom smeru. Tada su sve automatske komande poremećene i... Eksplozija. Razvoj programa Ariana je koštao sedam milijardi dolara, a cena uništene rakete i opreme koju je ona nosila bila je „samo“ pola milijarde. Ljudskih žrtava, srećom, nije bilo.
Sličan problem se dogodio mnogo ranije, 1962. godine. Tokom lansiranja svemirske sonde Mariner 1 raketa je neočekivano skrenula s kursa, pa je odlučeno da se uništi na sigurnom mestu, iznad Atlanskog okeana. Istragom je utvrđeno da je greška nastala u softveru, kada je algoritam, inače pisan olovkom na papiru, ručno preveden u mašinski kod kompjutera, pa je napravljena greška. Da, tada se upravo tako radilo – pisanje koda na papiru.
100 puta jača radijacija
U lečenju kancera često se primenjuje terapija malom dozom radijacije, koju generišu specijalni medicinski uređaji. Desilo se, ipak, da je mašina Therac‑25 imala softverski bag koji je pacijenta „bombardovao“ radijacijom oko sto puta jačom od terapijske doze.
Ove mašine imaju dva radna moda: u jednom modu se obolelom tkivu direktno upućuje slab snop elektrona (beta čestica), a u drugom snažan snop, kojim se najpre „gađa“ metalni zaslon, koji taj snop elektrona konvertuje u X‑zrake i usput im višestruko umanjuje snagu. U ranijim modelima mašine postojali su hardverski detektori koji su proveravali da li se metalni zaslon nalazi na svom mestu i da li je jačina snopa radijacije u dozvoljenom okviru, ali su projektanti modela Therac‑25, verovatno zbog uštede, odlučili da uklone te detektore i da jednostavno veruju da će mašina raditi bez greške.
Takav sistem je od mašine za lečenje do mašine za ubijanje pacijenata delila samo softverska greška – i ona se, nažalost, dogodila. Povremeno je u kontroleru mašine dolazilo do prekoračenja aritmetičkog opsega, što softver nije detektovao, a hardver za proveru nije postojao. Zbog svega toga servo uređaj za postavljanje zaslona nije radio, pa je određeni broj pacijenata dobio visoku dozu zračenja, a najmanje petoro je zbog toga umrlo.
Incident sa sličnim ishodom se dogodio u novembru 2000. godine u „Nacionalnom institutu za rak“ u Panama Sitiju. Uređaj za terapiju kancera je radio tako što je emitovao širok snop X‑zraka, a zdravo tkivo pacijenta je štićeno metalnim pločama koje su apsorbovale radijaciju. Postupak pripreme terapije bio je takav da je specijalista najpre u grafičkom okruženju kompjutera crtao ove metalne ploče, kako bi izračunao relevantne parametre za zračenje.
Softver je dozvoljavao da postoje četiri ovakve ploče, a specijalistima je u nekim slučajevima trebalo pet. Zato su oni došli na ideju da „prevare“ mašinu tako što će nacrtati samo jednu ploču, s rupom u sredini. Postojala je, nažalost, jedna stvar koju nisu znali – ako se dimenzije rupe definišu s jedne strane, kompjuter će izračunati jednu dozu zračenja, a ako je rupa definisana s druge strane, preporučena doza će biti dva puta veća. Rezultat ove igre s tuđim životima bio je da je dvadeset ljudi pretrpelo ozbiljno oštećenje zdravlja, a najmanje osam pacijenata je umrlo. Lekari su u sudskom postupku osuđeni za ubistvo.
Nuklearni napad na Sovjetski Savez
| (kliknite za veću sliku) |
Šta god da ste radili 26. septembra 1983. godine, sigurno je da niste bili svesni toga da je čovečanstvo na ivici nuklearnog rata. Tada je hladni rat između Sjedinjenih Američkih Država i Sovjetskog Saveza bio u punom zamahu i svaka greška je mogla da izazove katastrofu nezamislivih razmera.
Iz nepoznatih razloga, sovjetski satelitski sistem za rano uzbunjivanje je toga dana, samo nekoliko minuta posle ponoći, prijavio da je druga strana upravo ispalila pet nuklearnih projektila. Stanislav Petrov, koji je tada dežurao u tajnom skloništu pored Moskve, našao se pred najtežom odlukom u životu. Znao je da trenutna politička situacija nije bila posebno kritična i da za takav napad nije bilo vidljivog razloga, a bili su mu poznati i nedostaci sistema za rano uzbunjivanje. Osim toga, njegova procena je bila da pet projektila, iako bi izazvali ogromne ljudske žrtve i materijalnu štetu, ni izdaleka nisu dovoljni da odluče o ishodu prvog napada na ogromno prostranstvo Sovjetskog Saveza, pa takav napad ne bi imao stratešku logiku.
Sve to je bilo dovoljno da donese zaključak da je došlo do lažne uzbune i da pre kontranapada treba načiniti još jednu proveru. Takva odluka je možda bila rezultat njegovog iskustva, intuicije ili naprosto sreće, ali je svakako bila ispravna.
Skupa Intel‑ova greška
Devedesete godine prošlog veka bile su uzbudljive, ne samo zbog ratnih sukoba u (tada već praktično bivšoj) SFR Jugoslaviji nego i zbog vrlo burnog razvoja kompjuterske tehnologije. Svaka sledeća generacija procesora bila je nekoliko puta brža od prethodne, cena memorija i hard diskova je vrtoglavo padala, a grafičke kartice su bile moćnije od svega što smo mogli da zamislimo pre toga.
Zbog svega toga, nije čudno to što smo u martu 1993. godine s uzbuđenjem dočekali novi Intel‑ov procesor Pentium (P5). Zadovoljstvo nam je ipak bilo pokvareno kada je sledeće godine objavljeno da u aritmetičkoj jedinici procesora postoji bag koji je pod izvesnim okolnostima izazivao grešku u aritmetici s pomičnim zarezom. Greška se, sudeći po rezultatima numeričkoj analize, pojavljivala u jednoj od 9 milijardi računskih operacija deljenja i u najnepovoljnijem slučaju je iznosila 0,006%, ali je i to dovoljno da postavi Intel na stub srama. Treba znati da je u to vreme procesor bio skuplji nego što je danas ceo računar solidnih karakteristika, pa je ovo nezadovoljstvo bilo sasvim opravdano.
Proizvođač je najpre izjavio da je greška minorna, ali se bunt javosti nije stišavao. Intel je najpre preuzeo obavezu da zameni procesor korisnicima koji dokažu da greška može da utiče na posao kojim se bave, a nekoliko meseci kasnije, čak i svima koji se jave.
Iznenađujuće je to što se, pored svega, veoma mali broj ljudi prijavio da iskoristi mogućnost besplatne zamene. Tako se, naglo kao što je počela buka oko Pentium baga stišala. U januaru 1995. godine, Intel je objavio da je bag koštao kompaniju 475 miliona dolara.
Milenijumski bag
Čuvena „Milenijumska buba“, ili Y2K bag, nastala je zbog jedne „sitnice“ koja je lako mogla i da se predvidi. U poslednjim decenijama dvadesetog veka, pisani su programi u kojima je godina memorisana samo sa poslednje dve cifre, pri čemu se za prve dve podrazumevalo „19“. Sve je navodilo na zaključak da će, kada dočekamo 2000. godinu, kompjuteri misliti da je 1900, pa će u mnogim sistemima, koji se na bilo koji način oslanjaju na vreme, nastupiti haos. Mediji su prenosili prognoze stručnjaka da će ova greška dovesti do teških softverskih havarija na svim informatičkim uređajima, pa su vlasnici odvojili pozamašna sredstva da se programi još jednom „prečešljaju“ i posledice koliko – toliko ublaže.
Ispostavilo se da je strah bio neosnovan. Posle svega, ostao je samo utisak da su taj strah širili sami informatičari jer su videli mogućnost da deo sredstava sliju u svoje džepove. Treba, ipak, znati da priča o ovom bagu još nije završena, jer mnogi kompjuteri koji rade pod operativnim sistemom Unix nose u sebi sličnu „tempiranu bombu“. Njihov sistemski sat radi tako što samo broji sekunde od 1. januara 1970. godine (recimo, na Novu 1980. godinu sat je pokazivao 315.532.800 sekundi), a svaki program će tek iz toga računati datum i vreme. Ovaj broj se memoriše kao 32‑bitni ceo broj sa predznakom (Signed Integer), čiji maksimalni domet iznosi 2.147.483.647. To znači da će programi koji rade pod Unix‑om ispravno računati vreme samo do 19. januara 2038, a onda će za njih nastupiti nova „milenijumska buba“.
Ovaj problem je nešto ozbiljniji od baga Y2K, jer se UNIX češće koristi u „ugrađenim“ (embedded) sistemima nego na personalnim računarima, čime su oni direktnije vezani za svoj hardver, a to znači da je i njihova izmena teža, skuplja i rizičnija. Biće ugrožena robotska postrojenja, mrežni ruteri, sigurnosni sistemi i slično. Da li će se time problem milenijumskih bagova završiti? Pa na neki način da... Barem do 1. januara 10000. godine. A onda ćemo videti kako ćemo dalje.
|