我希望使用RecursiveASTVisitor 3>做类似于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上的内容的文本表示,以便对它们执行正则表达式?
答案 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