﻿# Любите статический анализ кода\!

Я в шоке от возможностей статического анализа кода, хотя сам участвую в разработке инструмента PVS\-Studio\. На днях я был искренне удивлён тому, что анализатор оказался умнее и внимательнее меня\.

![0535_Appreciate_Static_Code_Analysis_ru/image1.png](https://import.viva64.com/docx/blog/0535_Appreciate_Static_Code_Analysis_ru/image1.png)

Работа с инструментами статического анализа кода требует внимательности\. Очень часто код, на который указал анализатор, кажется корректным\. Сразу хочется посчитать предупреждение ложным срабатыванием и пойти дальше\. Даже я, один из разработчиков PVS\-Studio, попадаю в эту ловушку и не вижу ошибку\. На днях я открыл 2 тикета в нашем багтрекере, касающиеся диагностики V614, которая ищет использование неинициализированных переменных и массивов\.

В обоих случаях я подумал, что анализатор неправ и в нём надо что\-то исправить\. Первый случай:

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

Я четыре раза прочитал этот код, но так и не увидел ошибку\. И решил, что это ложное срабатывание, которое надо править\. Но прав анализатор, а я просто невнимательный человек\.

Буфер _caption_ остаётся неинициализированным\. Посмотрите выше, там обе строки загружаются в буфер _text_\. Опечатка\. Я не смог её увидеть\.

А вот еще более эпичный случай:

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

Анализатор PVS\-Studio говорит, что используется неинициализированный буфер _buf_\. Бред какой\-то\. И я отписываю этот случай в багтрекере как баг, который надо обязательно поправить\. Ведь очевидно, что функция _sprintf_ инициализирует буфер и всё в этом коде хорошо\.

Нифига\! Вновь прав анализатор PVS\-Studio, а не я\. Тот случай, когда творение превзошло создателя\. :\)

Очень нехороший программист в одном из заголовочных файлов написал вот это:

![0535_Appreciate_Static_Code_Analysis_ru/image5.png](https://import.viva64.com/docx/blog/0535_Appreciate_Static_Code_Analysis_ru/image5.png)

\([definesTypes\.h](https://github.com/StarEngine/engine/blob/develop/src/definesTypes.h)\)

Видите, _sprinf_ раскрывается в _std::printf_\. Да, да, в этой программе _sprintf_ это тоже самое что _printf_\.

Ужас то какой\. Получается, что функция _printf_ использует неинициализированный буфер _buf_ как управляющую строку\.

Любите и используйте статические анализаторы кода\! Они сэкономят вам нервы и время\.