Могу ли я ожидать ошибки сегмента, если переполняю стек

У меня есть программа, написанная на C ++, скомпилированная с gcc 4.8.1, работающая на CentOS 5. При определенных обстоятельствах она сталкивается с бесконечной рекурсией и обычно вызывает ошибку сегмента. Могу ли я рассчитывать на то, что это произойдет каждый раз, или же поведение может отличаться от выполнения к выполнению, включая такие страшные сценарии, как повреждение данных и продолжение работы приложения, по-видимому, как обычно?

Я знаю, что последствия переполнения стека в целом не определены, мне просто интересно, если результат будет несколько детерминированным, учитывая, что ОС CentOS 5.

1

Решение

Поскольку CentOS является ОС Linux / GNU, вы можете рассчитывать на то, что она сгенерирует SIGSEGV … когда вы переходите к страницам с конца стека, об этом вам и будет сигнализировать ОС.

(Обратите внимание, что это сильно отличается от переполнения буфера, что является другим способом, при котором стек может столкнуться с проблемами: в этом случае обычно это массив в стеке, который индексируется за пределами его конечного адреса — слишком далеко, и он может генерировать SIGSEGV тоже, но в других адресах он позволяет получить доступ к другим данным в стеке, таким как параметры функции, сохраненные значения регистров и адреса возврата. Эта проблема имеет более тонкие проявления, такие как повреждение данных и проблемы безопасности.)

4

Другие решения