Сбой dyn_cast Выражение указателя на DeclRefExpr в clang - PullRequest
0 голосов
/ 31 октября 2019

Я работаю над Clang libtooling, мне нужна левая часть операции присваивания,

Так что я использовал VisitBinaryOperator(BinaryOperator *B), чтобы получить левую часть, я провел некоторые исследования и реализовал вследующим образом


bool VisitBinaryOperator(BinaryOperator *B)
{
  if(B->isAssignmentOp())
{
Expr *E = B->getLHS();
  if(const clang::DeclRefExpr *lhs =  dyn_cast<clang::DeclRefExpr>(E))
  {
    cout<< "Count 1\n";
  }
}
    return true;
}


Это мой пример программы

#define abc ab
int ab[5];
int b[10];
int main()
{
b[0] = 0;
b[1] = b[0];
abc[1] = 0;
}

Для этой программы VisitBinaryOperator функция должна идти внутри условия if, как b [0], b [1],abc [1] упоминается в основной функции.

Но управление не входит только внутрь, и я также не могу его отладить.

Пожалуйста, дайте мне знать ответ на этот вопрос.

1 Ответ

0 голосов
/ 01 ноября 2019

Вы сделали все правильно, и Clang сделал это также. Проблема здесь в том, что b[0] (и другие LHS с) также не DeclRefExpr. b - это DeclRefExpr, а b[0] - это ArraySubscriptExpr.

Если вы распечатаете поддерево AST для первого назначения, вот что вы получите:

    |-BinaryOperator 0x5601f96e8a30 <line:5:3, col:10> 'int' lvalue '='
    | |-ArraySubscriptExpr 0x5601f96e89f0 <col:3, col:6> 'int' lvalue
    | | |-ImplicitCastExpr 0x5601f96e89d8 <col:3> 'int *' <ArrayToPointerDecay>
    | | | `-DeclRefExpr 0x5601f96e8968 <col:3> 'int [10]' lvalue Var 0x5601f96e87f0 'b' 'int [10]'
    | | `-IntegerLiteral 0x5601f96e8988 <col:5> 'int' 0
    | `-IntegerLiteral 0x5601f96e8a10 <col:10> 'int' 0

В результате, если вы хотите получить DeclRefExpr, вам нужно либо добраться туда вручную (с помощью выражений ArraySubscriptExpr и ImplicitCastExpr), либо с помощью RecursiveASTVisitor.

Я надеюсь, что этоинформация полезнаСчастливого взлома с Clang!

...