问题标签 [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.
clang - 没有从宏扩展的clang ASTmatcher
我正在使用 clang ASTMatcher 来查找我的源代码中定义 isnan 的位置。我试图理解为什么有三个匹配项,尽管我限制只在主文件中匹配。请在下面找到示例源代码:
当我进行 clang-query match 时,我得到以下输出:
无论如何限制匹配只针对源代码而不是宏?
我将不胜感激任何帮助。
clang - 如何使用 clang 工具仅解析用户定义的源文件
我正在编写一个clang工具,但我对它很陌生,所以我遇到了一个问题,我在文档中找不到(还)。
我正在使用出色的 Matchers API 来查找一些我稍后想要在 AST 中操作的节点。问题是,clang 工具实际上会解析属于源文件的所有内容,包括iostream等头文件。由于我的操作可能包括一些重构,我绝对不想触及解析器找到的每一个东西。
现在我正在通过比较我匹配的节点的源文件与 argv 中的参数来处理这个问题,但不用说,这感觉不对,因为它仍然解析所有iostream代码 - 它只是在这样做时忽略它。我简直不敢相信没有办法只告诉 ClangTool 类似:
“仅匹配位置的源文件是用户提供给此工具的内容的节点”
考虑一下,只有可以为每个源文件单独创建 AST 才有意义,但我确实需要它们彼此了解或共享上下文知识,而且我也没有找到一种方法来做到这一点。
我觉得我在这里遗漏了一些非常明显的东西。
提前致谢 :)
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)还有其他方法可以从匹配器获取源代码吗?
谢谢您的帮助。
c++ - 如何使用 clang ast 找到函数变量的父初始化?
嗨,我可以使用 ASTMatchers 匹配函数调用。但是我需要找到该函数的参数之一已被初始化的语句。我怎么做?
在上面的示例中,我找到了对的调用,strncpy
并且我需要找到len
应该指向的初始化strlen
。
有没有办法使用 Clang 来做到这一点?谢谢。
clang - 如何构建纯语法匹配查找工具?
我正在构建一个基于 ASTMatcher 的工具,我想在我的源代码上运行它:
在依赖于其他头文件的源文件上运行它会产生以下错误:
我不想在此处理中包含任何其他标头,以免我的匹配器在那些我不想处理的标头中找到内容。
我尝试传递-fsyntax_only
给该工具,但得到与上面相同的结果:
我在ASTmatcher 教程中注意到有一个clang::SyntaxOnlyAction
. 但是,我一直无法弄清楚如何MatchFinder
以及SyntaxOnlyAction
可以相互结合使用。同样,我已经能够从同一文件的命令行进行 AST 转储,没问题,所以我知道这是可能的。
是否可以配置基于 MatchFinder 的工具来遵守纯语法行为?
clang - Clang AST 匹配器:`operator()` 没有 CXXMethodDecl?
我在文件中有以下struct
定义:
使用-ast-dump -fsyntax-only
,我可以清楚地看到CXXRecordDecl
转储中引用的多个 sbanana
以及CXXMethodDecl
引用的 s operator()
:
我的MatchFinder::MatchCallback
子类正在CXXRecordDecl
for 事件中运行,但是methods()
返回一个空范围:
我错过了什么?
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,这是每个编译器在验证强制转换时必须做的事情,但对于人类来说很难编写......
c++ - FunctionDecl:如何获得函数的书面非限定 ID?
我已经能够编写一个给我FunctionDecl
实例的 Clang AST 匹配器。但是,我观察到getNameAsString
使用type-parameter-N-M
. 例如,在以下代码中:
getNameAsString
返回operator const type-parameter-0-0&
。我正在寻找的是operator const value_type&
.
如何获得函数的书面不合格 ID?
clang-ast-matchers - 具有初始化和成员函数调用的类实例的 ASTMatcher
我很难获得以下实体的 ASTMatcher。第一个是类的实例。
理想情况下,我可以有一个匹配两个实例的匹配器。
二是捕获成员函数的调用vec_add
及其隐式参数v1
和显式参数v2
。
clang - 如何使用 clang ast 匹配器匹配 typedef
我正在为 clang-tidy 编写一个检查器,它检查 int 和指针之间的转换。
例如,对于代码:
我想将其修复为:
但如果a
已经是uintptr_t
,我不修复它。
我的问题是我匹配了CStyleCastExpr
并获得了匹配结果,但是我无法获得演员表的源类型,我使用了CStyleCastExpr.getSubExpr().getType().getXXXXType()
,我得到了val
is myType
or的类型long/int
,但不是uintptr_t
。
我怎么知道val
是一种类型uintptr_t
?