检索运算符

时间:2016-06-22 08:08:48

标签: ios objective-c clang abstract-syntax-tree llvm-clang

我希望使用RecursiveASTVisitor 做类似于how to get integer variable name and its value from Expr* in clang的操作

目标是先检索所有赋值操作,然后对它们执行自己的检查,进行污点分析。

我已经覆盖了VisitBinaryOperator

bool VisitBinaryOperator (BinaryOperator *bOp) {
  if ( !bOP->isAssignmentOp() ) {
    return true;
  }

  Expr *LHSexpr = bOp->getLHS();
  Expr *RHSexpr = bOp->getRHS();

  LHSexpr->dump();
  RHSexpr->dump();
}

这个RecursiveASTVisitor是在Objective C代码上运行的,所以我不知道LHS或RHS类型会评估什么(甚至可能是RHS上的函数?)

是否可以从clang中获取LHS / RHS上的内容的文本表示,以便对它们执行正则表达式?

1 个答案:

答案 0 :(得分:0)

抱歉,我发现类似的情况适用于这种特殊情况。

解决方案:

bool VisitBinaryOperator (BinaryOperator *bOp) {
  if ( !bOP->isAssignmentOp() ) {
    return true;
  }

  Expr *LHSexpr = bOp->getLHS();
  Expr *RHSexpr = bOp->getRHS();

  std::string LHS_string = convertExpressionToString(LHSexpr);
  std::string RHS_string = convertExpressionToString(RHSexpr);

  return true;
}

std::string convertExpressionToString(Expr *E) {
  SourceManager &SM = Context->getSourceManager();
  clang::LangOptions lopt;

  SourceLocation startLoc = E->getLocStart();
  SourceLocation _endLoc = E->getLocEnd();
  SourceLocation endLoc = clang::Lexer::getLocForEndOfToken(_endLoc, 0, SM, lopt);

  return std::string(SM.getCharacterData(startLoc), SM.getCharacterData(endLoc) - SM.getCharacterData(startLoc));
}

我唯一不确定的是为什么需要_endLoc来计算endLoc以及Lexer实际上是如何工作的。

修改 链接到帖子我找到了帮助Getting the source behind clang's AST