Я пишу небольшой инструмент, используя 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
каждой из всех потенциально различных форм выражения. Фактическая проблема заключается в том, что я действительно не знаю всех различных вложенных форм вложенных выражений. Есть ли инструмент или метод для этого?