Подтвердить что ты не робот

Как отслеживать переменную с помощью статического анализатора Clang?

Предположим, что я работаю со следующим фрагментом кода C:

void inc(int *num) {*num++;}
void dec(int *num) {*num--;}

void f(int var) {
    inc(&var);
    dec(&var);
}

Используя статический анализатор, я хочу узнать, не изменилось ли значение var во время выполнения функции. Я знаю, что мне нужно сохранить свое состояние самостоятельно (это точка написания проверки Clang), но у меня возникают проблемы с получением уникальной ссылки на эту переменную.

Например: если я использую следующий API

void MySimpleChecker::checkPostCall(const CallEvent &Call,
                                    CheckerContext &C) const {
    SymbolRef MyArg = Call.getArgSVal(0).getAsSymbol();
}

Я ожидаю, что он вернет указатель на это представление символа в моем контексте проверки. Тем не менее, я всегда получаю 0 в MyArg, используя его таким образом. Это происходит для функций inc и dec в предварительных и последующих обратных вызовах.

Что мне здесь не хватает? Какие понятия я сделал неправильно?

Примечание. В настоящее время я читаю Руководство по внутренним документам Clang CFE, и я прочитал отличный Как написать чекер за 24 часа. Я до сих пор не нашел ответа.

4b9b3361

Ответ 1

Я думаю, вы пропустили проверку того, что это событие вызова является вызовом вашей функции inc/dec. У вас должно быть что-то вроде

void MySimpleChecker::checkPostCall(const CallEvent &Call,
                                CheckerContext &C) const {
    const IdentifierInfo* callee = Call.getCalleeIdentifier();
    if (callee->getName().str() == "inc" || callee->getName().str() == "dec")
        SymbolRef MyArg = Call.getArgSVal(0).getAsSymbol();
}