Инструменты статического анализа кода прошли долгий путь.
Это совсем не те «линтеры», которые активно использовались 20 лет назад. Однако многие по-прежнему относятся к ним как к очень простым инструментам.
Это позор.
Обидно и за методологию анализа кода в целом, и за инструмент PVS-Studio.
Поводом для некоторой грусти стал комментарий к одной из наших статей.
В этой статье было написано, что анализатор обнаруживает опечатку, выдавая предупреждение следующему коду:
Анализатор говорит, что второе условие всегда истинно.if (A[0] == 0) { X = Y; if (A[0] == 0) .
}
И действительно, если изучить тело функции, то станет ясно, что необходимо проверить еще один элемент массива.
Был получен комментарий примерно такого содержания:
Да, здесь анализатор показывает ошибку.Я расстроен.Но в целом это предупреждение ложно.
Ведь между двумя одинаковыми проверками значение элемента может измениться, и тогда вторая проверка будет иметь смысл.
Программисты до сих пор считают, что анализаторы кода построены на регулярных выражениях.
Мол, нашли два одинаковых вложенных если и мы клянемся.
Естественно, любой современный статический анализатор отслеживает изменения значений переменных.
Если переменная не изменится, будет сообщение.
Если он изменится, сообщения не будет. Для этого используется технология анализа потоков данных.
Именно это и делает статический анализатор PVS-Studio. Давайте посмотрим на следующий синтетический пример: char get();
int foo(char *p, bool arg)
{
if (p[1] == 1)
{
if (arg)
p[0] = get();
if (p[1] == 1) // Warning
return 1;
}
if (p[2] == 2)
{
if (arg)
p[2] = get();
if (p[2] == 2) // Ok
return 2;
}
return 3;
}
Код содержит два одинаковых блока.
В одном тестируемая переменная не меняется, а во втором — меняется.
Поэтому анализатор проблемы предупреждение только для первого блока: V547 Выражение 'p[1] == 1' всегда истинно.
Программистам не о чем беспокоиться.
Современные инструменты являются продвинутыми и выдают предупреждения только для действительно подозрительного кода.
Ложные срабатывания бывают, но, как правило, они связаны с наличием запутанного кода, разобраться в котором бывает сложно даже человеку.
- Примеры ошибок, обнаруженных с помощью диагностики V547 .
- Статический анализ и регулярные выражения (почему это плохая идея :).
- Технологии, используемые в анализаторе кода PVS-Studio для поиска ошибок и потенциальных уязвимостей .
Если вы хотите поделиться этой статьей с англоязычной аудиторией, воспользуйтесь ссылкой для перевода: Андрей Карпов.
Неутешительные мнения о статических анализаторах .
Теги: #программирование #C++ #c #статический анализ кода #pvs-studio #статический анализатор кода
-
Как Исправить Код Ошибки Windows 0X803F7001?
19 Oct, 24 -
Шаги По Созданию Плана Интернет-Маркетинга
19 Oct, 24 -
Взрыв Обмена Трафиком
19 Oct, 24 -
Вкладки Под Адресной Строкой В Ie9
19 Oct, 24