Forráskódtárak gráfalapú statikus analízise

Preview:

Citation preview

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

Recommended