**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 *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 *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 *control flow*) analüüs – määratakse programmi struktuur vastavalt koodiosade täitmisaegadele ning selle illustreerimiseks koostatakse võimalusel käsuvoo skeem (ingl *control-flow graph*), seejärel analüüsitakse, kui ressursinõudlikud on programmis leiduvad erinevad funktsioonid või käsud operatsioonisüsteemi tuumale;
* andmevoo (ingl *data flow*) analüüs – uuritakse tsüklite kaupa erinevaid andmete parameetreid ning valmistatakse andmevoo skeem (ingl *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 *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
---------------------------

 *Pikemalt artiklis staatiline programmi analüü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 *software engineering*) tarkvara arendamisel ja kvaliteeditagatises (ingl *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-ndatest. 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 *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 *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 *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
------

1. ↑  Kyle Thayer, Paul G. Allen. Using Program Analysis to Improve API Learnability. *2018 IEEE Symposium on Visual Languages and Human-Centric Computing (VL/HCC)*, 2018, pp 272. Veebilink [vaadatud: 19.12.2020].
2. ↑  Flemming Nielson, Hanne R. Nielson, Chris Hankin. Principles of program analysis. *Springer*, 2005, pp 1. Veebilink  [vaadatud: 19.12.2020].
3. ↑  Pilsung Kang. Software Analysis Techniques for Detecting Data Race. *IEICE TRANS. INF. & SYST. VOL.E100–D, NO.11*, 2017, pp 2674. Veebilink  [vaadatud: 19.12.2020].
4. ↑  Pingjing Lu, Bao Li, Zhengbin Pang, Ying Zhang, Shaogang Wang. Combining program analysis and empirical search to optimize programs. *2013 IEEE International Conference on High Performance Computing and Communications & 2013 IEEE International Conference on Embedded and Ubiquitous Computing*, 2013, pp 1896-1897. Veebilink  [vaadatud: 20.12.2020].
5. ↑  Richard Brain. Dynamic code analysis vs. static analysis source code testing. *ComputerWeekly.com*, 2010. Veebilink  [vaadatud: 12.01.2021].
6. ↑  Akihiro Asahara. Dynamic Analysis vs. Static Analysis. *Sider Team Insights*, 2020. Veebilink  [vaadatud: 12.01.2021].
7. ↑  Margaret Rouse. Static analysis (static code analysis). *SearchSoftwareQuality.com*, 2020. Veebilink  [vaadatud: 10.01.2021].
8. ↑  Darko Stefanovic, Danilo Nikolic, Dusanka Dakic, Ivana Spasojevic, Sonja Ristic. Static Code Analysis Tools: A Systematic Literature Review. *Proceedings of the 31st International DAAAM Symposium 2020*, 2020, pp 0566-0567. Veebilink  [vaadatud: 30.12.2020].
9. ↑  Anders Møller, Michael I. Schwartzbach. Static Program Analysis. *Aarhus University, Denmark*, 2019, pp 1-3. Veebilink  [vaadatud: 30.12.2020].
10. ↑  Anjana Gosain, Ganga Sharma. A Survey of Dynamic Program Analysis Techniques and Tools. *Proceedings of the 3rd International Conference on Frontiers of Intelligent Computing: Theory and Applications (FICTA)*, 2014, pp 113-114. Veebilink  [vaadatud: 11.01.2021].
11. ↑  Margaret Rouse. Dynamic analysis. *SearchSoftwareQuality.com*, 2020. Veebilink  [vaadatud: 11.01.2021].
12. ↑  Thomas Ball. The concept of dynamic analysis. *ESEC 1999, SIGSOFT FSE 1999, LNCS, vol. 1687*, 1999, pp 216-217. Veebilink  [vaadatud: 11.01.2021].
13. ↑  Dynamic code analysis. *PVS-Studio, terminology*. Veebilink  [vaadatud: 11.01.2021]