Clang front end: отслеживание операций чтения и записи заявления - PullRequest
0 голосов
/ 05 июля 2018

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

...