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

Post on 09-Aug-2020

1 views 0 download

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

Clang tooling

Miért?

Analízis

Automatikus hibajavítás

Automatikus refaktorálás

Instrumentálás

...

Miért clang?

További lehetőségek:

GCC

GCC-MELT

???

Lehetőségek

Preprocesszor

AST bejárás

Forráskód-transzformáció

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

Lehetőségek

Preprocesszor

AST bejárás

Forráskód-transzformáció

Kódmosítás (LLVM!)

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...

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

B: Compilation database

Fordítás során elmenthető

CMake: kapcsoló

Bear

A clang-toolok alapja

[

{

“directory”: “/home/…”,

“command”: “clang++… “,

“file”: “example.cc”,

}

]

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

AST query – C++

using namespace clang::ast_matchers;

mMatcher.addMatcher(

callExpr(

callee(

functionDecl(hasName(“operator new”)),

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

)

)

)

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ó

RefactoringTool

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

Minimális kóddal használható

Önálló tool

Ó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)

ClangTool

Ha nem akarunk módosítani, csak elemezni

Nagyon hasonló a RefactoringTool-hoz

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

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

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