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 runtime) tekkivate pahatahtlike või tahtmatute tegevuste arvu. 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).  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. 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 integrated development environment). 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. 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 https://ieeexplore.ieee.org/document/8506583[vaadatud: 19.12.2020]. Flemming Nielson, Hanne R. Nielson, Chris Hankin. Principles of program analysis. Springer, 2005, pp 1. Veebilink https://books.google.com/books?id=YseqCAAAQBAJ&printsec=frontcover#v=onepage&q&f=false [vaadatud: 19.12.2020]. Pilsung Kang. Software Analysis Techniques for Detecting Data Race. IEICE TRANS. INF. & SYST., VOL.E100–D, NO.11, 2017, pp 2674. Veebilink https://www.jstage.jst.go.jp/article/transinf/E100.D/11/E100.D_2017EDR0004/_article/-char/en [vaadatud: 19.12.2020]. 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 https://ieeexplore.ieee.org/document/6832155 [vaadatud: 20.12.2020]. Richard Brain. Dynamic code analysis vs. static analysis source code testing. ComputerWeekly.com, 2010. Veebilink https://www.computerweekly.com/answer/Dynamic-code-analysis-vs-static-analysis-source-code-testing [vaadatud: 12.01.2021]. Akihiro Asahara. Dynamic Analysis vs. Static Analysis. Sider Team Insights, 2020. Veebilink https://web.archive.org/web/20210113220550/https://www.sleeek.io/blog/dynamic-analysis-vs-static-analysis [vaadatud: 12.01.2021]. Margaret Rouse. Static analysis (static code analysis). SearchSoftwareQuality.com, 2020. Veebilink https://searchsoftwarequality.techtarget.com/definition/static-analysis-static-code-analysis [vaadatud: 10.01.2021]. 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 https://www.researchgate.net/publication/347383785_Static_Code_Analysis_Tools_A_Systematic_Literature_Review [vaadatud: 30.12.2020]. Anders Møller, Michael I. Schwartzbach. Static Program Analysis. Aarhus University, Denmark, 2019, pp 1-3. Veebilink https://cs.au.dk/~amoeller/spa/spa.pdf [vaadatud: 30.12.2020]. 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 https://link.springer.com/chapter/10.1007/978-3-319-11933-5_13 [vaadatud: 11.01.2021]. Margaret Rouse. Dynamic analysis. SearchSoftwareQuality.com, 2020. Veebilink https://searchsoftwarequality.techtarget.com/definition/dynamic-analysis [vaadatud: 11.01.2021]. Thomas Ball. The concept of dynamic analysis. ESEC 1999, SIGSOFT FSE 1999, LNCS, vol. 1687, 1999, pp 216-217. Veebilink https://www.cs.purdue.edu/homes/xyzhang/fall07/Papers/p216-ball.pdf [vaadatud: 11.01.2021]. Dynamic code analysis. PVS-Studio, terminology. Veebilink https://www.viva64.com/en/t/0070/ [vaadatud: 11.01.2021]