Kas ir programmatūras kļūda? Definīcija, cēloņi un risinājumi
Uzzini, kas ir programmatūras kļūda — cēloņi, piemēri un efektīvi risinājumi, lai novērstu iesaldēšanu, kļūmes un mazinātu drošības riskus.
Programmatūras kļūda ir datorprogrammas koda problēma, kuras dēļ tā nedarbojas pareizi. Tās var radīt neērtības lietotājam, un dators var sabojāties vai iesaldēties. Lielākajā daļā datorprogrammu ir kļūdas. Programmu, kurā ir liels skaits kļūdu (vai, iespējams, viena vai dažas nopietnas kļūdas), sauc par kļūdainu.
Lielāko daļu kļūdu izraisa izstrādātāja slikta programmēšana, taču dažkārt tās var radīt arī kompilatora problēmas. Kad tiek atklātas kļūdas, cilvēki nosūta kļūdas ziņojumus izstrādātājam, lai informētu viņu par kļūdu un ļautu to novērst. Kļūdu dzīves cikls parasti ietver atklāšanu, ziņošanu, novērtēšanu (triāžu), labošanu, testēšanu un izplatīšanu kā atjauninājumu vai izlabotu versiju.
Dažreiz cilvēki saka, ka datorā ir kļūda, ja ar to kaut kas nav kārtībā. Problēmu parasti izraisa datorvīruss, kas ir inficējis viņu datoru un liek tam darboties lēni vai darīt dažādas lietas. Tomēr jāpiezīmē, ka ļaunprogrammatūra (vīrusi, trojāņi u. c.) nav tas pats, kas programmēšanas kļūda — ļaunprogrammatūra ir nodoma rezultāts, kamēr kļūdas parasti rodas nejauši vai no nepilnībām izstrādes procesā.
Kļūdu veidi
- Loģikas kļūdas — programma dara nepareizas darbības, jo kodā ir nepareiza loģika (piem., nepareizas nosacījumu pārbaudes).
- Sintakses kļūdas — nepareizs koda formāts, ko bieži atrisina kompilators vai šķirotājs (interpreter).
- Izpildes (runtime) kļūdas — kļūdas, kas parādās programmas darbības laikā (piem., dalījums ar nulli, nulles rādītāja piekļuve).
- Resursu pārvaldības kļūdas — atmiņas noplūdes, bloķēšanās (deadlock), resursu nepietiekamība.
- Sinhronizācijas / konkurences kļūdas — sacensības apstākļi (race conditions) daudz pavedienu vidē.
- Drošības ievainojamības — piemēram, bufera pārplūdes, kas var ļaut uzbrucējiem izpildīt ļaunprātīgu kodu.
- Interfeisa kļūdas — lietotāja saskarnes (UI) neparedzēta izturēšanās vai nepareiza datu attēlošana.
Cēloņi
- Neuzmanība vai cilvēka kļūda kodēšanas laikā.
- Nepietiekami izstrādes procesi: trūkst testēšanas, koda pārskatu vai prasību specifikācijas.
- Sarežģīta vai nekorekta prasību definīcija — izstrādātāji īsteno nepareizas prasības.
- Trešo pušu komponentu vai bibliotēku kļūdas (atkarības problēmas).
- Platformas/kompilatora kļūdas vai atšķirības starp operētājsistēmām un aparatūru.
- Laika spiediens un nogurums, kas noved pie steigas risinājumiem.
Kā atklāt un ziņot par kļūdām
- Reprodukcijas soļi: skaidri aprakstiet, kā atkārtot problēmu — soļi, sagaidāmais rezultāts un novērotais rezultāts.
- Pievienojiet lietotāja vidi: OS versiju, programmas versiju, izmantotās bibliotēkas, aparatūru.
- Izmantojiet žurnālfailus (logs), kļūdu izdrukas (stack traces) un ekrānuzņēmumus.
- Ziņošanas rīki: daudzas programmas piedāvā iebūvētas kļūdu ziņošanas iespējas vai izmanto ārējus rīkus (issue trackers).
Kā kļūdas tiek labotas
Kļūdas labošana parasti ietver problēmas reproducēšanu, cēloņa analīzi, izmaiņu veikšanu kodā, vienību testu un integrācijas testu pievienošanu, pēc tam izlabotā izlaiduma publicēšanu. Bieži vien tiek izlaisti patch vai drošības atjauninājumi (security patches), īpaši, ja kļūda ir nopietna vai apdraud lietotāju datus.
Novēršana un labas prakses
- Izmantojiet vienību testus (unit tests), integrācijas testus un automatizētās testēšanas rīkus.
- Veiciet koda pārskatīšanas (code reviews) un pair programming, lai samazinātu cilvēka kļūdas.
- Ieviesiet nepārtrauktas integrācijas (CI) procesus, kas automātiski pārbauda jaunas izmaiņas.
- Izmantojiet statisko koda analīzi un rīkus, kas atklāj potenciālas kļūdas pirms izpildes.
- Documentējiet prasības un veiciet pēc iespējas vairāk testa scenāriju, arī robežstāvokļiem (edge cases).
Sev jāpatur prātā — kļūdu nopietnība un sekas
- Kļūdas var būt tikai kosmētiskas (neietekmē funkcionalitāti) vai kritiskas (apdraud drošību, dzīvību vai datus).
- Reālās dzīves piemēri rāda, ka dažas kļūdas var radīt smagas sekas: finanšu zaudējumus, drošības pārkāpumus vai pat cilvēku bojāeju medicīnas un aviācijas nozarēs.
- Ātra un pārdomāta kļūdu novēršana un lietotāju informēšana par atjauninājumiem ir būtiska risku mazināšanai.
Praktiski padomi lietotājiem
- Pārliecinieties, ka izmantojat programmu jaunāko versiju — atjauninājumi bieži satur kļūdu labojumus.
- Regulāri dublējiet svarīgus datus, lai kļūdu vai programmatūras bojājumu gadījumā varētu atjaunot darbību.
- Ja sastopaties ar kļūdu, mēģiniet saglabāt izsmeļošu ziņojumu par reproducēšanu un nosūtiet to izstrādātājam.
- Pārliecinieties par pretvīrusu programmatūras esamību, lai atšķirtu ļaunprogrammatūru radītās problēmas no programmēšanas kļūdām.
Dažas kļūdas ir nekaitīgas, piemēram, daudzas videospēles nepareizi ļauj objektiem pārvietoties caur sienām. Citas kļūdas ir nopietnākas, piemēram, kļūda navigācijas sistēmā, kas izraisa lidmašīnas sprādzienu. Tāpēc ir svarīgi gan izstrādātājiem, gan lietotājiem saprast kļūdu cēloņus, rīkoties atbildīgi un ievērot drošības un kvalitātes praksi.
Kļūdu veidi
Bufera pārplūšana
Bufera pārplūšana notiek, kad programma raksta vai lasa no atmiņas apgabala, kuram tai nav atļauts piekļūt.
Aritmētiskā pārpilde
Aritmētiskā pārplūšana notiek tad, kad mainīgajā esošais skaitlis tiek palielināts virs lielākā skaitļa, ko pieļauj šis mainīgais. Tas parasti izraisa skaitļa atiestatīšanu atpakaļ uz nulli.
Bezgalīga cilpa
Bezgalīga cilpa rodas tad, ja programma iekļūst cilpā (instrukciju sērija, kas tiek atkārtota daudzas reizes) un no tās nav iespējams izkļūt. Tas var izraisīt programmas apstāšanos.
Noapaļošanas kļūdas
Ja mainīgajam ar peldošo komata punktu nav pietiekamas precizitātes, tajā saglabātā skaitļa vērtība var būt neprecīza. Tas var radīt dažādas problēmas atkarībā no programmas veida, piemēram, navigācijas programma var navigēt uz neparedzētu vietu, bet audioieraksta programmā var radīt izkropļotu skaņu.
Dalīšana ar nulli
Dalīšana ar nulli ir nederīga matemātiska darbība. Ja programma dalīs veselu skaitli ar nulli, tā sabojāsies. Operētājsistēmā Linux šīs kļūdas gadījumā tiek parādīts ziņojums "floating point exception" (izņēmums ar peldošo komata skaitli), lai gan nav iesaistīti skaitļi ar peldošo komata skaitli. Dažreiz peldošā komata matemātika pieļauj dalīšanu ar nulli. Tas parasti rada īpašu vērtību "nav skaitlis".
Apgriešanas problēmas
Videospēlēs apcirpšanas problēmas, ko dēvē arī par sadursmju noteikšanas problēmām, rodas tad, kad objekts šķērso barjeru (piemēram, sienu, grīdu vai griestus), kuru tas nav paredzēts šķērsot. Šī ir ļoti bieži sastopama kļūda daudzās videospēlēs. Tā var notikt, piemēram, spēlē Doom 2, kad sadragātu briesmoni atdzīvina arhetipiskais ienaidnieks. Nokļūšanas problēmas bieži var izmantot kā laika taupīšanas taktiku ātruma skrējienos, piemēram, Super Mario 64 spēlē ir iespējams izlaist kāpšanu pa pils spirālveida kāpnēm, izlecot cauri griestiem.
Drošības kļūdas
Drošības kļūdas ir kļūdas, kas ļauj uzbrucējam iegūt piekļuvi datoram vai izraisīt datora darbības traucējumus. Datora darbības traucējumu izraisīšanu sauc par pakalpojuma atteikuma uzbrukumu. Drošības kļūdas tiek uzskatītas par īpaši svarīgām, jo tās var ļaut iebrucējiem nozagt svarīgu informāciju, piemēram, kredītkaršu numurus vai paroles. Drošības kļūdu piemēri ir Heartbleed un Shellshock.
Misbugs
Kļūda ir kļūda, kas ir izmantota kā funkcija. Piemēram, kļūda Android tālrunī, kas ļauj lietotājiem iegūt root piekļuvi.
Aparatūras kļūdas
Dažas kļūdas ietekmē nevis programmatūru, bet gan aparatūru (datora fiziskās daļas). Piemēram, izpildot instrukciju bloķēt cmpxchg8b eax uz vecajiem Pentium procesoriem, procesors pārtrauktu darboties, līdz tiek restartēts. Tā kā aparatūras kļūdas ir fiziskas konstrukcijas nepilnības, tās nevar labot ar programmatūras atjauninājumu, lai gan ar programmatūras atjauninājumu kļūdu var apiet (paslēpt).
Jautājumi un atbildes
J: Kas ir programmatūras kļūda?
A: Programmatūras kļūda ir datorprogrammas koda problēma, kuras dēļ tā nedarbojas pareizi.
J: Kādas ir programmatūras kļūdas sekas?
A: Programmatūras kļūda var radīt neērtības lietotājam, un dators var sabojāties vai iesaldēties.
Vai visās datorprogrammās ir kļūdas?
A: Jā, vairumā datorprogrammu ir kļūdas.
J: Kas ir kļūdaina programma?
A.: Kļūdaina programma ir tāda, kurā ir liels skaits kļūdu vai, iespējams, viena vai dažas nopietnas kļūdas.
J: Kas ir atbildīgs par lielāko daļu kļūdu datorprogrammās?
A: Lielāko daļu kļūdu izraisa izstrādātāja slikta programmēšana, bet dažkārt tās var izraisīt kompilatora problēmas.
J: Ko cilvēki dara, kad atrod kļūdu datorprogrammā?
A: Kad tiek atrastas kļūdas, cilvēki nosūta kļūdas ziņojumus izstrādātājam, lai informētu par kļūdu un ļautu to novērst.
J: Ko cilvēki domā, kad saka, ka viņu datorā ir kļūda?
A: Kad cilvēki saka, ka viņu datorā ir kļūda, viņi parasti ar to saprot, ka datorā kaut kas nav kārtībā, ko parasti izraisa datorvīruss, kas ir inficējis viņu datoru un liek tam darboties lēni vai darīt dažādas lietas.
Meklēt