无法在 clang 中dyn_cast指向 DeclRefExpr 的表达式指针

Failing to dyn_cast Expression pointer to DeclRefExpr in clang

本文关键字:DeclRefExpr 指向 表达式 指针 cast clang dyn      更新时间:2023-10-16

我正在研究 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 1n";
}
}
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] 在主函数中被引用。

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

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

你做的一切都是正确的,Clang也做到了。这里的问题是b[0](以及其他LHS)不DeclRefExprbDeclRefExprb[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.

我希望这些信息有用。与叮当一起快乐!