Подтвердить что ты не робот

Есть ли флаг gcc для инициализации локального хранилища переменных?

Компилятор IBM AIX xlc предлагает флаг, который генерирует код для инициализации локального хранилища переменных:

      initauto=<hh>
                  Initialialize automatic storage to <hh>. <hh> is a
                  hexadecimal value.  This generates extra code and
                  should only be used for error determination.

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

Есть ли эквивалентная опция для GCC?

4b9b3361

Ответ 1

ОК, Лучший ответ, который я могу предложить.

http://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html говорит "нет", по причине отсутствия. Нет никакой документации о том, чтобы вставить код вывода стека в выходной файл.

Насколько я мог догадаться, единственный способ, которым это могло бы работать, - вставить некоторый memset -подобный код (возможно, так же просто, как несколько операций mov, но тем не менее) в начало каждого встроенного лексического фрейма в котором создается автоматическая переменная. Насколько я могу судить, и я далек от эксперта по внутренним вопросам GCC, но, похоже, ничего не документировано, что бы это сделать.

Далее, в файле gccint.pdf PDF GCC Internals (http://gcc.gnu.org/onlinedocs/gccint.pdf) на стр. 361 определяется, что имя GCC для шаг вызова настройки указателя кадра при входе в функцию prologue. (Однако я действительно не знаю/не понимаю, относится ли это к другим лексическим областям внутри функции.) Поскольку это должно происходить в файле Machine Definition (md), любой такой параметр, по-видимому, должен быть определен для архитектуры ЦП, Я ткнул их онлайн-ViewCVS на http://gcc.gnu.org/viewcvs/trunk/gcc/config/i386/ и нашел (по крайней мере одну) копию prologue вокруг строки 11 893 i386.md, которая после воспроизведения поиска по функциям-расширения несколько переходов, похоже, нечего испускать условный код.

Но этот материал под GCC-капюшоном выглядит просто...

Ответ 2

Я не могу найти окончательную ссылку, но, похоже, что некоторые копии GCC (особенно компилятора GCC Fortran) имеют параметр -finit-local-zero, который автоматически устанавливает любые неявно инициализированные локальные переменные или массивы в нуль.

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

Насколько вам это нужно? Если у вас есть действительно веская причина, я полагаю, что не может быть так сложно скопировать код -finit-local-zero в вашу версию GCC...