0

我正在研究clang libtooling,我需要赋值操作的左侧,

所以我曾经VisitBinaryOperator(BinaryOperator *B)得到左手边,我对它做了一些研究并通过以下方式实现


bool VisitBinaryOperator(BinaryOperator *B)
{
  if(B->isAssignmentOp())
{
Expr *E = B->getLHS();
  if(const clang::DeclRefExpr *lhs =  dyn_cast<clang::DeclRefExpr>(E))
  {
    cout<< "Count 1\n";
  }
}
    return true;
}


这是我的示例程序

#define abc ab
int ab[5];
int b[10];
int main()
{
b[0] = 0;
b[1] = b[0];
abc[1] = 0;
}

对于这个程序VisitBinaryOperator函数应该进入 if 条件,因为 b[0],b[1],abc[1] 在 main 函数中被引用。

但控制不仅仅进入内部,而且我也无法调试它。

请让我知道这个问题的答案。

4

1 回答 1

1

你做的一切都是正确的,Clang 也做到了。这里的问题是b[0](以及其他LHS)不是DeclRefExpr. b是一个DeclRefExpr并且b[0]是一个ArraySubscriptExpr

如果您打印出第一个作业的 AST 子树,您将得到以下结果:

    |-BinaryOperator 0x5601f96e8a30 <line:5:3, col:10> 'int' lvalue '='
    | |-ArraySubscriptExpr 0x5601f96e89f0 <col:3, col:6> 'int' lvalue
    | | |-ImplicitCastExpr 0x5601f96e89d8 <col:3> 'int *' <ArrayToPointerDecay>
    | | | `-DeclRefExpr 0x5601f96e8968 <col:3> 'int [10]' lvalue Var 0x5601f96e87f0 'b' 'int [10]'
    | | `-IntegerLiteral 0x5601f96e8988 <col:5> 'int' 0
    | `-IntegerLiteral 0x5601f96e8a10 <col:10> 'int' 0

因此,如果您想获得,则DeclRefExpr需要手动(通过ArraySubscriptExprImplicitCastExpr表达式)或使用RecursiveASTVisitor.

我希望这些信息有用。与 Clang 一起愉快地黑客攻击!

于 2019-11-01T09:51:02.297 回答