Может ли gcc инициализировать неинициализированные указатели в NULL? Или что бы объяснить это поведение?
Можно gcc
как-то инициализировать неинициализированные указатели на NULL
?
На работе мы строим наше программное обеспечение как на gcc 4.1.2, так и на Sun Studio 12. Версия gcc, работающая на Red Hat Enterprise Linux, работает нормально 5 дней в неделю в течение нескольких месяцев.
Мы только что выпустили нашу версию Solaris, и она каждый день вылетает при запуске.
Трассировка стека подводит нас к коду:
if( _timer == NULL ) {
_timer = new Timer(bunch, of, parameters);
}
_timer->StartTimer(_timeout);
И мы определили _timer
как нигде не был инициализирован. Итак, мы верим _timer
должен быть установлен для данных мусора, который не сравнивается с NULL
, то получает StartTimer
без таймера когда-либо строится.
Работа фактически поручена моему коллеге, и он проверяет это. Но между тем мне было любопытно: почему наша сборка Linux (gcc) никогда не рушится? Уверяю вас, это один и тот же код - мы используем Perforce и строгую маркировку. Я читал, что компиляторы не инициализируют неинициализированные указатели, поэтому я запутался.
Подтверждение того, что gcc 4.1.2
абсолютно не может автоматически инициализировать неинициализированный указатель, ответил бы на этот вопрос. Или способы, которыми это могло бы.