文章目录
translation unit
Translation Unit 可以简单理解为,一个.c的源文件,加上其包括的所有头文件及其展开(主要指经过了预处理:宏展开,移除注释等)。一个TU是编译阶段的独立单元,在链接以前,一个TU不依赖任何外部资源。
参考StackOverflow上的解答:
https://stackoverflow.com/questions/7146425/llvm-translation-unit
AST based checkers
在clang/StaticAnalyzer/Core/Checker.h中,和preStmt类似,与AST相关的有ASTCodeBody、EndOfTranslationUnit等Callback调用。
check::EndOfTranslationUnit
void checkEndOfTranslationUnit ( const TranslationUnitDecl *TU ,
AnalysisManager &AM , BugReporter &BR) const ;
第一个参数TranslationUnitDecl *TU
,即整个TU的入口。代码中一般包含声明,和函数体。如果想对函数体进行检查,同时也对声明部分进行检查,那么就使用heck::EndOfTranslationUnit
。
check::ASTCodeBody
void checkASTCodeBody ( const Decl *D,
AnalysisManager &AM , BugReporter &BR) const ;
与checkEndOfTranslationUnit不同,第一个参数Decl *D
表示一个函数的声明,而这个函数的函数体,就是heck::ASTCodeBody
查的对象。所以,check::ASTCodeBody
只会检查一个函数的函数体,即可执行的代码段。
函数体可以通过D->getBody()
获取。