Tarkvaraviga: definitsioon, põhjused, tüübid ja lahendused
Tarkvaraviga: selgitus, levinumad põhjused, tüübid ja praktilised lahendused — õppige vigade tuvastamist, parandamist ja ennetamist samm-sammult.
Tarkvaraviga on probleem arvutiprogrammi koodis või käitumises, mis paneb selle halvasti tööle või käituma ootamatult. Vigadest võivad tekkida väiksemad ebamugavused (näiteks kasutajaliidese vead) või tõsised tagajärjed (näiteks süsteemi kokkujooksmine). Enamikul tarkvaraprojektidel esineb vigu; programmi, millel on palju vigu või mõni äärmuslikult tõsine viga, nimetatakse vigaseks.
Mis võib põhjustada vigu?
Vigade põhjused on mitmekesised. Kõige levinumad on:
- Arendaja eksimused või ebatäpsused programmeerimisel — loogikavead, valed eeldused, valesti käsitletud servjuhtumid.
- Vale või puudulik nõuete mõistmine ja dokumentatsioon — tarkvara ei vasta ootustele või ei kata kõiki juhtumeid.
- Integratsiooni- ja ühilduvusprobleemid — komponendid ei tööta koos oodatult erinevates keskkondades või versioonides.
- Kompilaatori või tööriistade tõrked — kompilaatori bug'id või ehituskeskkonna probleemid võivad tekitada ootamatut käitumist.
- Tõrked riistvaras, draiverites või operatsioonisüsteemis — mõnikord käitub tarkvara valesti riistvara tõttu.
- Kõrge koormuse, mälu- või jõudlusprobleemide tagajärjel ilmnevad vead (näiteks mälulekit, konkurentsitingimused).
- Välised ohud nagu viirused ja pahavara — kasutajad kirjeldavad mõnikord probleemi kui “viga”, kuigi selle põhjuseks on näiteks arvutiviirus.
Vigade tüübid
- Funktsionaalsed vead: programm ei tee seda, mida peaks (vale tulemus või puuduv funktsioon).
- Jõudlus- ja ressursivead: aeglus, kõrge CPU-/mälu kasutus, krahhid koormuse all.
- Kasutajaliidese vead: paigutuse, teksti või navigeerimise probleemid, mis segavad kasutamist.
- Turvavead: nõrkused, mis võimaldavad volitamata juurdepääsu või andmelekkeid.
- Ühilduvus- ja konfiguratsioonivead: programm ei tööta teatud opsüsteemide, seadmete või seadistustega.
- Konkurentsi- ja sünkroonimisvead: mitme lõime/ülesande korral ilmnevad juhuslikud rikked (race conditions, deadlock).
- Mäluhalduse vead: mälu lekked, viited vabastatud mälule, puhver-ületused.
Kuidas vigu avastatakse?
Vigu leitakse mitmel viisil:
- Testimine: üksustestimine (unit testing), integratsioonitestid, süsteemi- ja aktsepteerimistestid.
- Automaatne analüüs: staatiline koodianalüüs, süntaksi- ja stiilijärelevalve, dünaamilised tööriistad.
- Pidev integreerimine ja CI/CD töövood, mis avastavad regressioonid varases staadiumis.
- Fuzzing ja turvatestid, mis otsivad ootamatuid sisendeid ja haavatavusi.
- Logid, monitooring ja telemeetria tootmiskeskkonnas — aitavad tuvastada ja korrastada reproduktsiooniks vajalikke andmeid.
- Kasutajate tagasiside ja vigade aruanded — sageli avastatakse reaalse kasutuse käigus esinevad spetsiifilised juhtumid.
Kuidas vigu parandada (lahendused)
- Reprodeerimine: kõigepealt tuleb viga usaldusväärselt korrata, et mõista tingimusi ja ulatust.
- Diagnoosimine: uurida logisid, stack trace’e, keskkonnaerinevusi ja hõivata vajalik telemeetria.
- Parandus ja testimine: kirjutada korrektne koodiparandus ning käivitada automaatsed ja käsitsi testid, et kontrollida regressioone.
- Code review ja peer review: enne tootmisse viimist lasta teistel arendajatel muudatus üle vaadata.
- Versioonihaldus ja väljalase: rakendada parandus kontrollitult (hotfix vs järgmine versioon) ning dokumenteerida muudatused.
- Järeltõendamine tootmises: jälgida, kas parandus lahendas probleemi ilma uute kõrvalmõjudeta.
Kuidas vigu ennetada
Heade tavade järgimine vähendab vigade tekkimise riski:
- Selged ja täpsed nõuded ning regulaarne koostöö tootja ja tellija vahel.
- Modulaarne disain ja lihtsustamine — lihtsam kood on vähem vigadeallikas.
- Automatiseeritud testimine (üksus-, integratsiooni- ja lõppkasutaja testid) ning pidev integreerimine.
- Staatiline analüüs, turvakontrollid ja koodistandardid.
- Koodide ülevaatused ja paar-programmeerimine (pair programming).
- Mitmekesine testkeskkond (erinevad seadmed, opsüsteemid, brauserid) ja testandmete hoolikas haldus.
- Jõudluse ja stress-testide regulaarne läbiviimine ning proaktiivne monitooring tootmises.
Kuidas kirjutada head veateadet arendajale
Kui leiad vea ja tahad sellest teatada, too välja:
- Selged sammud vea reprodutseerimiseks (täpsed klõpsud, sisendid, kasutatud seaded).
- Mida ootasid versus mis tegelikult juhtus (expected vs actual).
- Keskkonna info: tarkvara ja andmebaasi versioonid, opsüsteemi versioon, brauser, riistvara, kui vajalik.
- Logid, ekraaniikuvad, veateated või stack trace’id — need kiirendavad diagnostikat.
- Kui võimalik, väike näide koodist või andmetest, mis viga esile kutsub.
- Prioriteet või mõju (kas see blokeerib töö või on pigem kosmeetiline).
Mõju ja riskid
Mõju ulatus varieerub: mõned vead on ainult visuaalsed ja tekitavad ebamugavusi, teised võivad põhjustada andmekadu, turvariske või isegi füüsilisi ohte (näiteks navigatsioonisüsteemi tõrge lennunduses). Kui viga mõjutab turvalisust või andmete terviklikkust, tuleb sellele anda kõrge prioriteet.
Lõpetuseks
Mõned vead on suhteliselt kahjutud — näiteks videomängudes võivad objektid mõnikord seintest läbi libiseda — samas on teised äärmiselt tõsised, nagu viga navigatsioonisüsteemis, mis võib põhjustada katastroofilisi tagajärgi. Tõepoolest segavad kasutajad vahel vigasid ja viiruseid: kui arvutis on “midagi valesti”, võib põhjuseks olla arvutiviirus, mitte tarkvaraviga. Õige lähenemine on vigu korrektselt raporteerida, prioriseerida ja parendada tarkvaraarenduse protsesse, et vähendada tulevikus tekkivaid probleeme.
Vigade tüübid
Puhvri ülevool
Puhvri ülevool juhtub siis, kui programm kirjutab või loeb mälupiirkonda, millele ta ei tohiks ligi pääseda.
Aritmeetiline ülevool
Aritmeetiline ülevool juhtub siis, kui muutujas sisalduv arv suureneb üle suurima arvu, mida muutuja lubab. See põhjustab tavaliselt selle arvu nullini nullimist.
Lõputu tsükkel
Lõputu tsükkel tekib siis, kui programm siseneb tsüklisse (mitu korda korduv käskude seeria) ja sellest tsüklist ei ole väljapääsu. See võib põhjustada programmi seiskumise.
Ümberringlusvead
Kui ujukoma muutuja ei ole piisavalt täpne, võib sellesse salvestatud arv olla ebatäpne. See võib sõltuvalt programmi tüübist põhjustada mitmesuguseid probleeme, näiteks võib see põhjustada navigatsiooniprogrammi navigeerimist soovimatusse kohta või moonutatud heli helisalvestusprogrammis.
Jagamine nulliga
Jagamine nulliga on kehtetu matemaatiline operatsioon. Kui programm jagab täisarvu nulliga, kukub see kokku. Linuxis kuvatakse selle vea ilmnemisel teade "floating point exception", kuigi tegemist ei ole ujukomaarvudega. Ujukomaarvutus võimaldab mõnikord jagamist nulliga. Selle tulemuseks on tavaliselt eriline "ei ole arv" väärtus.
Lõikeprobleemid
Videomängudes tekivad kärpimisprobleemid, mida nimetatakse ka kokkupõrke tuvastamise probleemideks, kui objekt läbib takistust (näiteks seina, põrandat või lage), millest see ei olnud ette nähtud läbida. See on väga levinud viga, mida leidub paljudes videomängudes. See võib juhtuda näiteks Doom 2-s, kui purustatud koletis äratatakse üles arhivaali poolt. Clipping-probleeme võib sageli kasutada aja kokkuhoiu taktikana speedruns'is, näiteks Super Mario 64-s on võimalik vahele jätta lossi keerdtrepist üles kõndimine, hüpates läbi lae.
Turvahäired
Turvahäired on vead, mis võimaldavad sissetungijal kas pääseda arvutisse või põhjustada arvuti kokkuvarisemise. Arvuti kokkuvarisemise põhjustamist nimetatakse teenusetõkestusrünnakuks. Turvahäireid peetakse eriti oluliseks parandada, sest need võivad võimaldada sissetungijatel varastada olulist teavet, näiteks krediitkaardi numbreid või paroole. Turvahäirete näideteks on Heartbleed ja Shellshock.
Misbugs
Viga on viga, mida on kasutatud funktsioonina. Näiteks võib olla viga Android-telefonis, mis võimaldab kasutajatel saada root-juurdepääsu.
Riistvara vead
Mõned vead mõjutavad tarkvara asemel riistvara (arvuti füüsilisi osi). Näiteks käsu lock cmpxchg8b eax käivitamine vanadel Pentium-protsessoritel põhjustab protsessori töö seiskumise kuni taaskäivitamiseni. Kuna riistvaravigad on füüsilised disainivigad, ei saa neid tarkvarauuendusega parandada, kuigi tarkvara uuendamisega võib olla võimalik viga vältida (varjata).
Küsimused ja vastused
K: Mis on tarkvaraviga?
V: Tarkvaraviga on probleem arvutiprogrammi koodis, mis põhjustab selle ebaõiget tööd.
K: Millised on tarkvaravea tagajärjed?
V: Tarkvaraviga võib põhjustada kasutajale ebamugavusi ja panna arvuti kokku kukkuma või külmutama.
K: Kas kõikides arvutiprogrammides on vigu?
V: Jah, enamikus arvutiprogrammides on vigu.
K: Mis on vigane programm?
V: Vigane programm on programm, millel on suur hulk vigu või võib-olla üks või paar tõsist viga.
K: Kes vastutab enamiku arvutiprogrammide vigade eest?
V: Enamik vigu on põhjustatud arendaja halvast programmeerimisest, kuid mõnikord võivad neid põhjustada ka kompilaatoriprobleemid.
K: Mida inimesed teevad, kui nad leiavad arvutiprogrammis vea?
V: Kui vigu leitakse, saadavad inimesed arendajale veateate, et rääkida neile veast ja lasta neil seda parandada.
K: Mida mõtlevad inimesed, kui nad ütlevad, et nende arvutis on viga?
V: Kui inimesed ütlevad, et nende arvutis on viga, siis tähendavad nad tavaliselt, et arvutis on midagi valesti, mille põhjuseks on tavaliselt arvutiviirus, mis on nakatanud nende arvuti ja muudab selle aeglaseks või teeb erinevaid asju.
Otsige