Неинициализированная автоматическая переменная, приводящая к случайному значению - PullRequest
2 голосов
/ 08 июля 2010

Это может выглядеть как тривиальная проблема. Извините в этом случае, я не могу найти реальный путь. Я понимаю, что автоматические переменные не инициализированы. Поэтому приведенный ниже фрагмент кода, скорее всего, будет выгружен в block-2

.
char *p;  
if(NULL == p)  
{  
   //do something  block-1 statement
}  
else  
{  
  //do something else  block-2 statement
}  

Теперь в большинстве платформ значение автоматической переменной по умолчанию равно 0 или NULL, особенно SUSE Linux.

Вопрос

а. Есть ли какой-либо флаг компилятора или любая другая опция, которая заставит установку локальной переменной к значению «мусора», если не инициализировано?

PS: я знаю, что инструмент статического анализатора легко сможет обнаружить проблему. Я просто хотел узнать, можно ли это сделать во время выполнения, также с помощью некоторых настроек флагов / опций.

Я использую платформы SUSE 10 / HP-UX и AIX.

Ответы [ 3 ]

6 голосов
/ 08 июля 2010

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

1 голос
/ 08 июля 2010

То, что вы видите здесь, является артефактом того, как память обычно выделяется процессам в Unix.

Поскольку сегмент стека не хранится в образе дискового файла исполняемого файла, ОС должна выделить новые страницыв стек при запуске программы.Они изначально обозначаются как заполненные нулями , так же как и .bss.Это начальное заполнение нуля стека является историческим.Была попытка «упростить» это, чтобы не делать этого.Слишком много программ прервалось, поэтому перемещение было прекращено.

Запустите вашу программу на некоторое время, сделайте несколько вызовов функций, - в итоге вы увидите «мусор» в стеке:)

1 голос
/ 08 июля 2010

Во-первых, почему вы хотите сделать это во время выполнения, когда вы, скорее всего, сможете быстрее и проще его отловить с помощью предупреждений компилятора или статических анализаторов?

Мне не известен флаг компилятора, который делает то, что вы хотите, но я уверен, что внешние инструменты, такие как valgrind и Purify, могут отслеживать такие вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...