Záróvizsga prezentáció
Nagyméretű forráskód tárak inkrementális statikus analízise
Budapesti Műszaki és Gazdaságtudományi Egyetem
Méréstechnika és Információs Rendszerek Tanszék
Hibatűrő Rendszerek Kutatócsoport
1. Nagyméretű forráskódtárak
inkrementális statikus analízise
konzulensek: Szárnyas Gábor
Dr. Ráth István
Budapesti Műszaki és Gazdaságtudományi Egyetem
Méréstechnika és Információs Rendszerek Tanszék
Hibatűrő Rendszerek Kutatócsoport
Stein Dániel, BSc
2. Folytonos integráció (FI)
Continuous Integration (CI) – Több fejlesztő együttműködése
– Integrációs problémák
megelőzése
– Például
– Jenkins
– Hudson
– Travis CI
2
Verziókezelés
Fordítás
Fejlesztés
Egység- és
integrációs teszt
3. Statikus analízis
– Nincs szükség a program
fordítására és futtatására
– Alaki és strukturális jellegű
szabályellenőrzést végez
– FI mellett vagy részeként
alkalmazandó
– Kódmintaillesztést használunk
3
Verziókezelés
Fordítás
Fejlesztés
Egység- és
integrációs teszt
Kódanalízis
4. – A kódanalízis erőforrás- és időigényes folyamat
– Lassú, nem alkalmazható FI-szerű ütemezéssel
Megoldandó probléma
4
egységteszt
kódanalízis
☼ ☆☾☆
5. – A kódanalízis erőforrás- és időigényes folyamat
– Lassú, nem alkalmazható FI-szerű ütemezéssel
– Átmeneti megoldás: tömbösítés
Megoldandó probléma
5
egységteszt
kódanalízis
☼ ☆☾☆
egységteszt
kódanalízis
6. – A kódanalízis erőforrás- és időigényes folyamat
– Lassú, nem alkalmazható FI-szerű ütemezéssel
– Átmeneti megoldás: tömbösítés
Minél hamarabb,
minél gyorsabban
eredményt kell adni.
Megoldandó probléma
6
egységteszt
kódanalízis
☼ ☆☾☆
egységteszt
kódanalízis
7. A bemutatott megoldás
–Inkrementális elvet alkalmazunk
A számított eredményt csak a későbbi
változás hatásával frissítjük.
–Projekt helyett fájl szintű feldolgozás
–Későbbi skálázhatóságot,
eloszthatóságot figyelembe véve terveztük
7
kódanalizátor
Δ2.-1.1.
14. Függőségi
gráf
Absztrakt
szintaxis gráf
.jar
.java
JaMoPP
Architektúra átalakítás
–Függőségi gráf
– Segédkomponens a későbbi
feldolgozáshoz
– A gráf élei a Java függőségeknek
megfeleltethetők
–Absztrakt szintaxis gráf
– A projektet modellé, majd azt
gráffá alakítjuk
14
Minden fájlra leírók gyűjtése és tárolása:
package, szükséges fordítási egységek, stb.
Minden további alrendszer számára elérhető
információval szolgál
16. Függőségi
gráf
Absztrakt
szintaxis gráf
.jar
.java
JaMoPP
Architektúra átalakítás
–Függőségi gráf
– Segédkomponens a későbbi
feldolgozáshoz
– A gráf élei a Java függőségeknek
megfeleltethetők
–Absztrakt szintaxis gráf
– A projektet modellé, majd azt
gráffá alakítjuk
16
A forráskód struktúrájának gráf
reprezentációja
Nem tartalmaz minden információt
Részgráfokból állítjuk elő a teljes gráfot
17. Jólformáltsági
szabályok
Lekérdezés futtatása Adatbázis
Automatikus
jólformáltsági
szabály kiértékelés
Kézi futtatás
és kiértékelés
Automatikus
többszörözés és elosztás
Kiértékelési jelentés
<!>
<?>
<.>
Architektúra modellfeldolgozás
Felhasználói ki-
és bemenet
17
Felhasználói bemenet
kiértékelése és kimenet
előállítása
Adattárolás és
lekérdezés-
végrehajtás
18. Jólformáltsági
szabályok
Lekérdezés futtatása Adatbázis
Automatikus
jólformáltsági
szabály kiértékelés
Kézi futtatás
és kiértékelés
Automatikus
többszörözés és elosztás
Kiértékelési jelentés
<!>
<?>
<.>
Architektúra modellfeldolgozás
Felhasználói ki-
és bemenet
18
Felhasználói bemenet
kiértékelése és kimenet
előállítása
Adattárolás és
lekérdezés-
végrehajtás
Gráfadatbázis
Technológiai
választásunk: 4store
Elasztikusan
skálázódik
19. Jólformáltsági
szabályok
Lekérdezés futtatása Adatbázis
Automatikus
jólformáltsági
szabály kiértékelés
Kézi futtatás
és kiértékelés
Automatikus
többszörözés és elosztás
Kiértékelési jelentés
<!>
<?>
<.>
Architektúra modellfeldolgozás
Felhasználói ki-
és bemenet
19
Felhasználói bemenet
kiértékelése és kimenet
előállítása
Adattárolás és
lekérdezés-
végrehajtás
20. Jólformáltsági
szabályok
Lekérdezés futtatása Adatbázis
Automatikus
jólformáltsági
szabály kiértékelés
Kézi futtatás
és kiértékelés
Automatikus
többszörözés és elosztás
Kiértékelési jelentés
<!>
<?>
<.>
Architektúra modellfeldolgozás
Felhasználói ki-
és bemenet
20
Felhasználói bemenet
kiértékelése és kimenet
előállítása
Adattárolás és
lekérdezés-
végrehajtás
Gráfmintaként (SPARQL nyelven)
megfogalmazott kódminták
Lekérdezések végrehajtása
(akár inkrementálisan)
Jelentés előállítása (vagy frissítése)
21. Jólformáltsági
szabályok
Lekérdezés futtatása Adatbázis
Automatikus
jólformáltsági
szabály kiértékelés
Kézi futtatás
és kiértékelés
Automatikus
többszörözés és elosztás
Kiértékelési jelentés
<!>
<?>
<.>
Architektúra modellfeldolgozás
Felhasználói ki-
és bemenet
21
Felhasználói bemenet
kiértékelése és kimenet
előállítása
Adattárolás és
lekérdezés-
végrehajtás
Gráfmintaként (SPARQL nyelven)
megfogalmazott kódminták
Lekérdezések végrehajtása
(akár inkrementálisan)
Jelentés előállítása (vagy frissítése)
ASG-n értelmezett minta
Informális specifikáció
22. Jólformáltsági
szabályok
Lekérdezés futtatása Adatbázis
Automatikus
jólformáltsági
szabály kiértékelés
Kézi futtatás
és kiértékelés
Automatikus
többszörözés és elosztás
Kiértékelési jelentés
<!>
<?>
<.>
Architektúra modellfeldolgozás
Felhasználói ki-
és bemenet
22
Felhasználói bemenet
kiértékelése és kimenet
előállítása
Adattárolás és
lekérdezés-
végrehajtás
Gráfmintaként (SPARQL nyelven)
megfogalmazott kódminták
Lekérdezések végrehajtása
(akár inkrementálisan)
Jelentés előállítása (vagy frissítése)
23. Jólformáltsági
szabályok
Lekérdezés futtatása Adatbázis
Automatikus
jólformáltsági
szabály kiértékelés
Kézi futtatás
és kiértékelés
Automatikus
többszörözés és elosztás
Kiértékelési jelentés
<!>
<?>
<.>
Architektúra modellfeldolgozás
Felhasználói ki-
és bemenet
23
Felhasználói bemenet
kiértékelése és kimenet
előállítása
Adattárolás és
lekérdezés-
végrehajtás
Visszajelzés a
felhasználónak
Felsorolja a szabályokat
megszegő kódrészleteket
Gráfmintaként (SPARQL nyelven)
megfogalmazott kódminták
Lekérdezések végrehajtása
(akár inkrementálisan)
Jelentés előállítása (vagy frissítése)
24. Jólformáltsági
szabályok
Lekérdezés futtatása Adatbázis
Automatikus
jólformáltsági
szabály kiértékelés
Kézi futtatás
és kiértékelés
Automatikus
többszörözés és elosztás
Kiértékelési jelentés
<!>
<?>
<.>
Architektúra modellfeldolgozás
Felhasználói ki-
és bemenet
24
Felhasználói bemenet
kiértékelése és kimenet
előállítása
Adattárolás és
lekérdezés-
végrehajtás
Gráfmintaként (SPARQL nyelven)
megfogalmazott kódminták
Lekérdezések végrehajtása
(akár inkrementálisan)
Jelentés előállítása (vagy frissítése)
25. Példa forráskód
public static String toMonth(int month) {
switch (month) {
case 1: return "January";
case 2: return "February";
case 3: return "March";
case 4: return "April";
case 5: return "May";
case 6: return "June";
case 7: return "July";
case 8: return "August";
case 9: return "September";
case 10: return "October";
case 11: return "November";
case 12: return "December";
default: return "Invalid month";
}
}
25Bemeneti forráskód (részlet) Kódmodell (részlet)
26. Példa forráskód
public static String toMonth(int month) {
switch (month) {
case 1: return "January";
case 2: return "February";
case 3: return "March";
case 4: return "April";
case 5: return "May";
case 6: return "June";
case 7: return "July";
case 8: return "August";
case 9: return "September";
case 10: return "October";
case 11: return "November";
case 12: return "December";
default: return "Invalid month";
}
}
26Bemeneti forráskód (részlet) Kódmodell (részlet)
27. Példa forráskód
public static String toMonth(int month) {
switch (month) {
case 1: return "January";
case 2: return "February";
case 3: return "March";
case 4: return "April";
case 5: return "May";
case 6: return "June";
case 7: return "July";
case 8: return "August";
case 9: return "September";
case 10: return "October";
case 11: return "November";
case 12: return "December";
default: return "Invalid month";
}
}
27Bemeneti forráskód (részlet) Kódmodell (részlet)
28. Példa forráskód
public static String toMonth(int month) {
switch (month) {
case 1: return "January";
case 2: return "February";
case 3: return "March";
case 4: return "April";
case 5: return "May";
case 6: return "June";
case 7: return "July";
case 8: return "August";
case 9: return "September";
case 10: return "October";
case 11: return "November";
case 12: return "December";
default: return "Invalid month";
}
}
28Bemeneti forráskód (részlet) Kódmodell (részlet)
29. Példa forráskód
public static String toMonth(int month) {
switch (month) {
case 1: return "January";
case 2: return "February";
case 3: return "March";
case 4: return "April";
case 5: return "May";
case 6: return "June";
case 7: return "July";
case 8: return "August";
case 9: return "September";
case 10: return "October";
case 11: return "November";
case 12: return "December";
default: return "Invalid month";
}
}
29Bemeneti forráskód (részlet) Kódmodell (részlet)
37. 1 555
345 951
27 535
213
966
23 354 27 870
201
100
1000
10000
100000
1000000
10000000
Függőségi gráf
építése
Absztrakt szintaxisgráf
összeállítása
Modell
tárolása
Lekérdezések
futtatása
Fázisfutásiideje[ms]
Első, teljes futtatás
Módosítás inkrementális feldolgozása
Nagyságrendi
különbség
Mérési eredmények inkrementális
37
38. 1 555
345 951
27 535
213
966
23 354 27 870
201
100
1000
10000
100000
1000000
10000000
Függőségi gráf
építése
Absztrakt szintaxisgráf
összeállítása
Modell
tárolása
Lekérdezések
futtatása
Fázisfutásiideje[ms]
Első, teljes futtatás
Módosítás inkrementális feldolgozása
Nagyságrendi
különbség
Mérési eredmények inkrementális
38
-85%
39. 4.09 8.42
4.35
2.14
28.36
52.19
375.04
1 10 100 1000
FindBugs
PMD
Checkstyle
Columbus
inkr. ISAaC
ISAaC
Teljes futási idő [s]
Fordítás
Analízis
Mérési eredmények összehasonlítva
39
40. Összefoglalás
– Szabványos formátumok és
cserélhető komponensek
– Java forráskód átalakítása RDF
gráffá, akár elosztott
megközelítéssel
– Az elkészített gráf inkrementális
frissítése is megoldott
– Moduláris, bővíthető és skálázható
inkrementális statikus analízis
keretrendszert készítettem
– Java forrást RDF gráffá alakító
segédeszközt implementáltam
– Benchmark funkciókkal bővítettem
a keretrendszert és méréseket
végeztem
40
Újszerű megközelítés az inkrementális statikus analízishez:
41. Továbbfejlesztési lehetőségek
– Inkrementális analízis INCQUERY-D használatával
– Feldolgozás granularitásának javítása minden fázisban
– Keretrendszer elosztottá tétele
41
Átalakítás és
perzisztálás
Munkaterület
beállítása
Függőségek
felderítése
Lekérdezések
futtatása
Szerver 1
Szerver 2
Szerver 3
Szerver 4
Szerver 1
Szerver 2
Szerver 3
Szerver 4
Szerver 1
Szerver 2
Szerver 3
Szerver 4
Sz. 1
Sz. 2
Sz. 3
Sz. 4
Á P
Á P
Á P
Á P
L1 L2
L3
L4 L5
L6
42. Összefoglalás
– Szabványos formátumok és
cserélhető komponensek
– Java forráskód átalakítása RDF
gráffá, akár elosztott
megközelítéssel
– Az elkészített gráf inkrementális
frissítése is megoldott
A dolgozat eredményei a MONDO
EU-FP7 kutatási projekthez
kapcsolódnak, annak egyik
demonstrátorát képezik.
42
Újszerű megközelítés az inkrementális statikus analízishez:
43. Bírálói kérdések
A dolgozat említi, hogy a JaMoPP Java 5 támogatása az újabb
verziójú Java kódok elemzését nem teszi lehetővé. Van lehetőség
ennek a komponensnek a lecserélésére? Milyen alternatív
megoldásokat vizsgált meg?
– Réteges az architektúra, a komponens cserélhető, de jobb jelölt nincs
jelenleg nincs.
– A metamodell bővíthető, de sok munka lenne. Az újabb verziójú kódot
is feldolgozza, de nem hibamentesen.
– Alternatívák:
– MoDisco (projekt szintű feldolgozás, de átalakítható)
– Columbus (zárt forráskódú, viszont JaMoPP-hoz jobban hasonlít)
43
44. Többször említésre kerül az adatbázis alapú tárolás által lehetővé
tett elosztott ellenőrzés lehetősége. Milyen tényezőket érdemes egy
ilyen megoldásnak a teljesítménybeli és pénzügyi
hatékonyságágának megtervezéséhez figyelembe venni?
– Használt tárterület
– A forráskód XMI modellje ~2-5×.
– Az RDF sorosítás ~4-10×.
– Az adatbázis viszont tömörítheti a
sokszor ismétlődő szövegrészleteket
(pl. URI, attribútum).
– Elérési sebesség
– Több adatbázis szerver gyorsíthatja az
olvasást, keresést (de ez nem lassú).
– Az írási és szinkronizációs sebesség
viszont csökkenhet.
Bírálói kérdések
44
45. Bírálói kérdések
A már létező ellenőrző eszközökhöz nagy számú szabály áll rendelkezésre.
Milyen csoportokra lehetne osztani ezeket a szabályokat az esetleges
migráció megtervezésekor technológia és bonyolultság szerint? Esetleg
minden szabály átírása egyértelmű? Mekkora feladatot jelentene pl. a
PMD-hez rendelkezésre álló szabályok átírása?
– A mintaalapú megközelítés (PMD) könnyebben átírható. A metamodellek
különbsége miatt kézzel kell feldolgozni, de JDT AST-szerű mindkét
metamodell.
– Az IncQuery-D használatával bonyolultabb lekérdezések (pl. count)
megvalósítható, nem csak mintaillesztés.
– Csoportra példa:
sorrend alapú minta (nem az utolsó case a default), ami RDF esetén
nehezebben megoldható. 45
46. Bírálói kérdések
A forráskódban fellelhető hibákon kívül nagy projekteknél komoly
problémát jelent, ha egy adott library-nek több verziója is jelen van
futás közben. Ezt a build rendszerek, pl. Maven, Gradle, explicit
kizárásokkal, felülírásokkal és további “trükkökkel” próbálják
orvosolni. Volna lehetőség ilyen jellegű problémák kimutatására a
keretrendszer kiterjesztésével? Milyen módon lehetne ezt
implementálni?
– A keretrendszer nem pont erre lett kialakítva, a classpath kezdetleges.
– Library függésével, függőségi és hatásanalízissel Csikós Donát
foglalkozott, az ő munkáját lehetne követni.
– Több library kezelése megoldható a keretrendszer paraméterezésével
és a projektek verziókezelt mentésével. Ehhez átdolgozott mentési
stratégia szükséges.
46
47. Bírálói kérdések
Hogyan hasonlítható össze a készített ISAaC rendszer egy olyan
rendszerrel hatékonyság szempontjából, amely egy meglévő statikus
kódanalizátort futtat a megváltozott fájlokon (és ezek függőségi
lezártján)?
– FindBugs és PMD analizátorok integrálása a benchmark rendszerbe
– Találatok ellenőrzése
– Vagy nem használjuk fel a változások listáját (teljes futtatás)
– Vagy a modosítás függőségi lezártján futtatjuk az ellenőrzést
– Befolyásolhatja a mérés hűségét, hogy a lezárt alatt ugyanazt érti-e a
másik szoftver fejlesztője, mint a mi megoldásunkban
47
48. Bírálói kérdések
Jelenlegi granularitás a fájl, mint egység, ami jóval nagyobb
lehet, mint a "changeset". Mi a praktikusan elérhető legkisebb
granularitás?
– JaMoPP esetén a feldolgozás fájlonként történik, ennél kisebb
egység nem vizsgálható.
– Azonban hatásanalízis használatával a szükséges feldolgozandó
fájlok száma csökkenthető.
– Modellösszehasonlító használatával AST node szintig levihető a
granularitás.
48
49. Bírálói kérdések
Kb. mennyi, az inkrementális mivoltából fakadó extra tárhelyet
használ a rendszer a példában szereplő projektek esetén?
– Az inkrementális feldolgozáshoz csak a módosítás előtti
szerializált részgráfot tároljuk el.
– Egy fájlhoz tehát legfeljebb a gráf formátumban tárolt modell
méretének kétszerese szükséges.
– A szövegesen tárolt gráf tömöríthető.
49
50. Bírálói kérdések
Mi szükséges a Java mellett más nyelvek támogatásához?
– A JaMoPP-hoz hasonló parser, ami képes a Java forrásból
programmatikusan feldolgozható példánymodellt készíteni.
– Szükséges, hogy a fájlok közti hivatkozás részenként sorosítható
legyen, egyértelmű, hierarchikus azonosítókkal.
projects://ISAaC/src/Teszt.java#//@statements.0/@...
50