﻿# Отсутствие срабатываний статического анализатора кода \(false\-negative results\)

Инструменты, выполняющие [статический анализ кода](https://pvs-studio.ru/ru/blog/terms/0046/) могут не обнаружить ошибки по следующим основным причинам:

1. Ошибка является высокоуровневой, и её обнаружение невозможно на уровне анализа исходного кода\.
1. Разработчики не знают о соответствующем паттерне ошибок или не успели реализовать его поиск в анализаторе\.
1. Недостатки реализации определённых алгоритмов для поиска ошибок\.

Разберём перечисленные причины чуть подробнее\. Если же вам интересно узнать, как в целом работают анализаторы кода, то предлагаем познакомиться со статьёй "[Технологии, используемые в анализаторе кода PVS\-Studio для поиска ошибок и потенциальных уязвимостей](https://pvs-studio.ru/ru/blog/posts/cpp/0592/)"\.

## Высокоуровневые ошибки

Предположим, в техническом задании было описано, что определённое значение в программе должно вычисляться по формуле "cos\(x\) / 2"\. При реализации алгоритмов программист ошибся и написал в тексте программы sin вместо cos:

```cpp
y = sin(x) / 2;
```

Невозможно, изучая такой текст программы, узнать, что в ней есть эта ошибка\. Ошибку можно найти, только зная больше о программе, чем написано в виде кода\. Статический анализ здесь не сможет помочь\.

## В инструменте нет соответствующей диагностики

Существует невообразимое количество способов совершить ошибку\. Но ситуация не безнадёжна\. Как правило, ошибки, которые допускают программисты, подчиняются неким закономерностям\. Эти закономерности можно заметить, выделить и реализовать диагностики, которые выявят многие из этих ошибок\. Другими словами, выделяются определённые паттерны ошибок\. В качестве примеров можно назвать разыменование нулевого указателя, переполнение буфера, утечка ресурса и так далее\.

Всегда будут появляться экзотические ошибки, которые не сумеет выявить ни один из существующих анализаторов кода\. Но про это не стоит переживать\. Ведь рационально в первую очередь сосредоточиться на выявлении распространённых паттернов ошибок\. Затем учиться искать чуть менее частые и так далее\. Таким образом, разработка любого статического анализатора — это бесконечный процесс приближения к недостижимому идеалу\. Какие\-то анализаторы продвинулись больше, какие\-то меньше\. 

Команда PVS\-Studio черпает вдохновение для реализации новых диагностик из следующих источников:

1. Свой собственный опыт\.
1. Книги, статьи, презентации\.
1. Письма пользователей \(кстати, если у вас есть идея для новой диагностики, то мы будем рады если вы её нам [пришлёте](https://pvs-studio.ru/ru/about-feedback/?is_question_form_open=true)\)\.
1. Обсуждение на таких сайтах, как Stack Overflow\.
1. И так далее\. Интересный [пример](https://pvs-studio.ru/ru/blog/posts/cpp/0814/)\.

Одним из способов, которым пытаются обойти проблему ручного написания диагностических правил, является использование машинного обучения\. Основная идея — обучить анализатор самому находить ошибки, обучив его на большом объёме открытого исходного кода\. К сожалению, наша команда достаточно скептически относится к этой теме\. Мы изложили своё видение в статье "[Использование машинного обучения в статическом анализе исходного кода программ](https://pvs-studio.ru/ru/blog/posts/0706/)"\.

## Недостатки реализации

Реализация диагностик может не учитывать какие\-то особенные случаи\. Всегда можно написать код так, что ошибка спрячется от анализатора\.

Помимо этого, возможности диагностик завязаны на другие механизмы, реализованные в анализаторе\. Эти механизмы, такие как [анализ потока данных](https://pvs-studio.ru/ru/blog/terms/7004/), в свою очередь тоже имеют ограничения\. Например, мы постоянно [развиваем анализ потока данных](https://pvs-studio.ru/ru/blog/posts/cpp/0824/) в PVS\-Studio, но это бесконечный процесс\. Более того, некоторые моменты алгоритмически неразрешимы\.

**Дополнительные ссылки:**

1. [Ложноположительные срабатывания статического анализатора кода](https://pvs-studio.ru/ru/blog/terms/6461/)\.
1. [Философия статического анализатора PVS\-Studio](https://pvs-studio.ru/ru/blog/posts/0516/)\.
1. [Почему PVS\-Studio не предлагает автоматические правки кода](https://pvs-studio.ru/ru/blog/posts/cpp/0776/)\.
1. [Что нельзя найти с помощью статического анализа](https://pvs-studio.ru/ru/blog/posts/1037/)\.