Инструменты, выполняющие статический анализ кода могут не обнаружить ошибки по следующим основным причинам:
Разберём перечисленные причины чуть подробнее. Если же вам интересно узнать, как в целом работают анализаторы кода, то предлагаем познакомиться со статьёй "Технологии, используемые в анализаторе кода PVS-Studio для поиска ошибок и потенциальных уязвимостей".
Предположим, в техническом задании было описано, что определённое значение в программе должно вычисляться по формуле "cos(x) / 2". При реализации алгоритмов программист ошибся и написал в тексте программы sin вместо cos:
y = sin(x) / 2;
Невозможно, изучая такой текст программы, узнать, что в ней есть эта ошибка. Ошибку можно найти, только зная больше о программе, чем написано в виде кода. Статический анализ здесь не сможет помочь.
Существует невообразимое количество способов совершить ошибку. Но ситуация не безнадёжна. Как правило, ошибки, которые допускают программисты, подчиняются неким закономерностям. Эти закономерности можно заметить, выделить и реализовать диагностики, которые выявят многие из этих ошибок. Другими словами, выделяются определённые паттерны ошибок. В качестве примеров можно назвать разыменование нулевого указателя, переполнение буфера, утечка ресурса и так далее.
Всегда будут появляться экзотические ошибки, которые не сумеет выявить ни один из существующих анализаторов кода. Но про это не стоит переживать. Ведь рационально в первую очередь сосредоточиться на выявлении распространённых паттернов ошибок. Затем учиться искать чуть менее частые и так далее. Таким образом, разработка любого статического анализатора — это бесконечный процесс приближения к недостижимому идеалу. Какие-то анализаторы продвинулись больше, какие-то меньше.
Команда PVS-Studio черпает вдохновение для реализации новых диагностик из следующих источников:
Одним из способов, которым пытаются обойти проблему ручного написания диагностических правил, является использование машинного обучения. Основная идея — обучить анализатор самому находить ошибки, обучив его на большом объёме открытого исходного кода. К сожалению, наша команда достаточно скептически относится к этой теме. Мы изложили своё видение в статье "Использование машинного обучения в статическом анализе исходного кода программ".
Реализация диагностик может не учитывать какие-то особенные случаи. Всегда можно написать код так, что ошибка спрячется от анализатора.
Помимо этого, возможности диагностик завязаны на другие механизмы, реализованные в анализаторе. Эти механизмы, такие как анализ потока данных, в свою очередь тоже имеют ограничения. Например, мы постоянно развиваем анализ потока данных в PVS-Studio, но это бесконечный процесс. Более того, некоторые моменты алгоритмически неразрешимы.
Дополнительные ссылки:
0