TGViewer
Бестиарий программирования Бестиарий программирования @programming_tales · 1.14K subscribers
Post #520 1.03K
Про помощь пользователям, чтобы они помогли анализатору или про ошибки при поиске ошибок :)

Анализатор сложный, полезный, но ограниченный инструмент. Кроме простых случаев, он не может распознать высокоуровневый замысел и назначение пользовательских сущностей. Особенно, если не видит их реализацию.

Другими словами, PVS-Studio понимает, что вот такая функция xx_free это прослойка и по сути является вызовом функции free:
void xx_free(void *p)
{
free(p);
}

int main()
{
int *p = (int *)malloc(sizeof(int));
if (p == NULL)
return 1;
*p = 1;
xx_free(p);
xx_free(p);
return 0;
}

Сообщение PVS-Studio: V586 The 'xx_free' function is called twice for deallocation of the same memory space. Inspect the first argument. Check lines: 14, 15.

Однако, анализатор легко запутать или спрятать от него содержимое xx_free. В этом случае на помощь приходит механизм аннотаций. Можно подсказать анализатору, что xx_free это, по сути, free.

Таким образом, если помочь анализатору, он поможет вам выявить больше ошибок. См. раздел "Как разметить пары аллокаторов/деаллокаторов" на странице документации "Аннотирование C и C++ кода в формате JSON".

Бывает нужно подсказать информацию не только про функции, но и про классы. Такой механизм в PVS-Studio тоже есть. Вернее, кхм... он как бы есть, но оказывается не всегда работает. Спасибо клиенту, который указал нам на баг в анализаторе. Оказывается, не срабатывает разметка классов, как аналогов std::shared_ptr.
foo main()
{
// Нет срабатывания, если проаннотировать XPtr как shared_ptr
XPtr<Data> pData;
printf("Identifier = %lld", pData->GetUniqueID());


// Есть предупреждение про разыменование нулевого указателя
std::shared_ptr<Data> pData2;
printf("Identifier = %lld", pData2->GetUniqueID()); // V522
}

Чиним. Правка должна войти в первый релиз 2026 года.

Итог. Прошу не забывать про механизмы аннотаций. Они могут помочь улучшить качество, глубину и точность анализа. А если что-то идёт не так, просим писать нам в поддержку.
  • 👍 8
More from @programming_tales
  1. Oct 2, 2026Запись вебинара: Go vet не поможет... Как сделать свой анализатор кода для Go?
  2. Oct 2, 2026В целях нетворкинга и просто так приглашаю коннектиться в TenChat — что-то типа LinkedIn.…
  3. Sep 29, 2026Сегодня коллега демонстрирует, как визуально проявляют себя баги в Java коде: Нашёл ошибки…
  4. Sep 29, 2026photo post
  5. Sep 28, 2026На днях выступал с докладом на форуме "Безопасность транспортных средств", организованном…
  6. Sep 28, 2026photo post
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →