我正在使用clang libTooling
编写一个小工具,我想跟踪函数变量的读写。对于使用int x = 4;
的{{1}}或d = x + y;
形式的简单语句,我可以这样做。现在考虑一下此功能:
ASTMatchers
void fun(int *ptr) {
int x = 20;
int i = 2;
ptr[++i] = x + 45; //line 4 and assuming ++i is a valid index
//line 4: Reads{i, x} and writes{ptr, i}
}
的第4行将转换为:
AST
问题很简单,是否有办法跟踪每一行的所有读取/写入?对所有可能的不同表达形式尝试 | `-BinaryOperator 0x7fa5011dad78 <line:10:5, col:20> 'int' '='
| |-ArraySubscriptExpr 0x7fa5011dacc8 <col:5, col:12> '__global int' lvalue
| | |-ImplicitCastExpr 0x7fa5011dacb0 <col:5> '__global int *' <LValueToRValue>
| | | `-DeclRefExpr 0x7fa5011dac40 <col:5> '__global int *' lvalue ParmVar 0x7fa5011da238 'ptr' '__global int *'
| | `-UnaryOperator 0x7fa5011dac90 <col:9, col:11> 'int' prefix '++'
| | `-DeclRefExpr 0x7fa5011dac68 <col:11> 'int' lvalue Var 0x7fa5011daba8 'i' 'int'
| `-BinaryOperator 0x7fa5011dad50 <col:16, col:20> 'int' '+'
| |-ImplicitCastExpr 0x7fa5011dad38 <col:16> 'int' <LValueToRValue>
| | `-DeclRefExpr 0x7fa5011dacf0 <col:16> 'int' lvalue Var 0x7fa5011daaf8 'x' 'int'
| `-IntegerLiteral 0x7fa5011dad18 <col:20> 'int' 45
是不可行的。实际的问题是我不太了解嵌套表达式的所有不同嵌套形式。有工具或方法吗?