问题标签 [clang-ast-matchers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
529 浏览

clang - 没有从宏扩展的clang ASTmatcher

我正在使用 clang ASTMatcher 来查找我的源代码中定义 isnan 的位置。我试图理解为什么有三个匹配项,尽管我限制只在主文件中匹配。请在下面找到示例源代码:

当我进行 clang-query match 时,我得到以下输出:

无论如何限制匹配只针对源代码而不是宏?

我将不胜感激任何帮助。

0 投票
1 回答
487 浏览

clang - 如何使用 clang 工具仅解析用户定义的源文件

我正在编写一个clang工具,但我对它很陌生,所以我遇到了一个问题,我在文档中找不到(还)。

我正在使用出色的 Matchers API 来查找一些我稍后想要在 AST 中操作的节点。问题是,clang 工具实际上会解析属于源文件的所有内容,包括iostream等头文件。由于我的操作可能包括一些重构,我绝对不想触及解析器找到的每一个东西。

现在我正在通过比较我匹配的节点的源文件与 argv 中的参数来处理这个问题,但不用说,这感觉不对,因为它仍然解析所有iostream代码 - 它只是在这样做时忽略它。我简直不敢相信没有办法只告诉 ClangTool 类似:

“仅匹配位置的源文件是用户提供给此工具的内容的节点”

考虑一下,只有可以为每个源文件单独创建 AST 才有意义,但我确实需要它们彼此了解或共享上下文知识,而且我也没有找到一种方法来做到这一点。

我觉得我在这里遗漏了一些非常明显的东西。

提前致谢 :)

0 投票
1 回答
1151 浏览

clang - 如何使用 clang 从行号获取源文本?

我正在使用 clang 匹配器来获取结果节点。从结果节点中,我可以得到行号,让我们说 17。现在,我想获得该行中的整个源代码。请帮忙。

让我详细解释一下。我有一个 clang 匹配器,可以在源代码中找到浮动文字。例如第 17 行,sr = 2.0 * rt_urand_Upu32_Yd_f_pw_snf(u);是源代码,那么它匹配 2.0。这是我的匹配器:

从匹配器中,我可以获得匹配的节点。我能够检索行号(第 17 行)和列号(6)。请在下面找到我的代码:

现在,如果我尝试检索源代码,我只会得到部分数据。在网上做了一些研究后,我尝试通过两种方式检索源代码。第一种方法是使用词法分析器,请找到以下代码:

第二种方法是使用重写器,请找到以下代码:

据我了解,似乎我需要从第 17 行的第 0 列到第 17 行的列末尾的源范围。AST 匹配器仅匹配特定节点,所以我的问题是:

1) 是否可以获得第 17 行的最终列号?

2)还有其他方法可以从行号获取源代码吗?

3)还有其他方法可以从匹配器获取源代码吗?

谢谢您的帮助。

0 投票
0 回答
84 浏览

c++ - 如何使用 clang ast 找到函数变量的父初始化?

嗨,我可以使用 ASTMatchers 匹配函数调用。但是我需要找到该函数的参数之一已被初始化的语句。我怎么做?

在上面的示例中,我找到了对的调用,strncpy并且我需要找到len应该指向的初始化strlen

有没有办法使用 Clang 来做到这一点?谢谢。

0 投票
0 回答
143 浏览

clang - 如何构建纯语法匹配查找工具?

我正在构建一个基于 ASTMatcher 的工具,我想在我的源代码上运行它:

在依赖于其他头文件的源文件上运行它会产生以下错误:

我不想在此处理中包含任何其他标头,以免我的匹配器在那些我不想处理的标头中找到内容。

我尝试传递-fsyntax_only给该工具,但得到与上面相同的结果:

我在ASTmatcher 教程中注意到有一个clang::SyntaxOnlyAction. 但是,我一直无法弄清楚如何MatchFinder以及SyntaxOnlyAction可以相互结合使用。同样,我已经能够从同一文件的命令行进行 AST 转储,没问题,所以我知道这是可能的。

是否可以配置基于 MatchFinder 的工具来遵守纯语法行为?

0 投票
1 回答
206 浏览

clang - Clang AST 匹配器:`operator()` 没有 CXXMethodDecl?

我在文件中有以下struct定义:

使用-ast-dump -fsyntax-only,我可以清楚地看到CXXRecordDecl转储中引用的多个 sbanana以及CXXMethodDecl引用的 s operator()

我的MatchFinder::MatchCallback子类正在CXXRecordDeclfor 事件中运行,但是methods()返回一个空范围:

我错过了什么?

0 投票
0 回答
176 浏览

c++ - 给定 A 类和 B 类的两个 CXXRecordDecl,是否有一种简单的方法可以查看 A 是否可以隐式转换为 B?

X: 试图编写一个内部的 clang tidy 工具来查找一个包含两种类型 ( A, B) 的表达式,然后抛出 if const A&is 隐式转换为B?

鉴于我可以找到两个CXXRecordDecl类,我可以轻松检测是否A可以隐式转换为B

我曾考虑过遍历构造函数,但如果 B 提供强制转换运算符,那将不包括在内。我可以走过他们两个,但我敢肯定还有更多我在这里遗漏的案例(比如外部定义的强制转换运算符)。基本上我想检测是否std::is_convertible<const B&, A>::value会返回 true,这是每个编译器在验证强制转换时必须做的事情,但对于人类来说很难编写......

0 投票
0 回答
66 浏览

c++ - FunctionDecl:如何获得函数的书面非限定 ID?

我已经能够编写一个给我FunctionDecl实例的 Clang AST 匹配器。但是,我观察到getNameAsString使用type-parameter-N-M. 例如,在以下代码中:

getNameAsString返回operator const type-parameter-0-0&。我正在寻找的是operator const value_type&.

如何获得函数的书面不合格 ID?

0 投票
1 回答
99 浏览

clang-ast-matchers - 具有初始化和成员函数调用的类实例的 ASTMatcher

我很难获得以下实体的 ASTMatcher。第一个是类的实例。

理想情况下,我可以有一个匹配两个实例的匹配器。

二是捕获成员函数的调用vec_add及其隐式参数v1和显式参数v2

0 投票
1 回答
417 浏览

clang - 如何使用 clang ast 匹配器匹配 typedef

我正在为 clang-tidy 编写一个检查器,它检查 int 和指针之间的转换。

例如,对于代码:

我想将其修复为:

但如果a已经是uintptr_t,我不修复它。

我的问题是我匹配了CStyleCastExpr并获得了匹配结果,但是我无法获得演员表的源类型,我使用了CStyleCastExpr.getSubExpr().getType().getXXXXType(),我得到了valis myTypeor的类型long/int,但不是uintptr_t

我怎么知道val是一种类型uintptr_t