Как отслеживать переменную с помощью статического анализатора 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 часа. Я до сих пор не нашел ответа.
Ответы
Ответ 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();
}