Различия между gcc3 и gcc4 в отношении неинициализированных переменных - PullRequest
1 голос
/ 30 апреля 2010

У нас есть тело кода на C ++, которое переносится с дистрибутива на основе RHEL4 на RHEL-5. Раньше компилировался с g ++ 3.4.3, а теперь компилируется с g ++ 4.1.2. Оказывается, что есть локальные переменные POD, которые используются неинициализированными, что вызывает сбои в новой среде - неудивительно, так как правила C ++ говорят, что локальные структуры POD остаются неинициализированными и поэтому случайными.

Я ищу объяснение того, почему это не беспокоило нас при компиляции с 3.4.3, но сейчас сеет хаос с 4.1.2. Там может быть неясная обстановка в спецификации gcc3, которые помогли инициализировать локальные переменные POD?

Ответы [ 2 ]

3 голосов
/ 17 октября 2011

Неопределенное поведение, как следует из названия, не определено. Компиляторам не нужно объяснять, почему они делают то, что делают, им не нужно последовательно делать одну вещь, и им не нужно иметь причину для того, что они делают.

Способ, которым компиляторы обычно обрабатывают неопределенное поведение, состоит в том, чтобы игнорировать его. Никогда не было разработчика GCC, который бы сел и сказал: «Давайте напишем некоторый код для того, как GCC обрабатывает неинициализированные переменные». Все, что с ними происходит, происходит в результате провала всего кода другого в GCC. Таким образом, новые версии компилятора могут делать разные вещи с неинициализированными переменными не потому, что компилятор обрабатывает их по-разному, а потому, что он никогда не обрабатывал их преднамеренно вообще .

1 голос
/ 16 октября 2011

Возможно, скомпилировав ваш код с более свежей версией (например, 4.6.1 ) g ++ и запросив все предупреждения (используя -Wall -Wextra ), а затем взломав Исходный код до тех пор, пока не будут выданы предупреждения, вы можете улучшить ситуацию

...