没有从宏扩展的clang ASTMatcher
clang ASTMatcher without expanded from macro
我正在使用 clang ASTMatcher 来查找在我的源代码中定义 isnan 的位置。我试图理解为什么只有三个匹配项,尽管我已将其限制为仅在主文件中匹配。请在下面找到示例源代码:
#include <math.h>
int main()
{
if(isnan(0.0)){
}
}
当我进行 clang-query 匹配时,我得到以下输出:
clang-query> match declRefExpr(isExpansionInMainFile())
Match #1:
/home/clang-llvm/code/test.cpp:6:5: note: "root" binds here
if(isnan(0.0)){
^~~~~~~~~~
/usr/include/math.h:299:9: note: expanded from macro 'isnan'
? __isnanf (x) \
^~~~~~~~
Match #2:
/home/clang-llvm/code/test.cpp:6:5: note: "root" binds here
if(isnan(0.0)){
^~~~~~~~~~
/usr/include/math.h:301:9: note: expanded from macro 'isnan'
? __isnan (x) : __isnanl (x))
^~~~~~~
Match #3:
/home/clang-llvm/code/test.cpp:6:5: note: "root" binds here
if(isnan(0.0)){
^~~~~~~~~~
/usr/include/math.h:301:23: note: expanded from macro 'isnan'
? __isnan (x) : __isnanl (x))
^~~~~~~~
3 matches.
有没有限制只匹配源代码而不限制宏的匹配?
如有任何帮助,我将不胜感激。
宏在预处理期间被视为纯文本替换,这发生在所有匹配开始之前。快速进入 math.h 给了我这个:
# define isnan(x) \
(sizeof (x) == sizeof (float) \
? __isnanf (x) \
: sizeof (x) == sizeof (double) \
? __isnan (x) : __isnanl (x))
这解释了为什么您会得到三个匹配的结果。在 运行 AST Matcher 之前,它们已经在您的主要功能中。
获取单个位置,具体取决于您的源代码。在这种特殊情况下,您可以通过将节点匹配器更改为条件运算符来实现。
clang-query> match conditionalOperator(hasFalseExpression(conditionalOperator()), isExpansionInMainFile())
Match #1:
~/test.cpp:4:8: note: "root" binds here
if(isnan(0.0)){
^~~~~~~~~~
/usr/include/math.h:254:7: note: expanded from macro 'isnan'
(sizeof (x) == sizeof (float)
\
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 match.
所以我试图匹配宏被替换后的expr。
希望对您有所帮助。
我正在使用 clang ASTMatcher 来查找在我的源代码中定义 isnan 的位置。我试图理解为什么只有三个匹配项,尽管我已将其限制为仅在主文件中匹配。请在下面找到示例源代码:
#include <math.h>
int main()
{
if(isnan(0.0)){
}
}
当我进行 clang-query 匹配时,我得到以下输出:
clang-query> match declRefExpr(isExpansionInMainFile())
Match #1:
/home/clang-llvm/code/test.cpp:6:5: note: "root" binds here
if(isnan(0.0)){
^~~~~~~~~~
/usr/include/math.h:299:9: note: expanded from macro 'isnan'
? __isnanf (x) \
^~~~~~~~
Match #2:
/home/clang-llvm/code/test.cpp:6:5: note: "root" binds here
if(isnan(0.0)){
^~~~~~~~~~
/usr/include/math.h:301:9: note: expanded from macro 'isnan'
? __isnan (x) : __isnanl (x))
^~~~~~~
Match #3:
/home/clang-llvm/code/test.cpp:6:5: note: "root" binds here
if(isnan(0.0)){
^~~~~~~~~~
/usr/include/math.h:301:23: note: expanded from macro 'isnan'
? __isnan (x) : __isnanl (x))
^~~~~~~~
3 matches.
有没有限制只匹配源代码而不限制宏的匹配?
如有任何帮助,我将不胜感激。
宏在预处理期间被视为纯文本替换,这发生在所有匹配开始之前。快速进入 math.h 给了我这个:
# define isnan(x) \
(sizeof (x) == sizeof (float) \
? __isnanf (x) \
: sizeof (x) == sizeof (double) \
? __isnan (x) : __isnanl (x))
这解释了为什么您会得到三个匹配的结果。在 运行 AST Matcher 之前,它们已经在您的主要功能中。
获取单个位置,具体取决于您的源代码。在这种特殊情况下,您可以通过将节点匹配器更改为条件运算符来实现。
clang-query> match conditionalOperator(hasFalseExpression(conditionalOperator()), isExpansionInMainFile())
Match #1:
~/test.cpp:4:8: note: "root" binds here
if(isnan(0.0)){
^~~~~~~~~~
/usr/include/math.h:254:7: note: expanded from macro 'isnan'
(sizeof (x) == sizeof (float)
\
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 match.
所以我试图匹配宏被替换后的expr。
希望对您有所帮助。