无法在 clang 中dyn_cast指向 DeclRefExpr 的表达式指针
Failing to dyn_cast Expression pointer to DeclRefExpr in clang
我正在研究 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)不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
则需要手动(通过ArraySubscriptExpr
和ImplicitCastExpr
表达式)或使用RecursiveASTVisitor
.
我希望这些信息有用。与叮当一起快乐!
相关文章:
- 助记符和指向成员语法的指针
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 调整大小后指向元素值的指针unordered_map有效?
- 使用指向成员的指针将成员函数作为参数传递
- 指向指向字符数组的指针数组的指针
- 指向多维数组C++的指针
- 删除指向指针的指针是运行时错误吗
- 指向设备对象成员的指针
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 通过指向指针数组的指针访问子类的属性
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- C++,指针数组,指向双链表中的条目
- 返回的指向C++对象的链接是什么样的
- 指针没有更新它在void函数内部指向的值
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 在C++中,如何初始化指向wchar_t*的指针数组(生成wchar_t**)
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- 无法在 clang 中dyn_cast指向 DeclRefExpr 的表达式指针