В некоторых Linux-системах переменные в стеке инициализируются равными 0 - почему?
У меня есть глючная программа, которая помещает переменную в стек и может использовать ее без инициализации.
Я беру один и тот же двоичный файл и запускаю его на разных компьютерах с Linux. Эти блоки имеют разные процессоры (i5, i7), но кроме этого они работают в том же дистрибутиве Fedora.
Я могу легко уловить проблему, потому что переменная содержит случайные данные.
Однако в другом блоке переменные стека всегда инициализируются равными 0 (даже если они не должны быть).
Я пытаюсь определить причину такого поведения. Где я должен смотреть? Что может вызвать это? Существуют ли какие-либо функции ядра, которые могут повлиять на это?
2 ответа
Для неинициализированных данных нет "следует" или "не следует". Это может быть чем угодно, что угодно. Возможны все нули - так же, как и все, и случайный мусор. Действительно, все нули - это одна совершенно приемлемая форма случайного мусора. Вместо того, чтобы интересоваться тем, что представляют собой неинициализированные данные в разных полях, инициализируйте их, и тогда (и только тогда) вы сможете узнать, что это "должно быть".
В C инициализация переменных зависит от уровня оптимизации, когда программа была скомпилирована.
Уровень оптимизации 3 не инициализирует переменную в стеке.
gcc -O3 program.c -o program