3

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

Я беру один и тот же двоичный файл и запускаю его на разных компьютерах с Linux. Эти блоки имеют разные процессоры (i5, i7), но кроме этого они работают в том же дистрибутиве Fedora.

Я могу легко уловить проблему, потому что переменная содержит случайные данные.

Однако в другом блоке переменные стека всегда инициализируются равными 0 (даже если они не должны быть).

Я пытаюсь определить причину этого другого поведения. Где я должен смотреть? Что может вызвать это? Существуют ли какие-либо функции ядра, которые могут повлиять на это?

2 ответа2

2

Для неинициализированных данных нет "следует" или "не следует". Это может быть чем угодно, что угодно. Возможны все нули - так же, как и все, и случайный мусор. Действительно, все нули - это одна совершенно приемлемая форма случайного мусора. Вместо того, чтобы интересоваться тем, что представляют собой неинициализированные данные в разных полях, инициализируйте их, и тогда (и только тогда) вы сможете узнать, что это "должно быть".

0

В C инициализация переменных зависит от уровня оптимизации, когда программа была скомпилирована.

Уровень оптимизации 3 не инициализирует переменную в стеке.

gcc -O3 program.c -o program

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .