代码之家  ›  专栏  ›  技术社区  ›  KostasRim

clang前端:跟踪语句的读写

  •  3
  • KostasRim  · 技术社区  · 6 年前

    我正在用 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 所有潜在的不同表达形式。实际的问题是,我并不完全知道嵌套表达式的所有不同嵌套形式。有没有什么工具或方法?

    0 回复  |  直到 6 年前