Дамп блока живости исходного кода с помощью Clang

Мне нужно сбросить живучесть блока исходного кода, используя API clang. Я попытался напечатать живость блока, но безуспешно. Ниже приведен код, который я пробовал

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, calculateLiveness и getAnalysis для получения объекта LiveVariables, но все подходы не увенчались успехом. Однако никакая информация о живости не отображается, кроме номеров блоков.

Когда я использую аргументы командной строки clang для печати живости, он правильно отображает вывод.

В качестве тестового примера я использую следующий исходный код, взятый из Википедия по анализу переменных в реальном времени .

    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;
}

Может кто-нибудь указать, где я могу ошибаться? Заранее спасибо.


person Mandar Shinde    schedule 22.06.2016    source источник


Ответы (1)


У меня была такая же проблема, после некоторой отладки clang -cc1 -analyze -analyzer-checker=debug.DumpLiveVars я наконец нашел ответ!

Проблема в том, что анализ LiveVariables не исследует подвыражения (например, DeclRefExpr) сам по себе. Он опирается только на перечисление CFG. По умолчанию CFG перечисляет только операторы верхнего уровня.

Вы должны позвонить adc->getCFGBuildOptions().setAllAlwaysAdd(), прежде чем получать какой-либо анализ от вашего AnalysisDeclContext. Это создаст элементы для всех подвыражений в CFGBlocks графа потока управления.

person Quentin    schedule 23.07.2016
comment
Однако это не работает для clang 3.1. Работает на Clang 3.8. - person Mandar Shinde; 25.07.2016