Programátorská chyba

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Programátorská chyba je druh softwarové chyby, kterou udělal programátor při vytváření počítačového programu. Programátorskou chybu, která v software způsobí bezpečnostní problém, označujeme jako zranitelnost. Program využívající zranitelnost je exploit.

Zdroje chyb[editovat | editovat zdroj]

Chyba může být syntaktická, sémantická a vznik neočekávané události.

Syntaktická[editovat | editovat zdroj]

Taková chyba spočívá v narušení syntaxe gramatiky použitého programovacího jazyka. U kompilovaných programů ji překladač zahlásí přímo při překladu během syntaktické analýzy.

Sémantická[editovat | editovat zdroj]

Program se bez problému přeloží, ale nedělá co má. Například skončí v nekonečném cyklu, spadne (je násilně ukončen operačním systémem pro porušení přidělených práv) nebo vydá naprosto špatný výsledek (což je většinou ta nejhorší možná varianta). Ve složitějším programu (například operačním systému) se může stát, že program pozná, že se dostal do chybné situace, ale není schopen pokračovat ve funkci a proto se zastaví nebo ukončí, obvykle se specifickým chybovým hlášením.

Neočekávaná událost[editovat | editovat zdroj]

Při běhu programu nastane situace, se kterou programátor nepočítal a na kterou neumí program správně zareagovat. Může to být situace vnitřní (například se pokouší psát do souboru na disku, ale disk je plný) nebo neočekávaná hodnota vstupu.

Velmi často způsobí chybu obyčejný překlep, například ve jméně proměnné, použití 1 místo 0 nebo < místo <=. Takové chyby se zvlášť špatně hledají.

Dalším zdrojem chyb je chybné nebo nedostatečné použití synchronizačních primitiv při přístupu ke sdíleným zdrojům. Taková chyba může v programu vydržet velmi dlouho a projevit se teprve při specifickém pořadí naplánování vláken na procesoru nebo procesorech. Podmnožinou těchto chyb je deadlock.

Typy programátorských chyb[editovat | editovat zdroj]

Existují dva základní typy programátorských chyb: opomenutí kontroly, logická chyba, překlep a použití nebezpečných funkcí.

Opomenutí kontroly, logická chyba, překlep[editovat | editovat zdroj]

Tento typ chyby může být velmi nebezpečný ve chvíli, kdy náš program začne zpracovávat nedůvěryhodné vstupy. Pokud jsou vstupy důvěryhodné, data si připravujeme my sami. Jedná se o menší problém, než kdybychom dostávali vstupy z vnějšku a kdokoliv nám mohl cokoliv podvrhnout. V současné době vzniká v tomto ohledu veliký problém, protože většina programů přijímá výhradně nedůvěryhodné vstupy, jejich zdroji je hlavně internet a programy zpracovávají vše, co obdrží. Což může vést k tomu, že například v protokolu SMB se nic neděje do té doby pokud mezi sebou komunikují dva počítače navzájem. Naopak se můžeme do počítače prolomit v okamžiku, kdy můžeme počítači něco podvrhnout.

Příklad: Data přicházející z počítačové sítě nebo z Internetu, webový prohlížeč nebo e-mailový klient.

Nejvíce se ovšem vyskytují u složitých implementací jako je vzdálené volání procedur RPC. Když napíšu proceduru, která čte data z disku a následně ji přizpůsobím tak, aby byla schopná přijímat požadavky ze sítě, dostávám nově vytvořený síťový souborový systém, který je jednoduchý a primitivní. Poté zle využít sdílení v síti SMB nebo NFS.

Síťové servery Apache a PHP jsou bezpečné z hlediska toho co jsou, jenomže když do nich píší své kódy nevzdělaní programátoři, dostáváme se do situace, kdy už vše není tak bezpečné.

Použití nebezpečných funkcí[editovat | editovat zdroj]

Při použití nebezpečných funkcí vzniká chyba tím, že programátor si něco nastudoval, ale nedodržel doporučení.

Příklad: Funkce strcpy() z jazyka C. Jedná se o systematickou chybu, protože to co dostane v parametru kopíruje někam do paměti a neexistuje žádné omezení na délku. Bezpečnostní problém je tedy v tom, že může dojít k přemazání námi neznámého obsahu paměti.

Počet chyb v programu[editovat | editovat zdroj]

Staticky podchytitelné chyby[editovat | editovat zdroj]

V analýzách, které jsou veřejně k dispozici se píše o možných 20 až 30 chybách na 1000 řádcích zdrojového kódu, což je velké číslo. V jádře Linuxu je 0,5 chyby na 1000 řádků zdrojového kódu. Už od konce 90. let se na spoustě univerzitách vyučující v předmětech zabývající se touto problematikou zabývali na cvičeních hledáním systémových chyb v jádře. Existuje i automatický nástroj, který tyto chyby v kódu hledá. Naopak třeba ve Windows není tato statistika nijak známa, protože Microsoft nikdy nedal své zdrojové kódy k dispozici.

Horší stav v běžných aplikacích[editovat | editovat zdroj]

Prohlížeče nebo editory. Čím je software méně používán, tím je v něm více chyb.

Pád aplikace je hrozba[editovat | editovat zdroj]

Každý neočekávaný pád aplikace je hrozba a může být potenciálně zneužitelná. Jakmile se aplikace dostane do stavu kdy tzv. "spadne" dostává se do stavu potenciálního zneužití, protože se jedná o stav, který by neměl nastat a tento pád se dá většinou konkrétním způsobem zneužít. V případě kdy nemáme k dispozici zdrojové kódy, tak je testovaní pádů aplikace nejjednodušší způsob jak přijít na chybu.

Bug[editovat | editovat zdroj]

Programátorská chyba se často i v češtině označuje anglickým výrazem bug a proces jejího odstraňování ladění (debugování).

Bug znamená doslova moucha, štěnice nebo obecně brouk. V angličtině se ve významu chyba (například konstruktérská) používá už velmi dlouho – použil ho například Thomas Edison roku 1878, když mluvil o svých vynálezech. S počítači pak pronikl do mnoha dalších jazyků.

Traduje se, že původem tohoto významu je problém způsobený skutečným hmyzem. Známá je třeba historka o molu zachyceném na relé počítače Mark II dne 9. září 1947. Mol byl pečlivě vyproštěn a nalepen do záznamu s poznámkou „první skutečný případ nalezeného bugu“.[1] Je ovšem zřejmé nejen to, že se nejedná o první výskyt termínu, ale také to, že operátoři o konstruktérském použití věděli.

Efekty softwarových chyb[editovat | editovat zdroj]

Těchto chyb je několik druhů a mohou mít na následek dominový efekt s různými následky pro uživatele. Některé chyby mají na funkčnost minimální vliv a jsou proto neobjeveny. Vážnější chyby mohou vést k zamrznutí programu a následné ztratě dat. Ty nejvážnější chyby lze využít k neoprávněnému přístupu k datům. V roce 1996 v Evropské kosmické agentuře byla zničena nosná raketa Ariane 5, která nesla družice Cluster za 500 milionů amerických dolarů, minutu po startu, kvůli chybě v programu řídícího počítače velení.[2] Ze studie, zadané v Americe, vyšel závěr, že softwarové chyby připravily americkou ekonomiku o cca 59 miliard USD, nebo o 0,6 % HDP.[3]

Možné chyby[editovat | editovat zdroj]

Chyby v programech jsou důsledkem lidského faktoru. Vznikají přehlédnutím, nebo vzájemným nepochopením ve vývojovém týmu během specifikace kódování a dokumentace.

Například: Při vytváření relativně jednoduchého programu na řazení slov podle abecedy, co stane, když se ve slově nachází '-', mohlo by se stát, že při kódování do programovacího jazyka by mohla být vytvořena off-by-one chyba. Jiný příklad, při kódování výpisu do seznamu by mohlo dojít k záměně '<' a '>' a následně by došlo k vypsání v opačném abecedním pořadí.

Složitější chyby mohou vzniknout v případě, že na jednom programu pracuje více lidí a v horším případě tomu tak je ještě během delšího období, to pak mohou mezi částmi programů vznikat nežádoucí interakce, které je složité nalézt, za účelem předejít této situaci vznikají podrobné dokumentace jednotlivých částí i celků.

Další kategorie chyb se vztahuje k vláknům, když je proces zpracovávaný ve více než jednom vlákně, a ta nejsou správně synchronizována.

Ladění[editovat | editovat zdroj]

Najít a opravit chybu, neboli "debugování", byla vždy hlavní část programování. Se zvyšující se složitostí programu stoupá počet chyb a také obtížnost je zachytit a opravit. Často se stává, že programátoři stráví více času hledáním a opravováním chyb, než psaním nového kódu. Softwaroví testeři jsou profesionálové, jejichž jediným úkolem je najít a opravit chyby, nebo napsat kód pro testování. U některých projektů je více prostředků vynaloženo na testování, než na vývoj.

Obvykle nejtěžší část ladění je najít chybu v kódu. Jakmile je odhalena, její oprava nebývá obvykle problém. Jednou z pomůcek při debugování je tzv. krokování programu, při tomto procesu je program procházen po jednotlivých příkazech při neustálém sledování proměnných. Bez této možnosti se používá jiný postup, v různých částech programu jsou proměnné vypisovány např. do konzole, což napomáhá k lokalizaci chyb.

Nicméně i těmito pomůckami je někdy lokalizace chyb umění, z pravidla se stává, že chyby v jedné části programu způsobí pád v úplně jiné části.

Některé chyby jsou způsobeny špatným myšlením, nebo plánováním ze strany programátora. Takovéto chyby vyžadují přepsání části kódu.

Od roku 1990 a zejména v návaznosti na incident s Ariane 5 je kladeno značné úsilí na vývoj pomůcek pro automatické ladění kódů, např. metody statické analýzy kódu.

Posledním typem chyb jsou chyby, které nemají s kódem nic společného. Pokud se programátor spoléhá na dokumentaci k hardwaru a ta není přesná, může byt program napsaný dobře s ohledem na dokumentaci ale už ne s ohledem na skutečný hardware.

Reference[editovat | editovat zdroj]

  1. http://infosys.iptime.org/tt1/attach/1/1331426155.jpg
  2. KEN, Robinson. Ariane 5 Flight 501 Failure—A Case Study of Errors [online]. 1996-12-16, rev. 2012-03-18, [cit. 2012-11-11]. Dostupné online. (anglicky) 
  3. Software bugs cost US economy dear

Související články[editovat | editovat zdroj]

Externí odkazy[editovat | editovat zdroj]