我正在用
clang libTooling
我想跟踪函数变量的读写。我可以这样做的简单声明的形式
int x = 4;
或
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
问题很简单,有没有办法跟踪每一行的所有读/写操作?尝试一个
ASTMatcher
所有潜在的不同表达形式。实际的问题是,我并不完全知道嵌套表达式的所有不同嵌套形式。有没有什么工具或方法?