Forráskód statikus elemzése¶
Általános jellemzők¶
A szoftverek vizsgálata kétféle úton történhet, statikusan és dinamikusan. A dinamikus vizsgálat során a kód végrehajtásra kerül. Ezen a módon zajli a programtesztelés is, ahol az adott tesztet érintő kódrészletek végrehajtása történik, azok helyes működésének ellenőrzése céljából. A statikus elemzés alatt ezzel szemben nincs kód végrehajtás, hanem a forráskód (automatizált) elemzése zajlik.
A statikus kódelemzés (static code analysis) lehetővé teszi, hogy a forráskódot még a fordítás előtt előfeldolgozzuk, és a lehetséges hibákat és problémákat előre feltérképezzük
- a fejlesztőkörnyezet beépített kódelemzővel rendelkezhet, amely megadott szabályhalmaz alapján a lehetséges hibaeseteket felfedi
- a statikus kód elemzés egy része kimondottan a kódolási konvenciók (pl. elnevezések, tagolás, dokumentáltság) ellenőrzését biztosítja
- a kódra számíthatók metrikák (code metric), amelyek megadják karbantarthatóságának, összetettségének mértékét (pl. cyclomatic complexity, class coupling)
Maga a statikus forráskódelemzés a kód lexikális (tokenizálás) és szintaktikus elemzése során felépített modellen történik. Ez a modell az absztrakt szintaxis fa, vagy abszrakt szintaxis gráf. Ezt a struktúrát a fordítóprogramok is felépítik, ezért sok elemző a fordítókkal párhuzamosan dolgozik (wrapperek). Az absztrakt szintaxis fa konkrét megjelenése eszköz és nyelvtanfüggő, de funkcionálisan ekvivalensek. (Ugyanazt a funkciót ábrázolják).
Tekintsük az alábbi euklideszi algoritmust:
1 2 3 4 5 6 |
|
A fenti kódhoz tartozó AST:
A statikus elemzők az AST elemeiből készítik el saját elemzésüket, amelyek gyakran gráf kimenetek. Az elemzés során meghatározásra kerülnek a forráskód metrikák (olyan számszerű mutatók, amelyek a forráskód mérhetők, összeszámolhatók), előre definiált szabályok alapján a lehetséges szabálysértése, mintaillesztés alapján a bad smellek (olyan kódrészek, amelyek önmagukban nem hibák, de adott körülmények esetén hibák forrásai lehetnek). A statikus forráskód analízis tehát a minőségmérés és a kód auditálás alapja.
SonarQube¶
A SonarQube egy nyílt forráskódú forráskód elemző. Java alapú, pluginok útján bővíthető. Maga a keretrendszer ingyenes, a pluginok egy része viszont fizetős. Az egyes nyelvi elemzők a pluginokon keresztül érhetők el.
Telepítés¶
Telepítéséhez töltsük le a community változatot, majd csomagoljuk azt ki egy célkönyvtárba. A pluginok helye az extensions/plugins. A rendszer telepítése a kibontáson kívül általában nem igényel mást, kivéve ha nem lokális gépen használjuk és nem az alapértelmezett 9000-es porton szeretnénk használni. Ekkor a conf könyvtárban a sonar.properties fájlban kell a megfelelő beállításokat elvégezni. A fájl jól felépített, a lehetőségek ki vannak kommentezve, lényegében ezeket kell csak kitörölni (és esetleg új értéket beállítani). Szintén konfigurálni kell, amennyiben nem a saját beépített H2 adatbázisát szeretnénk használni, hanem pl. PostgreSQL-t a projektek (elemzések) tárolására.
A platform a bin könyvtár megfelelő (operációs rendszertől függő) alkönyvtárából indíthat. Pl. Linux esetén a ./sonar.sh
start paranncsal. A platform a böngészőn keresztül érhető el, helyi gépen a http://localhost:9000
címen. (Kis idő kell ahhoz, hogy felálljon a rendszer.)
Hiba esetén a logs könyvtárban található logok adnak eligazítást, legtöbbször Java verzió probléma van. Az aktuális verziók a Java 11-et igénylik.
Alapértelmezett bejelentkezés (telepítés után) az admin/admin, ezt azonban (amennyiben gépünk kívülről is elérhető) erősen javasolt megváltoztatni.
Elemzés¶
A legegyszerább megoldás a sonar-scanner használata. Ez szintén egy zip file kibontásával telepíthető. Ha lokális gépen végzünk elemzést, speciális beállítást nem igényel.
A scanner használatához az elemzendő programkönyvtárba egy sonar-project.properties
filet kell elhelyezni. Erre minta a fenti linken található. Beállítandó a forráskódot tartalmazó könyvtár, a binárisok helye, a nyelv és a karakterkódolás. Adjuk meg a projekt (elemzés) nevét, kulcsát és verzióját. A hitelesítési problémák elkerülése érdekében készítsünk a felhasználónknak a SonarQube felületén egy tokent, ezt helyezzük el a properties fileba. A scanner futtatásával a projekt elemzése is lefut.
Példa properites:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
További infó az online dokumentációban olvasható.
Online is lehetőség van ismerkedni a platformmal: demo oldal
A hallgatói projektek elemzése a következő címen elérhető: projektek
Source Meter¶
Az egyetem által fejlesztett statikus kódelemző eszköz, C++, Java, Python, JavaScript, C# és RPG nyelvekre működik. Parancssoros alkalmazás.
Az elemzés során méri a különböző metrikákat (sokkal részletesebb és finomabban hangolt módon, mint a SonarQube pluginok), vizsgálja a szabálysértéseket, code smelleket. Saját grafikus megjelenítője is van, de az eredmények a SonarQube platformra is feltölthetők és megjeleníthetők. (Ehhez speciális pluginokat kell telepíteni).
Telepítéséhez csak ki kell bontani a csomagot, nem igényel speciális beállítást.
Az elemzés nyelvfüggő, ehhez részletes útmutatót ad a felhasználói leírás. A Java projektek esetén könyvtár alapú elemzéseket végez, ilyen esetben csak a megfelelő paraméterekkel ellátott parancssori programot kell elindítani.
Példa:
`../SourceMeterJava -projectName=log4j-1.2.17 -projectBaseDir=apache-log4j-1.2.17 -resultsDir=Results
- projectBaseDir: a projekt gyökérkönyvtára
- resultsDir: ide kerül az elemzés eredménye, az egyes eredmények egy timestamppel jelölt alkönyvtárba kerülnek be
Lehetőségünk van az elemzésben szűrők alkalmazására (tehát az elemzésből kivonhatunk könyvtárakat vagy fileokat). Ez lehet soft és hard módon is, az előbbi esetén lefut az elemzés, de nem jelenítjük meg, míg a második esetben ténylegesen kimaradnak az elemzésből a specifikált fájlok.
Számos további kapcsoló segítségével lehet testreszabni az elemzést. Megadhatók például felhasználó által definiált metrikák (UDM - User Defined Metrics), amelyek a meglévő metrikákból elemi műveletek segítségével definiálhatók.
Az eredmények szöveges (csv, txt és xml) állományok, valamint az egyes gráfok binárisai. Az AST is megtalálható köztük egy XML fileban.
Az alkalmazásról további részletek elérhetők itt: SourceMeter
A SourceMeter ingyenes változata az Open Static Analyzer: OSA
Feladatok¶
- Töltsük le a SonarQube aktuális változatát és a kapcsolódó SonarScannert. Állítsuk be localhostra a működését, majd futtassuk le az aktuális forráskódunkon! Figyeljük meg a kimenetet!
- Töltsük le az OSA-t és parancssorból futtassuk a Java alapú forrásunkon. Figyeljük meg a kimeneteket!