Как получить объявление исходной переменной аргумента вызывающего в Clang? - PullRequest
0 голосов
/ 19 апреля 2019

Я очень новичок в лязге.Поэтому, извините, если этот вопрос звучит очень глупо.

Я пытаюсь написать простую программу проверки Clang.

У меня есть простая программа.

void function(int a)
{
   printf("%d", a);
}

main()
{      
       static int A = 0; 
       //some computation
       //How to get the source of the variable declaration of A here? 
       func(A);    
}

Моя попытка

void MyChecker::checkPreCall(const CallEvent &Call,
                                       CheckerContext &C) const {

   ParamVarDecl *VD = Call.parameters()[0];
   //this dumps the declaration of the callee function, i.e dest
   Call.parameters()[0]->dump();
   if(Call.parameters()[0]->isStaticLocal()){
        std::cout << "Static variable";
    }

}

Я пытаюсь получить объявление переменной A во время вызова func.Однако он получает объявление переменной аргумента callee;то есть дест.Как получить объявление переменной источника?

1 Ответ

1 голос
/ 02 июня 2019

Параметры являются частью объявления функции, в то время как аргументы являются частью выражения вызова.Вы можете прочитать больше об этом в этом вопросе .Документация Clang также подчеркивает эту разницу для метода parameters:

Возвращает формальные параметры вызова.

Помните, что число формальных параметров может не совпадать с числомаргументов для всех вызовов.Однако первый параметр всегда будет соответствовать значению аргумента, возвращаемого функцией getArgSVal (0).

Вместо него необходимо использовать getArgExpr .Кроме того, я хочу отметить, что любое выражение можно использовать в качестве аргументов вызова, поэтому для получения объявления переменной сначала необходимо проверить, что выражение аргумента действительно ссылается на именованное объявление (т. Е. DeclRefExpr), а затем перейти кфактическая декларация.

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

...