使用Clang转储阻止源代码的活动

时间:2016-06-22 12:43:11

标签: c++ clang abstract-syntax-tree clang++

我需要使用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;
}

有人可以指出我哪里错了吗? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

我有同样的问题,经过clang -cc1 -analyze -analyzer-checker=debug.DumpLiveVars的一些调试后,我终于找到了答案!

问题在于LiveVariables分析本身并未探索子表达式(例如DeclRefExpr)。它只依赖于CFG枚举。默认情况下,CFG仅枚举顶级语句。

在从adc->getCFGBuildOptions().setAllAlwaysAdd()获取任何分析之前,您必须致电AnalysisDeclContext。这将为control-flow-graph的CFGBlocks中的所有子表达式创建元素。