如何找到 ValueDecl 的所有用途?

How can I find all uses of a ValueDecl?

我想拿clang AST,分析一下某个变量是怎么用的,做一些 如果识别出特定的使用模式,则进行源到源转换。 特别是,我正在寻找这样的模式:

void *h;
h = create_handler(...);
use_handler(h);
destroy_handler(h);

到目前为止,我能够检测到 ValueDecl 对应于 void *h。下一步 将找到 h 的所有用途并查看它们是否安全以及是否 create_handler/destroy_handler 正确 dominate/post-dominate 彼此。 不幸的是,我不知道如何迭代 h 的用途,似乎 ValueDecl class.

中没有这样的界面

如果你能建议我如何找到 a 的所有用途,我将不胜感激 AST 中的变量,或向我指出一些处理类似问题的基于 clang 的工具。

谢谢!

可以匹配 declRefExpr 引用变量(使用 AST 匹配器)。之后,ParentMap 可用于向后遍历 AST 并递归查找使用这些 declRefExpr 的 AST 节点。请记住,通常 ParentMap 不是为整个 AST 构造的,而是仅为子树构造的(作为参数传递给构造函数)。