Programmi analüüs

**Programmi analüüsimine** on arvutiteadusest pärinev toiming, millega hinnatakse lähtekoodi omadusi automaatselt läbiviidavate meetoditega. Selle eesmärk on ennustada programmi töökindlust, optimeeritust ja turvalisust ning vähendada võimalikke käitusajal (ingl *[[:en:Runtime_(program_lifecycle_phase)|runtime]]*) tekkivate pahatahtlike või tahtmatute tegevuste arvu.

## Ülevaade
Programmi analüüsimise viise kategoriseeritakse üldiselt vastavalt sellele, millal leiab aset automatiseeritud analüüs: staatilise programmianalüüsi meetodid koguvad koodi kohta käiva informatsiooni kompileerimise ajal (st enne käitusaega) ning dünaamiline programmianalüüs uurib lähtekoodi teguviise käitusaja kestel.

Programmi analüüsimist on võimalik kirjeldada kolme etapina:

* jõudluse analüüs – kogutakse andmeid jõudluse kohta, et avastada koodis kitsaskohti (ingl *[[:en:Bottleneck_(software)|bottleneck]]*), kus ootuspärasest märgatavalt suurem jõudluse vajadus kahjustab ülejäänud programmi tööd, tulemuseks saadud analüüs näitab näiteks programmis olevate käskude ja protseduuride täitmisaegade jaotusi või andmeid mälu kasutuse ja samaaegselt täidetavate operatsioonide kohta;
* käsuvoo (ingl *[[:en:Control_flow|control flow]]*) analüüs – määratakse programmi struktuur vastavalt koodiosade täitmisaegadele ning selle illustreerimiseks koostatakse võimalusel käsuvoo skeem (ingl *[[:en:Control-flow_graph|control-flow graph]]*), seejärel analüüsitakse, kui ressursinõudlikud on programmis leiduvad erinevad funktsioonid või käsud operatsioonisüsteemi tuumale;
* andmevoo (ingl *[[:en:Dataflow|data flow]]*) analüüs – uuritakse tsüklite kaupa erinevaid andmete parameetreid ning valmistatakse andmevoo skeem (ingl *[[:en:Data-flow_diagram|data-flow diagram]]*), analüüsi tulemusena saadakse ülevaade andmete väärtustest ja nende sõltuvustest mälus, see aitab optimeerida tsüklite tööd, paralleeltöötlust, vahemälu kasutust ja käskude ajaplaani (ingl *[[:en:Instruction_scheduling|instruction scheduling]]*).

Kõige optimaalsem viis programmi analüüsi sooritamiseks on lähtekoodil rakendada nii staatilise kui ka dünaamilise analüüsi meetodeid. Need meetodid täiendavad teineteist: staatiline analüüs suudab määrata veaohtliku koodi täpse asukoha ning hoiatada potentsiaalsetest turvariskidest, mis võivad esile tõusta uuritava programmi täitmisel, ning teisest küljest dünaamiline analüüs keskendub spetsiifilisematele probleemidele, mis jäävad staatilisele analüüsile märkamatuks ja mida on võimalik tuvastada ainult käitusaja jooksul (näiteks ühilduvus andmebaaside või interneti teenustega).

## Staatiline programmianalüüs

Staatiline koodi analüüsimine on arvutiprogrammide silumise otstarbeks mõeldud meetod, mida teostatakse väljaspool programmi käitusaega. Analüsaator on eraldiseisev tarkvara, mis teostab arendatava programmi lähtekoodile automaatset läbivaatust selleks, et tagada programmi vastavus valdkonna standarditele. Staatilist analüüsimist kasutatakse tarkvaratehnikas (ingl *[[:en:Software_engineering|software engineering]]*) tarkvara arendamisel ja kvaliteeditagatises (ingl *[[:en:Quality_assurance|quality assurance]]*).

Lähtekoodi analüüsimine automaatsete staatiliste tööriistadega on märkimisväärselt kiirem ja efektiivsem kui tavapärane manuaalne koodi ülevaatus, mida viib läbi tarkvaraarendaja. Staatilise programmianalüüsimiseks mõeldud tööriistad töötavad sarnaselt viirusetõrjetarkvaraga, otsides lähtekoodist eelsätestatud mustrite või reeglite põhjal koodikomplekte, mis võivad sisaldada mingisuguseid defekte. Automaatne tööriist ei suuda siiski täieliku kindlusega tuvastada, et koodijupp on vigane ning ikkagi on vajalik arendajal endal tööriista pakutud muudatused üle vaadata.  Tavapärane staatiline koodianalüüs koosneb neljast faasist: eesmärkide seadmine, staatilise analüüsi tööriista käitamine lähtekoodil, lähtekoodi ülevaatus (tööriista väljundi abiga), paranduste sisseviimine.

Staatilist programmianalüüsimist on kasutatud alates 1960. aastatest. Esialgu oli peamine eesmärk kompilaatorite optimeerimine, hiljem hakati staatilist programmianalüüsimist rakendama laialdasemalt vigade leidmiseks, koodi õigsuse määramiseks ning tarkvara arendamise toetuseks IDE-keskkondades (ingl *[[:en:Integrated_development_environment|integrated development environment]]*).

## Dünaamiline programmianalüüs
Dünaamiline programmianalüüs on fokuseeritud käitusaegse programmi parameetrite uurimisele, see tähendab, et informatsiooni töö protsessi kohta kogutakse reaalajas programmi täitmisel. Teatud tunnuste analüüsimiseks eelistatakse dünaamilist meetodit staatilise meetodi asemel, need tunnused on näiteks dünaamiline siduvus (ingl *[[:en:Late_binding|dynamic binding]]*), polümorfism ja lõimete efektiivsus. Lisaks aitab dünaamiline analüüs tuvastada ja eemaldada ebavajalikke detaile või komponente koodis, tagada uuritava programmi ühilduvust muu tarkvaraga ning vähendada programmi testimisele minevaid kulutusi.

Dünaamilise programmianalüüsi efektiivsust saab väljendada läbi kahe peamise omaduse:

* informatsiooni täpsus – enamjaolt tähendab dünaamiline analüüs programmi käitusaegse oleku salvestamist ning seejärel toimub salvestatud informatsiooni või väljundi põhjalikum läbivaatus, seda protsessi nimetatakse programmi instrumentatsiooniks (ingl *[[:en:Instrumentation_(computer_programming)|instrumentation]]*) ning selle abil on võimalik koguda üksikasjalikke andmeid mõne spetsiifilise probleemi kohta (näiteks analüüsida erinevate andmestruktuuride olekuid või seoseid kuhjapõhiselt jaotatud mälupesade vahel);
* sõltuvus programmile antud sisendist – kuigi see on üks märkimisväärsemaid dünaamilise analüüsi puuduseid, on seda siiski võimalik enda kasuks tööle rakendada, et luua lihtsasti jälgitavaid ja ennustatavaid seoseid programmi sisendi ning väljundi või käitumisviisi vahel.

Dünaamilist programmianalüüsi on võimalik läbi viia arvuti enda protsessoril või virtuaalsel protsessoril ning selleks on vajalik, et algkood ei sisaldaks kompileerimisaegseid vigu. Analüüsi teostamiseks antakse vaatluse all olevale programmile ette hulk andmeid, mille tõttu sõltub analüüsi tõhusus otseselt sisendandmete kvaliteedist ja kogusest. Automaatset analüüsimist sooritavad selleks ettenähtud dünaamilise analüüsi tööriistad ning nagu ka staatilise programmianalüüsi puhul ei ole alati võimalik kõiki vigu avastada. Paljud kaasaegsed IDE-keskkonnad omavad sisseehitatud dünaamilise analüüsi tööriistu, mida on võimalik kasutada samamoodi nagu teisi keskkonna mooduleid.

## Viited