Для получения триального ключа
заполните форму ниже
Team license
Enterprise license
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Бесплатная лицензия PVS-Studio для специалистов Microsoft MVP
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Мне интересно попробовать плагин на:
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте папку
Spam/Junk и нажмите на письме кнопку "Не спам".
Так Вы не пропустите ответы от нашей команды.

>
>
>
0, 1, 2, Фредди забрал Blender

0, 1, 2, Фредди забрал Blender

26 Окт 2022

Эта статья могла бы получить название "Как PVS-Studio защищает от поспешных правок кода, пример N7". Однако так именовать статьи становится скучновато. Поэтому сейчас вы узнаете, причём здесь Фредди Крюгер.

1004_Freddy_And_Blender_ru/image1.png

Все мы люди, все мы ошибаемся. Особенно когда торопимся. Программирование не является в этом смысле исключением. Мысль летит, хочется скорее зафиксировать её в коде и перейти к написанию следующего фрагмента программы, пока вся картина есть в голове. Разработчики знают, как тяжело вновь собрать в голове фрагменты пазла, чтобы продолжить писать код после того, как пришлось отвлечься. Здесь уместна вот эта картинка:

1004_Freddy_And_Blender_ru/image3.png

В общем, иногда мы торопимся при написании кода. Плюс ещё и невнимательны, когда код кажется простым. Мне кажется, перед нами ошибка, как раз возникшая из-за спешки и отсутствия последующей проверки, ведь код такой простой, там негде ошибиться.

Один из разработчиков Blender сделал коммит, который показан на первой картинке выше. Мы отследили эту ошибку с помощью PVS-Studio, и я решил написать эту очередную заметку о том, как статический анализатор помогает исправлять ляпы в коде, при условии, конечно, что его используют ;). Пишу я не про все ошибки, а только про интересные, на мой взгляд.

Некорректный код:

static void initSnapSpatial(TransInfo *t, float r_snap[3],
                            float *r_snap_precision)
{
  /* Default values. */
  r_snap[0] = r_snap[1] = 1.0f;
  r_snap[1] = 0.0f;
  *r_snap_precision = 0.1f;
  ....
}

Анализатор PVS-Studio предупреждает об аномалии, выдавая предупреждение: V519. The 'r_snap[1]' variable is assigned values twice successively. Perhaps this is a mistake. transform.c. Check lines: 1727, 1728.

Программист решил заполнить массив значениями по умолчанию, но поспешил. В результате опечатки возникает сразу две ошибки:

  • Второй элемент массива (r_snap[1]) инициализируется неправильным значением по умолчанию. Надо записать в него 1.0f, а вместо этого записывается 0.0f;
  • Третий элемент массива (r_snap[2]) вообще остаётся не инициализированным по умолчанию. Далее в этот элемент массива, быть может, будет записано другое значение, а возможно и нет. Если нет — элемент останется неинициализированным, что приведёт к неопределённому поведению.

А причём тут всё-таки Фредди? Раскрою интригу. Дело в том, что 0, 1, 2 прямо-таки притягивают ошибки. Я описывал это в статье "Ноль, один, два, Фредди заберёт тебя".

1004_Freddy_And_Blender_ru/image4.png

Обыгрывается песенка. Получается, что в этот раз Фредди пришёл за проектом Blender.

Как не допускать подобных ошибок?

  • Не спешить, даже при написании, казалось бы, простого кода;
  • Весь код, даже который выглядит простым/неинтересным, нужно проверять на code review.
  • Использовать PVS-Studio.

Да, не надо выбирать один пункт. Важны все три! Используйте всё сразу. Спасибо за внимание, и безбажного вам кода.

Предыдущие публикации:

Последние статьи:

Опрос:

Популярные статьи по теме
Holy C++

Дата: 23 Ноя 2022

Автор: Гость

В этой статье постараюсь затронуть все вещи, которые можно без зазрения совести выкинуть из С++, не потеряв ничего (кроме боли), уменьшить стандарт, нагрузку на создателей компиляторов, студентов, из…
Продление жизни временных значений в С++: рецепты и подводные камни

Дата: 01 Ноя 2022

Автор: Гость

Прочитав эту статью, вы узнаете следующее: способы, которыми можно продлить время жизни временного объекта в С++; рекомендации и подводные камни этого механизма, с которыми может столкнуться С++ прог…
Как мы баг в PVS-Studio искали или 278 Гигабайтов логов

Дата: 28 Окт 2022

Автор: Григорий Семенчев, Сергей Ларин, Филипп Хандельянц

Предлагаем вашему вниманию интересную историю о поиске бага внутри анализатора PVS-Studio. Да, мы тоже допускаем ошибки, но мы готовы засучить рукава и залезть в самую глубину "кроличьей норы".
Примеры ошибок, которые может обнаружить PVS-Studio в коде LLVM 15.0

Дата: 25 Окт 2022

Автор: Андрей Карпов

Компиляторы развиваются и выдают всё больше предупреждений. Остаются ли преимущества от использования статических анализаторов кода, таких как PVS-Studio? Да, так как анализаторы тоже развиваются. Пе…
Как PVS-Studio защищает от поспешных правок кода, пример N6

Дата: 20 Окт 2022

Автор: Владислав Столяров

Программисты часто допускают ошибки в коде по невнимательности или из-за спешки. Если вам интересно, как можно быстро находить такие ошибки, то мы рады приветствовать вас в очередной статье из цикла …

Комментарии (0)

Следующие комментарии
Unicorn with delicious cookie
Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо