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

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

![1004_Freddy_And_Blender_ru/image2.png](https://import.viva64.com/docx/blog/1004_Freddy_And_Blender_ru/image2.png)

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

![1004_Freddy_And_Blender_ru/image3.png](https://import.viva64.com/docx/blog/1004_Freddy_And_Blender_ru/image3.png)

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

Один из разработчиков [Blender](https://github.com/blender/blender) сделал [коммит](https://github.com/blender/blender/commit/a7aa0f1a0c240724e533a5b815c8c4d75b117902), который показан на первой картинке выше\. Мы отследили эту ошибку с помощью PVS\-Studio, и я решил написать эту очередную заметку о том, как статический анализатор помогает исправлять ляпы в коде, при условии, конечно, что его используют ;\)\. Пишу я не про все ошибки, а только про интересные, на мой взгляд\.

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

```cpp
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](https://pvs-studio.ru/ru/docs/warnings/v519/)\. The 'r\_snap\[1\]' variable is assigned values twice successively\. Perhaps this is a mistake\. transform\.c\. Check lines: 1727, 1728\.

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

1. Второй элемент массива \(_r\_snap\[1\]_\) инициализируется неправильным значением по умолчанию\. Надо записать в него 1\.0f, а вместо этого записывается 0\.0f;
1. Третий элемент массива \(_r\_snap\[2\]_\) вообще остаётся не инициализированным по умолчанию\. Далее в этот элемент массива, быть может, будет записано другое значение, а возможно и нет\. Если нет — элемент останется неинициализированным, что приведёт к [неопределённому поведению](https://pvs-studio.ru/ru/blog/terms/0066/)\.

А причём тут всё\-таки Фредди? Раскрою интригу\. Дело в том, что 0, 1, 2 прямо\-таки притягивают ошибки\. Я описывал это в статье "[Ноль, один, два, Фредди заберёт тебя](https://pvs-studio.ru/ru/blog/posts/cpp/0713/)"\.

![1004_Freddy_And_Blender_ru/image4.png](https://import.viva64.com/docx/blog/1004_Freddy_And_Blender_ru/image4.png)

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

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

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

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

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

1. [Как PVS\-Studio защищает от поспешных правок кода, пример N6](https://pvs-studio.ru/ru/blog/posts/cpp/1001/)\. 
1. [Как PVS\-Studio защищает от поспешных правок кода, пример N5](https://pvs-studio.ru/ru/blog/posts/cpp/0936/)\. 
1. [Как PVS\-Studio защищает от поспешных правок кода, пример N4](https://pvs-studio.ru/ru/blog/posts/cpp/0924/)\. 
1. [Как PVS\-Studio защищает от поспешных правок кода, пример N3](https://pvs-studio.ru/ru/blog/posts/cpp/0922/)\. 
1. [Как PVS\-Studio защищает от поспешных правок кода, пример N2](https://pvs-studio.ru/ru/blog/posts/cpp/0910/)\. 
1. [Как PVS\-Studio защищает от поспешных правок кода](https://pvs-studio.ru/ru/blog/posts/cpp/0817/)\.