Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
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