coverity — C ++ инициализирует целые числа в ноль автоматически?

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

Будет ли их инициализация нулем отличаться от того, что делает C ++ по умолчанию?

4

Решение

C ++ инициализирует целые числа в ноль автоматически?

Для автоматических переменных:

Некоторые компиляторы могут делать это, но стандарт не требует этого. Соответствующая реализация может оставить их неинициализированными значениями мусора.

За static переменные:

Они должны быть инициализированы нулем, если явно не инициализированы иначе.

10

Другие решения

C ++ не инициализирует целочисленные переменные в ноль по умолчанию.

Некоторые компиляторы могут обнулять их или заполнять некоторым значением по умолчанию при компиляции вашего проекта в режиме отладки. В режиме релиза этого обычно не происходит.

Исключение составляют статические переменные, но по умолчанию можно предположить, что все, что унифицировано, содержит случайное значение.

Остерегайтесь неинициализированных переменных. Найти такого рода ошибку сложно и можно потратить много времени. Обычные симптомы: программа отлично работает в режиме отладки, но странно ведет себя в выпуске.

6

Объекты, объявленные в статической длительности хранения, инициализируются нулями до любой другой инициализации (включая инициализации по умолчанию).

к по умолчанию инициализирует объект типа T средства:
— если T является (возможно, cv-квалифицированным) типом класса (раздел 9), конструктором по умолчанию для T называется (а
инициализация некорректна, если T не имеет доступного конструктора по умолчанию);
— если T тип массива, каждый элемент инициализируется по умолчанию;
— иначе инициализация не выполняется
C.11 §8.5¶6

Заметка: Каждый объект статической длительности хранения инициализируется нулями при запуске программы перед любой другой инициализацией
происходит. В некоторых случаях дополнительная инициализация выполняется позже. — конечная нота ] C.11 §8.5¶9

1

И да и нет.

Это зависит от того, как они объявлены. Если они объявлены staticтогда да, они гарантированно инициализируются нулями. Однако локальные переменные в функции не могут быть инициализированы нулями. В большинстве случаев переменные члена класса также не являются static).

В основном, если это не так static, вы должны предположить, что он не будет инициализирован до 0. Поскольку он не инициализирован, он может иметь любое значение.

0

ошибки типа «Неинициализированная скалярная переменная», которые сильно влияют

Да, они имеют большое влияние, потому что неинициализированная автоматическая переменная имеет неопределенное значение и использование неопределенного значения — неопределенное поведение так что это серьезные ошибки, если вы попытаетесь получить значение из них до инициализации.

Будет ли их инициализация нулем отличаться от того, что делает C ++ по умолчанию?

Да, для автоматических скалярных переменных стандарт C ++ говорит, что они будут иметь неопределенное значение, проект стандарта C ++ из раздела 8.5 [Dcl.init]:

Если для объекта не указан инициализатор, объект
по умолчанию инициализируется. При хранении для объекта с автоматическим или
динамическая длительность хранения получается, объект имеет неопределенный
значение, и если для объекта не выполняется инициализация, то
объект сохраняет неопределенное значение, пока это значение не будет заменено
(5.17 [expr.ass])

Компилятор может в режиме отладки инициализировать локальную переменную, чтобы помочь в отладке, мы можем видеть, что MSVC может сделать это с помощью / RTC:

Инициализация локальных переменных ненулевым значением. Это помогает
выявить ошибки, которые не появляются при работе в режиме отладки. […]

0