Предположим, что я работаю со следующим фрагментом кода 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 часа. Я до сих пор не нашел ответа.