forráskódtárak gráfalapú statikus analízise
TRANSCRIPT
Forráskódtárak gráfalapústatikus analízise
Budapesti Műszaki és Gazdaságtudományi EgyetemMéréstechnika és Információs Rendszerek Tanszék
Hibatűrő Rendszerek Kutatócsoport
Stein Dániel
Projekt résztvevői
2
Lucz Tamás Soma– Honfi Dávid– Vörös András
Stein Dániel– Szárnyas Gábor Lippai Ádám
Tartalom
1. Problémakör
2. Eszközök
3. Felhasználási lehetőségek
4. Neo4j tanulságok, példák
3
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
4
Verziókezelés
Fordítás
Fejlesztés
Egység- és integrációs teszt
5
Apple,https://blog.codecentric.de/en/2014/02/curly-braces/
5
Apple,https://blog.codecentric.de/en/2014/02/curly-braces/
5
hupsz
Apple,https://blog.codecentric.de/en/2014/02/curly-braces/
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égzünk
– FI mellett vagy részeként alkalmazandó
– Egy lehetséges módja a kódanalízis, kódmintaillesztés
6
Verziókezelés
Fordítás
Fejlesztés
Egység- és integrációs teszt
Kódanalízis
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égzünk
– FI mellett vagy részeként alkalmazandó
– Egy lehetséges módja a kódanalízis, kódmintaillesztés
6
Verziókezelés
Fordítás
Fejlesztés
Egység- és integrációs teszt
Kódanalízis
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égzünk
– FI mellett vagy részeként alkalmazandó
– Egy lehetséges módja a kódanalízis, kódmintaillesztés
6
Verziókezelés
Fordítás
Fejlesztés
Egység- és integrációs teszt
Kódanalízis
– Java
– FindBugs
– PMD
– CheckStyle
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égzünk
– FI mellett vagy részeként alkalmazandó
– Egy lehetséges módja a kódanalízis, kódmintaillesztés
6
Verziókezelés
Fordítás
Fejlesztés
Egység- és integrációs teszt
Kódanalízis
– Java
– FindBugs
– PMD
– CheckStyle
– JavaScript
– ESLint
– Facebook Infer, Flow
– Tern
– TAJS
– A kódanalízis időigényes folyamat
– Nagy projektekre (100k+ LOC) lassú, nem
alkalmazható FI-szerű ütemezéssel
Megoldandó probléma
7
egységteszt
kódanalízis
☼ ☆☾☆
– A kódanalízis időigényes folyamat
– Nagy projektekre (100k+ LOC) lassú, nem
alkalmazható FI-szerű ütemezéssel
– Átmeneti megoldás: tömbösítés
Megoldandó probléma
7
egységteszt
kódanalízis
☼ ☆☾☆
egységteszt
kódanalízis
– A kódanalízis időigényes folyamat
– Nagy projektekre (100k+ LOC) 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
7
egységteszt
kódanalízis
☼ ☆☾☆
egységteszt
kódanalízis
Megoldandó probléma
– Memóriakorlátba ütközhetünk...
– globális szabályok
– a struktúrát memóriában tárolva(in-memory megközelítés)
– nagy méretű kódbázisok ellenőrzésekor.
– Inkrementalitás hiánya
– Kötegelt feldolgozás
– Kisebb módosítás is teljes feldolgozást indukál
8
A bemutatott megoldás
– Inkrementalitás elvét alkalmazzuk– Kötegelt feldolgozás helyett
– A módosítás hatásával frissítjük az eredményt
– A memóriában egyszerre csak a minimálisan szükséges részleteket tároljuk
9
kódanalizátor
Δ2.-1.1.
VCS Workspace Abstact SyntaxTree
Abstract SemanticGraph
Well-formednessRules
Query Execution Database
Main.js | ++----
Dependency.js | +++++-
FIterator.js | ----
Parser.js | ++
AutomaticWell-formedness
Rule Evaluation
Manual Executionand Data Extraction
Querying and Transformation
.
discoverer
ChangeProcessor.js
CommandParser.js
FileIterator.js
iterators
DepCollector.js
FileDiscoverer.js
InitIterator.js
Main.js
whitepages
ConnectionMgr.js
DependencyMgr.js
neo4jValidation Report
<!><?>
<.>
Module
declaration
declarators
items
binding init
left right
Architektúra áttekintés
10
VCS Workspace Abstact SyntaxTree
Abstract SemanticGraph
Well-formednessRules
Query Execution Database
Main.js | ++----
Dependency.js | +++++-
FIterator.js | ----
Parser.js | ++
AutomaticWell-formedness
Rule Evaluation
Manual Executionand Data Extraction
Querying and Transformation
.
discoverer
ChangeProcessor.js
CommandParser.js
FileIterator.js
iterators
DepCollector.js
FileDiscoverer.js
InitIterator.js
Main.js
whitepages
ConnectionMgr.js
DependencyMgr.js
neo4jValidation Report
<!><?>
<.>
Module
declaration
declarators
items
binding init
left right
Architektúra áttekintés
10
VCS Workspace Abstact SyntaxTree
Abstract SemanticGraph
Well-formednessRules
Query Execution Database
Main.js | ++----
Dependency.js | +++++-
FIterator.js | ----
Parser.js | ++
AutomaticWell-formedness
Rule Evaluation
Manual Executionand Data Extraction
Querying and Transformation
.
discoverer
ChangeProcessor.js
CommandParser.js
FileIterator.js
iterators
DepCollector.js
FileDiscoverer.js
InitIterator.js
Main.js
whitepages
ConnectionMgr.js
DependencyMgr.js
neo4jValidation Report
<!><?>
<.>
Module
declaration
declarators
items
binding init
left right
Architektúra áttekintés
10
VCS Workspace Abstact SyntaxTree
Abstract SemanticGraph
Well-formednessRules
Query Execution Database
Main.js | ++----
Dependency.js | +++++-
FIterator.js | ----
Parser.js | ++
AutomaticWell-formedness
Rule Evaluation
Manual Executionand Data Extraction
Querying and Transformation
.
discoverer
ChangeProcessor.js
CommandParser.js
FileIterator.js
iterators
DepCollector.js
FileDiscoverer.js
InitIterator.js
Main.js
whitepages
ConnectionMgr.js
DependencyMgr.js
neo4jValidation Report
<!><?>
<.>
Module
declaration
declarators
items
binding init
left right
Architektúra áttekintés
10
Kódfeldolgozás lépései
21
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
Kódfeldolgozás lépései
22
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
Kódfeldolgozás lépései
23
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
Utasítások sorozata
adott nyelven formalizálva.
Kódfeldolgozás lépései
24
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
Utasítások sorozata
adott nyelven formalizálva.
Kódfeldolgozás lépései
25
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
Kódfeldolgozás lépései
26
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
token – a legrövidebb, még jelentéssel rendelkező karaktersorozat
Kódfeldolgozás lépései
27
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
token – a legrövidebb, még jelentéssel rendelkező karaktersorozat
Kódfeldolgozás lépései
28
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
Token Token típus
VAR (Keyword)
IDENTIFIER (Ident)
ASSIGN (Punctuator)
NUMBER (NumericLiteral)
DIV (Punctuator)
NUMBER (NumericLiteral)
token – a legrövidebb, még jelentéssel rendelkező karaktersorozat
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
Kódfeldolgozás lépései
13
Module
VariableDeclarationStatement
VariableDeclaration
VariableDeclarator
BindingIdentifiername = `foo`
BinaryExpressionoperator = `Div`
LiteralNumericExpressionvalue = 1.0
LiteralNumericExpressionvalue = 0.0
declaration
declarators
items
binding init
left right
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
Kódfeldolgozás lépései
13
Abstract Syntax Tree (AST)
– A tokenek sorozatának
– nyelvtani struktúrájának
– fa reprezentációja.
Module
VariableDeclarationStatement
VariableDeclaration
VariableDeclarator
BindingIdentifiername = `foo`
BinaryExpressionoperator = `Div`
LiteralNumericExpressionvalue = 1.0
LiteralNumericExpressionvalue = 0.0
declaration
declarators
items
binding init
left right
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
Kódfeldolgozás lépései
13
Module
VariableDeclarationStatement
VariableDeclaration
VariableDeclarator
BindingIdentifiername = `foo`
BinaryExpressionoperator = `Div`
LiteralNumericExpressionvalue = 1.0
LiteralNumericExpressionvalue = 0.0
declaration
declarators
items
binding init
left right
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
Kódfeldolgozás lépései
14
Module
declaration
declarators
items
binding init
left right
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
Kódfeldolgozás lépései
14
Module
declaration
declarators
items
binding init
left right
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
Kódfeldolgozás lépései
14
Module
declaration
declarators
items
binding init
left right
GlobalScope
variables
references
children
declarations
node
astNode
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
Kódfeldolgozás lépéseiAbstract Semantic Graph(ASG)
– Gráf, nem feltétlenül fa.
– Szintaktikai struktúramellett szemantikaiinformációt is hordoz.
– Tartalmazkeresztéleket →
– A részkifejezésekakár közösek is lehetnek.
14
Module
declaration
declarators
items
binding init
left right
GlobalScope
variables
references
children
declarations
node
astNode
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
Kódfeldolgozás lépései
14
Module
declaration
declarators
items
binding init
left right
GlobalScope
variables
references
children
declarations
node
astNode
AST vs ASG
15
AST vs ASG
15
Gráfmintaillesztés
16
VariableDeclarator
BindingIdentifiername = `foo`
BinaryExpressionoperator = `Div`
LNExpressionvalue = 1.0
LNExpressionvalue = 0.0
Gráfmintaillesztés
– Gráfminta
– Deklaratív,
– gráfszerű formalizmus
– feltételek kifejezésére.
16
VariableDeclarator
BindingIdentifiername = `foo`
BinaryExpressionoperator = `Div`
LNExpressionvalue = 1.0
LNExpressionvalue = 0.0
Gráfmintaillesztés
– Gráfminta
– Deklaratív,
– gráfszerű formalizmus
– feltételek kifejezésére.
16
VariableDeclarator
BindingIdentifiername = `foo`
BinaryExpressionoperator = `Div`
LNExpressionvalue = 1.0
LNExpressionvalue = 0.0
binding be
right
Gráfmintaillesztés
– Gráfminta
– Deklaratív,
– gráfszerű formalizmus
– feltételek kifejezésére.
16
VariableDeclarator
BindingIdentifiername = `foo`
BinaryExpressionoperator = `Div`
LNExpressionvalue = 1.0
LNExpressionvalue = 0.0
binding be
right
Gráfmintaillesztés
– Gráfminta
– Deklaratív,
– gráfszerű formalizmus
– feltételek kifejezésére.
16
BindingIdentifiername = `foo`
Gráfminta lekérdezésCyphernyelvennullával történő osztás keresésére
binding
Mintaillesztéseredménye
Folyamat áttekintés
17
Folyamat áttekintés
17
központiverziókezelő
rendszer
fejlesztőimunkaállomás
Git, Visual StudioCode
Folyamat áttekintés
17
központiverziókezelő
rendszer
fejlesztőimunkaállomás
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
Git, Visual StudioCode ShapeSecurityShift
Folyamat áttekintés
17
központiverziókezelő
rendszer
transzformációfejlesztői
munkaállomás
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
Git, Visual StudioCode ShapeSecurityShift Java, Cypher
Folyamat áttekintés
17
központiverziókezelő
rendszer
transzformációfejlesztői
munkaállomás
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
gráfadatbázis
Git, Visual StudioCode ShapeSecurityShift Java, Cypher Neo4j
Folyamat áttekintés
17
központiverziókezelő
rendszer
transzformációfejlesztői
munkaállomás
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
feldolgozás
gráfadatbázis
Git, Visual StudioCode ShapeSecurityShift Java, Cypher Neo4j
Folyamat áttekintés
17
központiverziókezelő
rendszer
transzformációfejlesztői
munkaállomás
tokenizer
forráskód
tokenek
AST
ASG
parser
scope analyzer
feldolgozás
gráfadatbázis
Git, Visual StudioCode ShapeSecurityShift Java, Cypher Neo4j
Felhasználás statikus analízis
– Lokális hibaminták keresése(linter hibák)
– nélküli
keresése
– Többször változtatott
– Nem használt változó
– Globális lekérdezések
– Elérhetetlen kódrészlet
– Keretrendszer
– Tetszőlegesen bővíthető
– Cégszintű szabályok
– Egyszerűbben használható(nem visitor mintás megoldás)
18
Felhasználás transzformáció
Control Flow Graph (CFG)
– A program futása során
– elérhető összes utasítássorozat
– gráf reprezentációja.
19
Felhasználás transzformáció
Control Flow Graph (CFG)
– A program futása során
– elérhető összes utasítássorozat
– gráf reprezentációja.
19
utasítás
Felhasználás transzformáció
Control Flow Graph (CFG)
– A program futása során
– elérhető összes utasítássorozat
– gráf reprezentációja.
19
utasítás
utasítás
Felhasználás transzformáció
Control Flow Graph (CFG)
– A program futása során
– elérhető összes utasítássorozat
– gráf reprezentációja.
19
utasítás
utasítás
if
Felhasználás transzformáció
Control Flow Graph (CFG)
– A program futása során
– elérhető összes utasítássorozat
– gráf reprezentációja.
19
utasítás
utasítás
if feltétel
Felhasználás transzformáció
Control Flow Graph (CFG)
– A program futása során
– elérhető összes utasítássorozat
– gráf reprezentációja.
19
utasítás
utasítás
utasítás utasítás
if feltétel
Felhasználás transzformáció
Control Flow Graph (CFG)
– A program futása során
– elérhető összes utasítássorozat
– gráf reprezentációja.
19
utasítás
utasítás
utasítás utasítás
if
utasítás
feltétel
Felhasználás transzformáció
Control Flow Graph (CFG)
– A program futása során
– elérhető összes utasítássorozat
– gráf reprezentációja.
19
utasítás
utasítás
utasítás utasítás
hiba
if
utasítás
feltétel
Felhasználás transzformáció
Control Flow Graph (CFG)
– A program futása során
– elérhető összes utasítássorozat
– gráf reprezentációja.
19
utasítás
utasítás
utasítás utasítás
utasítás
hiba
if
utasítás
feltétel
Felhasználás transzformáció
Control Flow Graph (CFG)
– A program futása során
– elérhető összes utasítássorozat
– gráf reprezentációja.
19
utasítás
utasítás
utasítás utasítás
utasítás
hiba
if
utasítás
feltétel
Felhasználás transzformáció
Control Flow Graph (CFG)
– A program futása során
– elérhető összes utasítássorozat
– gráf reprezentációja.
19
utasítás
utasítás
utasítás utasítás
utasítás
hiba
if
kész
utasítás
feltétel
hiba
Felhasználás tesztgenerálás
– Lefutási esetek vizsgálata
– Megadott feltételek mellett
– elérhető az adott utasítás?
– Melyik a legrövidebb út oda?
– Teszt paraméterek előállítása
20
utasítás
utasítás
utasítás utasítás
utasítás
if
kész
feltétel
utasítás
hiba
Felhasználás tesztgenerálás
– Lefutási esetek vizsgálata
– Megadott feltételek mellett
– elérhető az adott utasítás?
– Melyik a legrövidebb út oda?
– Teszt paraméterek előállítása
20
utasítás
utasítás
utasítás utasítás
utasítás
if
kész
feltétel
utasítás
hiba
Felhasználás tesztgenerálás
– Lefutási esetek vizsgálata
– Megadott feltételek mellett
– elérhető az adott utasítás?
– Melyik a legrövidebb út oda?
– Teszt paraméterek előállítása
20
utasítás
utasítás
utasítás utasítás
utasítás
if
kész
feltétel
utasítás
hiba
Felhasználás tesztgenerálás
– Lefutási esetek vizsgálata
– Megadott feltételek mellett
– elérhető az adott utasítás?
– Melyik a legrövidebb út oda?
– Teszt paraméterek előállítása
20
utasítás
utasítás
utasítás utasítás
utasítás
if
kész
feltétel
utasítás
hiba
Felhasználás tesztgenerálás
– Lefutási esetek vizsgálata
– Megadott feltételek mellett
– elérhető az adott utasítás?
– Melyik a legrövidebb út oda?
– Teszt paraméterek előállítása
20
utasítás
utasítás
utasítás utasítás
utasítás
if
kész
feltétel
utasítás
hiba
Felhasználás tesztgenerálás
– Lefutási esetek vizsgálata
– Megadott feltételek mellett
– elérhető az adott utasítás?
– Melyik a legrövidebb út oda?
– Teszt paraméterek előállítása
20
utasítás
utasítás
utasítás utasítás
utasítás
if
kész
feltétel
utasítás
hiba
Felhasználás tesztgenerálás
– Lefutási esetek vizsgálata
– Megadott feltételek mellett
– elérhető az adott utasítás?
– Melyik a legrövidebb út oda?
– Teszt paraméterek előállítása
20
utasítás
utasítás
utasítás utasítás
utasítás
if
kész
feltétel
utasítás
hiba
Felhasználás tesztgenerálás
– Lefutási esetek vizsgálata
– Megadott feltételek mellett
– elérhető az adott utasítás?
– Melyik a legrövidebb út oda?
– Teszt paraméterek előállítása
20
utasítás
utasítás
utasítás utasítás
utasítás
if
kész
feltétel
utasítás
hiba
Felhasználás tesztgenerálás
– Lefutási esetek vizsgálata
– Megadott feltételek mellett
– elérhető az adott utasítás?
– Melyik a legrövidebb út oda?
– Teszt paraméterek előállítása
20
utasítás
utasítás
utasítás utasítás
utasítás
if
kész
feltétel
utasítás
hiba
Felhasználás tesztgenerálás
– Lefutási esetek vizsgálata
– Megadott feltételek mellett
– elérhető az adott utasítás?
– Melyik a legrövidebb út oda?
– Teszt paraméterek előállítása
20
utasítás
utasítás
utasítás utasítás
utasítás
if
kész
feltétel
utasítás
hiba
Felhasználás tesztgenerálás
– Lefutási esetek vizsgálata
– Megadott feltételek mellett
– elérhető az adott utasítás?
– Melyik a legrövidebb út oda?
– Teszt paraméterek előállítása
20
utasítás
utasítás
utasítás utasítás
utasítás
if
kész
feltétel
utasítás
hiba
Felhasználás tesztgenerálás
– Lefutási esetek vizsgálata
– Megadott feltételek mellett
– elérhető az adott utasítás?
– Melyik a legrövidebb út oda?
– Teszt paraméterek előállítása
20
utasítás
utasítás
utasítás utasítás
utasítás
if
kész
feltétel
utasítás
Felhasználás típusanalízis
– Dinamikus nyelvek támogatása
– Python
– JavaScript / ECMAScript
21
Felhasználás típusanalízis
– Dinamikus nyelvek támogatása
– Python
– JavaScript / ECMAScript
21
http://marijnhaverbeke.nl/blog/tern.html
Felhasználás impakt analízis
– A folytonos integrációhoz igazodva
– Különböző branch-ek kezelése
– Branch-en belüli változások követése
– Fájlszintű inkrementális kiértékelés
– Fejlesztők számára differenciális visszajelzés
22
Miért Neo4j?+++
– Gyors prototipizálás
– Tranzakciók támogatása
– Fejlett tooling
--
– Nem skálázható
– Csak diszk-alapú működés
23
Észrevételek MERGE
– MATCH or CREATE
– Kényelmi szempontból nagyszerű
– Cserébe drága
– Lehetséges megoldások:
– MERGE-ök ritkítása
– Lekérdezések szétszedése
– Létrehozás, ha még nincs
– MERGE helyett MATCH
– Megelőzés
– Adatok felvételekor előkészítés
24
Észrevételek MERGE
25
3 1
Észrevételek if-then-else
– Nincs rá Cypher nyelvi elem
– Trükközéssel oldható meg
– Naggggggyon lassú
– Megoldás:
– Két kisebb, diszjunkt eset
26
Észrevételek if-then-else
– Nincs rá Cypher nyelvi elem
– Trükközéssel oldható meg
– Naggggggyon lassú
– Megoldás:
– Két kisebb, diszjunkt eset
26
Észrevételek if-then-else
27
Észrevételek if-then-else
28∞ vs 15 sec
Észrevételek if-then-else
28∞ vs 15 sec
Észrevételek elérhetőség
– A korlátozás nélküli tranzitív
lezárt nem gyors
– A mintázatra illeszkedő
tranzitív lezárt trükközéssel
megoldható
29
A B
*
Észrevételek elérhetőség
– A korlátozás nélküli tranzitív
lezárt nem gyors
– A mintázatra illeszkedő
tranzitív lezárt trükközéssel
megoldható
29
A B
*
Észrevételek elérhetőség
– A korlátozás nélküli tranzitív
lezárt nem gyors
– A mintázatra illeszkedő
tranzitív lezárt trükközéssel
megoldható
29
A B
*
Összefoglalás
– Forráskódelemző keretrendszer
– Globális hibaminták keresése
– Közel valós idejű visszajelzés
– Típusanalízis
– Tesztgenerálás
– Megközelítés dinamikus és nem dinamikus nyelvekhez
– Neo4j-t használva
– Tárolás
– Transzformáció
– Verziókezelés
– Mintaillesztés
– Metaadat-tár
30
Köszönetnyilvánítás
– Dr. Ráth István Zoltán
– Ujhelyi Zoltán
– Izsó Benedek
MTA-BME LendületKiberfizikiai RendszerekKutatócsoport
31