Clang tooling - gsd.web.elte.hu · A: Plugin, fordítás közben Ideális, ha: elemzünk, plusz...

17
Clang tooling

Transcript of Clang tooling - gsd.web.elte.hu · A: Plugin, fordítás közben Ideális, ha: elemzünk, plusz...

Page 1: Clang tooling - gsd.web.elte.hu · A: Plugin, fordítás közben Ideális, ha: elemzünk, plusz hibákat / figyelmeztetéseket jelzünk Nem annyira: Forráskódot módosítunk Nem

Clang tooling

Page 2: Clang tooling - gsd.web.elte.hu · A: Plugin, fordítás közben Ideális, ha: elemzünk, plusz hibákat / figyelmeztetéseket jelzünk Nem annyira: Forráskódot módosítunk Nem

Miért?

Analízis

Automatikus hibajavítás

Automatikus refaktorálás

Instrumentálás

...

Page 3: Clang tooling - gsd.web.elte.hu · A: Plugin, fordítás közben Ideális, ha: elemzünk, plusz hibákat / figyelmeztetéseket jelzünk Nem annyira: Forráskódot módosítunk Nem

Miért clang?

További lehetőségek:

GCC

GCC-MELT

???

Page 4: Clang tooling - gsd.web.elte.hu · A: Plugin, fordítás közben Ideális, ha: elemzünk, plusz hibákat / figyelmeztetéseket jelzünk Nem annyira: Forráskódot módosítunk Nem

Lehetőségek

Preprocesszor

AST bejárás

Forráskód-transzformáció

Kód instrumentálás (LLVM!)

Page 5: Clang tooling - gsd.web.elte.hu · A: Plugin, fordítás közben Ideális, ha: elemzünk, plusz hibákat / figyelmeztetéseket jelzünk Nem annyira: Forráskódot módosítunk Nem

Lehetőségek

Preprocesszor

AST bejárás

Forráskód-transzformáció

Kódmosítás (LLVM!)

Page 6: Clang tooling - gsd.web.elte.hu · A: Plugin, fordítás közben Ideális, ha: elemzünk, plusz hibákat / figyelmeztetéseket jelzünk Nem annyira: Forráskódot módosítunk Nem

Elemezzük, de mit is?

C++: ha vannak forrásfájljaink, az még nem elegnedő információ...

Kell még

fordítási egységek

a fordítónak átadott makrók

a fordítást befolyásoló opciók

Van: sok, teljesen különböző make tool...

Page 7: Clang tooling - gsd.web.elte.hu · A: Plugin, fordítás közben Ideális, ha: elemzünk, plusz hibákat / figyelmeztetéseket jelzünk Nem annyira: Forráskódot módosítunk Nem

A: Plugin, fordítás közben

Ideális, ha:

elemzünk,

plusz hibákat / figyelmeztetéseket jelzünk

Nem annyira:

Forráskódot módosítunk

Nem annyiszor akarjuk futtatni, ahányszor fordítunk

Page 8: Clang tooling - gsd.web.elte.hu · A: Plugin, fordítás közben Ideális, ha: elemzünk, plusz hibákat / figyelmeztetéseket jelzünk Nem annyira: Forráskódot módosítunk Nem

B: Compilation database

Fordítás során elmenthető

CMake: kapcsoló

Bear

A clang-toolok alapja

[

{

“directory”: “/home/…”,

“command”: “clang++… “,

“file”: “example.cc”,

}

]

Page 9: Clang tooling - gsd.web.elte.hu · A: Plugin, fordítás közben Ideális, ha: elemzünk, plusz hibákat / figyelmeztetéseket jelzünk Nem annyira: Forráskódot módosítunk Nem

AST dump

clang –Xclang –ast-dump –fsyntax-only test.cpp

Megmutatja, hogy néz ki az AST

Ideális tervezéshez, egyszerű példákon

Page 10: Clang tooling - gsd.web.elte.hu · A: Plugin, fordítás közben Ideális, ha: elemzünk, plusz hibákat / figyelmeztetéseket jelzünk Nem annyira: Forráskódot módosítunk Nem

AST query – C++

using namespace clang::ast_matchers;

mMatcher.addMatcher(

callExpr(

callee(

functionDecl(hasName(“operator new”)),

hasAncestor(staticCastExpr().bind(“castE”)

)

)

)

Page 11: Clang tooling - gsd.web.elte.hu · A: Plugin, fordítás közben Ideális, ha: elemzünk, plusz hibákat / figyelmeztetéseket jelzünk Nem annyira: Forráskódot módosítunk Nem

AST query – clang-query

clang-query test.cpp –

set output diag;

match <expression>

Gyorsabb, mint sokszor lefordítani a matchert

Az API akár C++-ból is használható

Page 12: Clang tooling - gsd.web.elte.hu · A: Plugin, fordítás közben Ideális, ha: elemzünk, plusz hibákat / figyelmeztetéseket jelzünk Nem annyira: Forráskódot módosítunk Nem

RefactoringTool

Forráskód egyszerű módosításra

Minimális kóddal használható

Önálló tool

Page 13: Clang tooling - gsd.web.elte.hu · A: Plugin, fordítás közben Ideális, ha: elemzünk, plusz hibákat / figyelmeztetéseket jelzünk Nem annyira: Forráskódot módosítunk Nem

Óvatosan...

A Rewriter bármit módosíthat, amihez van írásjogunk

Akár az STL headerjeit is!

Egy fájl több fordítási egység része is lehet

Akár különböző makrókkal is!

Ha hozzáadunk, csak óvatosan!(One Definition Rule)

Page 14: Clang tooling - gsd.web.elte.hu · A: Plugin, fordítás közben Ideális, ha: elemzünk, plusz hibákat / figyelmeztetéseket jelzünk Nem annyira: Forráskódot módosítunk Nem

ClangTool

Ha nem akarunk módosítani, csak elemezni

Nagyon hasonló a RefactoringTool-hoz

Page 15: Clang tooling - gsd.web.elte.hu · A: Plugin, fordítás közben Ideális, ha: elemzünk, plusz hibákat / figyelmeztetéseket jelzünk Nem annyira: Forráskódot módosítunk Nem

ASTConsumer

Tetszőleges, az AST alapján történő munkára

Például: RecursiveASTVisitor

Összetettebb, ritkább esetekre

Általában a magasabb szintű API egyszerűbb

Page 16: Clang tooling - gsd.web.elte.hu · A: Plugin, fordítás közben Ideális, ha: elemzünk, plusz hibákat / figyelmeztetéseket jelzünk Nem annyira: Forráskódot módosítunk Nem

WrapperAction

FixItRecompile: automatikusan javítsuk ki a fordítási hibát, és próbáljuk újra...

Vagy bármikor, amikor pluginként módosítani akarjuk a forráskódot

Page 17: Clang tooling - gsd.web.elte.hu · A: Plugin, fordítás közben Ideális, ha: elemzünk, plusz hibákat / figyelmeztetéseket jelzünk Nem annyira: Forráskódot módosítunk Nem

Kérdések?KÖSZÖNÖM A FIGYELMET