Softwarová chyba

Softwarová chyba je chyba nebo nedostatek v počítačovém programu nebo softwarové části počítačového systému, která způsobuje, že program nebo systém produkuje nesprávné nebo neočekávané výsledky nebo se chová nežádoucím způsobem.

Softwarové chyby zahrnují velmi široký rozsah chování, jako je vyprodukování chybného výstupu, chování v rozporu s uživatelskými požadavky nebo standardy, havárie programu, zacyklení programu, poškození, přepsání, smazání dat, souborů, programů nebo částí operačního systému, narušení bezpečnosti programu nebo systému, vyčerpání prostředků systému, ignorování událostí, selhání komunikace, nevyhovující rychlost nebo ovládání programu, nedostatečná nebo matoucí komunikace programu s uživatelem, neadekvátní signalizace chyb nebo stavu programu, nemožnost spustit program. Chování, které je u určitého druhu programů nebo v určitém prostředí žádoucí, může být u jiného programu nebo v jiném prostředí považováno za závažnou chybu.

Mnoho softwarových chyb je způsobeno programátorskými chybami, softwarové chyby však mohou být způsobeny i nevhodným použitím programu nebo jeho nasazením v prostředí, se kterým jeho původní návrh nepočítal.

Programátorská chyba 

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.

Programátorskou chybu často i v češtině označujeme anglickým výrazem bug a proces jejího hledání a odstraňování (ladění softwaru) výrazem debugování/debugging.

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

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.

Typy programátorských chyb 
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 
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é lze 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í 
Při použití nebezpečných funkcí vzniká chyba tím, že si programátor 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

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.

Význam pojmu Bug 

Anglické slovo 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í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í 
Najít a opravit chybu, neboli "debugování", byla vždy důležitá část programování. Se zvyšující se složitostí programů 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í, zpravidla 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.

Odkazy

Reference

Související články 
 Bug tracking system
 Debugger
 Extrémní programování
 Identifikace hrozeb
 Objektově orientované programování
 Paralelní programování

Externí odkazy 
 
 Seznam 25 nejnebezpečnějších programátorských chyb podle SANS a MITRE (anglicky)

 
Softwarové anomálie
Chyby
Testování softwaru
Počítačová bezpečnost