Bugy - Menu Úvod Co je Bug Zdroje chyb Typy bugů
Bugy
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
Chyba může být:
Syntaktická
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á
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
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.
Základní typy
Existují dva základní typy programátorských chyb:
opomenutí kontroly,
logická chyba, překlep
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.
napří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í
Programátor si něco nastudoval, ale nedodržel doporučení.
napří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
Staticky podchytitelné chyby
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
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
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
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“. 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
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í.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.
Možné chyby
Chyby v programech jsou důsledkem lidského faktoru. Vznikají přehlédnutím, nebo
vzájemným nepochopení 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í
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.