О пользе статического анализатора кода при написании программ

Аватар Иван Бирюков
Отредактировано

7К открытий7К показов
О пользе статического анализатора кода при написании программ

Многие программисты при написании кода совершают ошибки, и каким бы по размеру ни был проект, от незнания особенностей той или иной функции и невнимательности не застрахован никто. Для таких случаев и были созданы статические анализаторы кода. Существует много различных анализаторов, но сегодня будет рассмотрен PVS-Studio. 

PVS-Studio — это инструмент для выявления ошибок в исходном коде программ, написанных на языках С, C++ и C#. Анализатор доступен программистам, которые привыкли работать как в ОС Windows в среде Visual Studio, так и в Linux, где его можно встраивать в любую среду разработки за счет формата вывода, аналогичного оному у компилятора.

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

Команда PVS-Studio нашла уже более 10 000 ошибок в различных по величине проектах, среди которых есть много известных, например: Unreal Engine, React OS, Unity 3D, CryEngine 5, Open JDK, Serious Engine, GCC, Mono и многие другие.

Некоторые баги были незначительны и жили в проверенных проектах годами. А другие — очень грубые, от них волосы встают дыбом и невольно думаешь, как программисты могли допустить такое?!

Ошибка в компиляторе GCC:

			static bool
dw_val_equal_p (dw_val_node *a, dw_val_node *b)
{
  ....
  case dw_val_class_vms_delta:
    return (!strcmp (a->v.val_vms_delta.lbl1,
                     b->v.val_vms_delta.lbl1)
            && !strcmp (a->v.val_vms_delta.lbl1,
                        b->v.val_vms_delta.lbl1));
  ....
}
		

Предупреждение PVS-Studio: V501 There are identical sub-expressions ‘!strcmp(a->v.val_vms_delta.lbl1, b->v.val_vms_delta.lbl1)’ to the left and to the right of the ‘&&’ operator. dwarf2out.c 1428

Ошибка из проекта Mono:

			static bool AreEqual (VisualStyleElement value1,
                      VisualStyleElement value2)
{
  return
    value1.ClassName == value1.ClassName && // <=
    value1.Part == value2.Part &&
    value1.State == value2.State;
}
		

Предупреждение PVS-Studio: V3001 There are identical sub-expressions ‘value1.ClassName’ to the left and to the right of the ‘==’ operator. ThemeVisualStyles.cs 2141

В обоих приведённых фрагментах кода серьезные ошибки возникают из-за обыкновенных опечаток. В результате, в GCC два раза выполняется одинаковая проверка строки lbl1, а про строку lbl2 забыли. А в Mono имя класса сравнивается само с собой.

Анализатор PVS-Studio с легкостью справляется с такими проблемами. Причем, если раньше пользоваться им можно было только в среде Visual Studio под Windows, то теперь разработчики выпустили новую версию продукта PVS-Studio for Linux.

В новой версии для операционных систем GNU/Linux PVS-Studio, помимо непосредственно нативной версии самого анализатора, предлагает удобные варианты интеграции в проекты, использующие для сборки CMake и QMake, и отображение результатов анализа в средах разработки QtCreator и CLion. Продукт доступен в виде .deb, .rpm или .tgz пакетов. В скором времени разработчики планируют запустить собственные репозитории для удобного автообновления инструмента.

В Visual Studio анализатор интегрируется в виде плагина и в фоновом режиме может выполнять анализ измененных файлов после их компиляции. PVS-Studio диагностирует потенциальные ошибки в трёх основных группах: общего назначения, оптимизации и 64-битные ошибки. Набор правил общего назначения позволяет обнаружить логические ошибки, опечатки, фрагменты кода, приводящие к access violation, некорректное использование алгоритмов из библиотеки STL и многое другое.

Самый лучший способ увидеть пользу от использования анализатора — проверить с его помощью собственные проекты. Скачать обе версии продукта можно с официального сайта.

Следите за новыми постами
Следите за новыми постами по любимым темам
7К открытий7К показов