Programátoři v rukou překladačů. Co může za chyby počítačů

Věda a technika
22. 10. 2013 16:31
Převody přes čísla mají svá úskalí (ilustrační foto).
Převody přes čísla mají svá úskalí (ilustrační foto).

Počítačové programy píšou lidé, ale kontrolují je po nich počítače. Když člověk napíše nesmysl, smažou ho. Jenže co když to nesmysl nebyl?

Počítač je hromada tištěných obvodů a dalších součástek, určená k vykonávání složitých soustav instrukcí. Říká se jim programy. Aby počítače programům rozuměly, potřebují je dostat ve formě strojového kódu, posloupnosti nul a jedniček. Jen tak jsou pro ně čitelné. Jenže nulám a jedničkám moc nerozumí lidé. Proto se programy píšou v programovacích jazycích, které připomínají ty lidské. Jsou jen přesnější, mají omezenější možnosti a jejich používání je namáhavější. Dají se převést na nuly a jedničky, jímž rozumí počítač.

Velká část programovacích jazyků k tomuto účelu používá specializovaný software. Říká se mu překladač nebo taky kompilátor. Většina kompilátorů příkazy napsané programátory nejen převádí do strojového kódu, ale i upravuje tak, aby je počítač mohl vykonávat co nejrychleji. Když narazí na něco, co jim nedává smysl, umažou to. Podle čtveřice vědců z MIT vedené Xi Wangem, ale občas smažou i něco, co smysl mělo, a ohrozí tak stabilitu výsledného programu, případně ho učiní zranitelnějším vůči útokům.

2 + (-3) > 2?

Překladače mažou kód, který vede k tzv. nedefinovanému chování programu a není z něj jasné, co má počítač udělat. Mazání nepoužitelného kódu je většinou dobrá věc. Problém je s kódem, který smysl má, ale překladač to nepozná. Příklad takového postupu je test velikosti čísla. Ačkoliv si v principu můžete vymyslet jakékoliv celé číslo, paměť počítačů je omezená. Vejdou se do ní jen čísla do určité velikosti. Když je vaše číslo větší, než největší povolená hodnota, dopadnete špatně.

Kdybyste třeba chtěli uložit do paměti číslo 32 768, ale maximum by bylo 32 767, mohl by si počítač zapamatovat úplně jiné, možná i záporné číslo. Řešení je přidat do programu test, který ověří, jestli se váš součet do limitu vešel.

Napíšete něco jako "Když je a + b < limit, můžeš pokračovat" (Na chvíli teď zapomeňme, že se dá přičítat i 0). Postup funguje, ale musíte kvůli němu do vašeho programu zabudovat jedno číslo navíc, onen limit.  Není to ovšem nutné. Můžete napsat jen "Když je a + b > a, můžeš pokračovat." Tím se ověří, jestli výsledek součtu nepřetekl maximální hodnotu a sčítání vyšlo správně.

Podle Wanga a spol. dávají programátoři takovému postupu přednost. Většinou ovšem sčítají kladná čísla. Kdyby b bylo záporné, výpočet by se zkomplikoval. Když sečtete 2 a -3, není správný výsledek větší než 2. Překladače takový nejednoznačný test raději odstraní. Pokud bylo sčítání součástí nějaké bezpečností pojistky, kompilátor ji vyřadí. Překladačů je navíc hodně, přičemž každý s nedefinovaným chováním zachází jinak.

Smetí všude kolem

Wang a jeho spolupracovníci prošli předpisy jednoho z nejpoužívanějších programovacích jazyků současnosti, jazyka C. Identifikovali kousky smysluplného kódu, který by překladače mohly chtít smazat. Pak napsali vlastní program, který takové kousky hledá a varuje autora kódu, že by mohly způsobit problém. Prozkoumali i už napsaný a používaný software, jestli neobsahuje chyby, způsobené umazáním instrukcí, které dávaly smysl autorovi, ale ne překladači. Našli jich hodně, i v programech, které by měly fungovat bezchybně.

Objevili nedostatky třeba v jádru operačního systému Linux. Jádro je program, který se spustí krátce po zapnutí počítače a řídí ho, dokud ho nevypnete. Má na starosti věci jako je přidělování paměti a času programům, nebo komunikaci mezi programy a zařízeními, která jsou k počítači připojená. Chyby našli vědci i v základech nejpoužívanějšího webového prohlížeče Chrome.

Úpravy programů překladači jsou potřeba. Moderní programy mají milióny řádek kódu. Píšou je mnohočlenné týmy programátorů. Velmi často používají bloky příkazů, které před nimi napsal kdysi dávno někdo jiný, aniž by je sami někdy četli. Kousek kódu, který napíše jeden autor, může způsobit, že přestane fungovat nějaký jiný kousek od jiného o tisíce řádek dál. I komerční programy jsou tak přeplněné instrukcemi, které nebudou nikdy vykonány. Zkontrolovat je zvládnou jen stroje. Jenže stroje zatím ještě nechápou, co dělají.

Autor: Radek JohnFoto: archiv

Naše nejnovější vydání

TÝDENInstinktSedmičkaINTERVIEWTV BARRANDOVPŘEDPLATNÉ