Проверка, не происходит ли выделение стека? - PullRequest
3 голосов
/ 29 мая 2011

Есть ли способ исправить неудачное статическое распределение, или программа просто отказывает с помощью сегментации или ошибки шины при запуске?

Пост был вдохновлен тем, как C99 допускает такие сумасшедшие вещи, как char text[n];

РЕДАКТИРОВАТЬ : Спасибо. Теперь я понимаю, что часть, выделенная жирным шрифтом, не является статической. Так что просто для проверки, если что-то вроде char text[1234]; дает сбой, будут ли возможные стратегии восстановления такими же?

Ответы [ 4 ]

3 голосов
/ 29 мая 2011

char text[n] выделяет массив стека переменного размера. Это просто включает увеличение указателя стека на n.

Процесс переполнения стека мало что может сделать для пользовательского пространства - операционная система должна либо отправить сигнал процессу и завершить его, либо изменить размер стека.

1 голос
/ 29 мая 2011

Никогда не проверяйте состояние ошибки, которое вы не знаете, как обработать.

Серьезно, что ты планируешь делать? Существует только небольшое подмножество функций, которые вам разрешено вызывать из обработчика сигнала (см. man 7 signal), и printf и longjmp (longjmp - единственный способ, с помощью которого я могу прийти в себя после такой проблемы), не являются одним из них. , Если у вас возникнут проблемы с повторным выполнением процесса, вам также может понадобиться няня, которая выполнит эту работу и избежит путаницы.

Обратите внимание, в соответствии с man alloca на самом деле вам не говорят, что «выделение» завершается неудачно, вы просто получаете SIGSEGV, когда пытаетесь получить доступ к плохой памяти, и, конечно, это может не произойти в массиве text []. вообще или, возможно, даже не в функции, которая выделяет текст [] вообще.

Хотя два приведенных выше абзаца основаны на Linux, общая теория верна для всех платформ.

Используйте malloc и имейте чистое обращение. Будь в здравом уме.

[EDIT]

На самом деле есть один способ попытаться это сделать, это вычислить начало стека (стек записи в основном) и ограничение стека (надеясь, что в ОС не хватит страниц). Затем, прежде чем делать выделение большого стека, вы можете вычислить, насколько вы близки к концу. Дайте себе щедрую комнату для маневра и потерпите неудачу, прежде чем выделять.

1 голос
/ 29 мая 2011

Вы, вероятно, можете поймать сигнал (ы), но больше ничего не можете сделать. Конечно, проверка n перед его использованием, чтобы убедиться, что она имеет разумное значение, решит это мгновенно.

0 голосов
/ 31 мая 2011

Это распределение стека, а не статическое. Режим сбоя - переполнение стека. Наиболее рациональная политика для переполнения стека состоит в том, чтобы рассматривать это как терминал.

Создайте свой код таким образом, чтобы он не переполнял стек, а не пытался повысить его устойчивость к переполнению стека.

...