Получи случайную криптовалюту за регистрацию!

Баллада об неинициализированных переменных Использование неин | Just code IT

Баллада об неинициализированных переменных

Использование неинициализированных переменных — очевидно грустная тема. С одной стороны, это угроза безопасности (можно подстроить стек или кучу таким образом, чтобы без инициализации использовались вредоносные значения). С другой стороны, это угроза надежности/стабильности работы — в неинициализированных данных может оказаться все что угодно и это «что угодно» будет меняться от запуска к запуску, от платформы к платформе. Про запрет на использование неинициативных переменных говорят стандарты (ISO26262-6-6.1c, SEI CERT), компиляторы помогают нам найти подобные опасные места (gcc -Wuninitialized -Wgnu-empty-initializer). Статические анализаторы тоже поддерживают эстафету (раз и два).

Но почему ж такое до сих пор встречается в коде? Да потому что вопрос «а как надо?» до сих пор не решен. Ясно, что разнесение декларации от инициализации создает пространство для внесения ошибки. Можно оставить переменную в начале блока, но там не всегда известны правильные значения инициализации (а забивание переменной «мусором» скроет от компилятора потенциальное нарушение бизнес логики).

Можно объявить по месту, но тут мы встаем на скользкую тропку in-place initialisation and against holy war, а это уже война Сишников против Плюсовиков, для которых RAII является естественным. Можно дробить на микро-блоки/микро-функции, так чтобы объявление шло рука об руку с инициализацией и было осмысленным, но тут уже вкусовщина и снижение читаемости через излишне высокую гранулярность функций.

Так что же в итоге? А нет однозначного ответа! Не используйте неинициализированные переменные и пишите красивый код, как бы эта красота не была хрупка…

#digest