使用libclang API编写一个函数,查找指定类型的抽象语法树祖先节点
我最近在慢慢构建一个静态分析工具,目标是检查两个函数是否触及同一份数据。它应该收集匹配指定函数名称的函数定义光标,然后遍历该函数定义并搜索属于DeclRefExpr类型的光标。这个方法的问题在于,这个DeclRefExpr的直接父级不一定是带有某种赋值操作的BinaryOperator。于是我觉得写一个函数,找到DeclRefExpr光标最近的祖先节点,它是一个带赋值操作的BinaryOperator,并检查DeclRefExpr光标是在这个BinaryOperator的左操作数还是右操作数中。我已经写了一个这样的函数,但出于某种原因它总是返回一个空光标。有人能帮助诊断为什么这个方法不工作,或者也许帮助改写成一个能工作的实现吗?(我只是用C,不用C++)
static CXCursor get_ancestor_of_kind(CXCursor cursor, enum CXCursorKind kind)
{
CXCursor super_parent = clang_getCursorSemanticParent(cursor);
while (clang_getCursorKind(super_parent) != kind) {
if (clang_Cursor_isNull(super_parent))
return super_parent;
super_parent = clang_getCursorSemanticParent(super_parent);
}
return super_parent;
}
解决方案
我阅读了不同的clang API函数定义,发现这实际上是无法实现的。clang_getCursorSemanticParent也好clang_getCursorLexicalParent也好,都无法给出光标在AST层面的直接父级。它们要么作用于声明上下文,要么作用于语句层级,这并不能提供正确的直接AST父级。一个可行的做法是遍历这些光标的根光标的所有子节点,然后保存所有目标类型的光标,再检查目标光标是否存在于这些潜在父光标之一中。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。