Все мои локальные переменные удалены - PullRequest
0 голосов
/ 01 ноября 2010

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

void outer_function()
{
  int x = 0;
  inner_function();
  printf("%d\n", x); // Throws an error because x does not exist
}

Я не уверен, что вызвано inner_function (), и функция слишком длинная, чтобы вставить ее сюда. Какое поведение может привести к исчезновению локальных переменных в outer_function()? Единственное, о чем я могу думать, это то, что inner_function() записывает в память outer_function(), но кажется, что это только изменит содержимое переменных, но не удалит их.

Редактировать: Я не думаю, что я могу сказать вам намного больше. gcc сказал EXC_BAD_ACCESS, а затем «предупреждение: невозможно восстановить ранее выбранный кадр», а затем произошел сбой. Я знаю, что вам трудно сказать, что на самом деле вызывает это, не видя всей функции, поэтому я сначала просто спросил, какого рода ошибка может привести к такому поведению.

Ответы [ 5 ]

2 голосов
/ 01 ноября 2010

Вы на 100% уверены, что printf("%d\n", x); - это строка, которая вызывает ошибку? Вы прошли через это? Я бы добавил несколько строк, чтобы напечатать вывод x до, во время и после inner_function(), чтобы точно определить, в чем проблема. У меня такое ощущение, что у тебя проблема внутри inner_function().

2 голосов
/ 01 ноября 2010

Когда вы входите в область неопределенного поведения, все ставки отключаются, поэтому, если внутри inner_function() есть вообще неопределенное поведение, последующее поведение всей вашей программы и, следовательно, outer_function() также не определено.

2 голосов
/ 01 ноября 2010

Не видя полного, скомпилированного фрагмента кода, невозможно сказать.Единственное, о чем я могу думать, это то, что inner_function() на самом деле какой-то извращенный макрос, который все испортил.

1 голос
/ 01 ноября 2010

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

void inner_function(void) {
    int x[1];
    memset(x, 0, 10 * sizeof(x));
}

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

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

1 голос
/ 01 ноября 2010

Может быть, вы объявляете и определяете inner_function различными способами (cdecl и stdcall).

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