我需要使用clang的API来转储源代码的块活性。我试过打印块活性但没有成功。以下是我尝试过的代码
bool MyASTVisitor::VisitFunctionDecl(FunctionDecl *f) {
std::cout<<"Dump Liveness\n";
clang::AnalysisDeclContextManager adcm;
clang::AnalysisDeclContext *adc = adcm.getContext(llvm::cast<clang::Decl>(f));
//clang::LiveVariables *lv = clang::LiveVariables::create(*adc);
//clang::LiveVariables *lv = clang::LiveVariables::computeLiveness(*adc,false);
clang::LiveVariables *lv = adc->getAnalysis<LiveVariables>();
clang::LiveVariables::Observer *obs = new clang::LiveVariables::Observer();
lv->runOnAllBlocks(*obs);
lv->dumpBlockLiveness((f->getASTContext()).getSourceManager());
return true;
}
我已经覆盖了访问者功能,并尝试打印功能的活跃度。我尝试使用create,computeLiveness和getAnalysis方法来获取LiveVariables对象,但所有方法都失败了。但是,除了块编号外,不会显示实时信息。
当我使用clang的命令行参数打印活动时,它会正确显示输出。
我使用以下源代码作为Live Variable Analysis Wikipedia的测试用例
int main(int argc, char *argv[])
{
int a,b,c,d,x;
a = 3;
b = 5;
d = 4;
x = 100;
if(a>b){
c = a+b;
d = 2;
}
c = 4;
return b * d + c;
}
有人可以指出我哪里错了吗? 提前谢谢。
答案 0 :(得分:0)
我有同样的问题,经过clang -cc1 -analyze -analyzer-checker=debug.DumpLiveVars
的一些调试后,我终于找到了答案!
问题在于LiveVariables
分析本身并未探索子表达式(例如DeclRefExpr
)。它只依赖于CFG枚举。默认情况下,CFG仅枚举顶级语句。
在从adc->getCFGBuildOptions().setAllAlwaysAdd()
获取任何分析之前,您必须致电AnalysisDeclContext
。这将为control-flow-graph的CFGBlocks
中的所有子表达式创建元素。