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

17

Компилятор 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?

    
задан Greg Hewgill 10.05.2012 в 04:03
источник
  • -Wextra отлично подходит для новых кодовых баз, которые еще не имеют 3 миллионов строк кода. :) –  Greg Hewgill 10.05.2012 в 04:47
  • Я не могу поверить, что инициализация написана «инициализировать» в документах компилятора. –  Andrew Marshall 10.05.2012 в 04:48
  • @AndrewMarshall: Ха! Я этого даже не заметил. Это действительно написано именно так, хотя xlc довольно старый. В текущей онлайн-справке нет этой ошибки. –  Greg Hewgill 10.05.2012 в 04:51
  • Я не знаю, я как бы думаю: «Вперед еще лучше для крысиных, противных старых кодовых баз, которые уже имеют несколько миллионов строк кода :-) Кому нужен TDD? O :-) –  BRFennPocock 10.05.2012 в 04:53

3 ответа

10

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

Ссылка говорит «нет» из-за отсутствия. Нет никакой документации о том, что бы добавить код вывода стека в выходной файл.

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

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

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

    
ответ дан BRFennPocock 10.05.2012 в 05:32
  • Спасибо, это похоже на ближайший к (сейчас) правильный ответ. Несомненно, существует множество возможных подробностей, связанных с фактической реализацией, таких как массивы переменной длины C99, повторное использование локального пространства переменных и такие вещи, как alloca (). –  Greg Hewgill 10.05.2012 в 08:27
3

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

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

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

    
ответ дан Mahmoud Al-Qudsi 10.05.2012 в 05:12
  • Однако это скорее локализовано для front-end FORTRAN: gcc.gnu.org/onlinedocs/gfortran/Code-Gen-Options.html ... приятно найти, но я боюсь, что это не поможет с C на основе кода –  BRFennPocock 10.05.2012 в 05:28
  • Это не настоящая потребность на данный момент. Идея заключалась в том, что если бы мы включили такую ​​опцию для xlc (с этой 3 + миллионной базой строк кода), а затем перешли на gcc позже, код мог бы полагаться на определенную инициализацию, которая не произошла бы без соответствующей опции в gcc , В идеале, долгосрочное решение заключается в использовании -Униминитировано с -Werror (xlc также имеет эквивалентные варианты). –  Greg Hewgill 10.05.2012 в 08:30
-1

C99: Если объект с автоматической продолжительностью хранения не инициализирован явно, его значение неопределенно.

В этом вопросе была тема. Что происходит с объявленная, неинициализированная переменная в C? Имеет ли значение значение? .

    
ответ дан Zombiao 10.05.2012 в 04:40
  • Я понимаю, что спецификация языка не требует инициализации переменных с автоматическим временем хранения. Однако, по крайней мере, у одного компилятора есть возможность сделать это, если вы попросите его. Мой вопрос заключается в том, имеет ли GCC аналогичный вариант. –  Greg Hewgill 10.05.2012 в 04:44