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ó For loopok kiváló példák lehetnek az operator new mellett, mint a clang oldalán is http://clang.llvm.org/docs/LibASTMatchersTutorial.html Ez a dia simán elvehet példákkal 10+ percet.
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 LoopPrinter-es clang példa
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 Példa: felcserélt paraméternevek http://www.hanshq.net/clang-plugin-example.html
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