1

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

stack overflow - переполнение стека.
stack exhaustion - исчерпание стека. Пример "An error exists in the function 'fnmatch' in the bundled version of PHP that can lead to stack exhaustion (CVE-2010-1917)"

Являются ли эти выражения синонимами ?

2 (10.12.2014 17:51:04 отредактировано drBatty)

marikk пишет:

Являются ли эти выражения синонимами ?

нет конечно.


На самом деле стек — структура данных, и она в принципе не может переполнится. Однако реализован стек в x86 в виде простого массива, и максимальный размер стека ограничен. Потому стек можно переполнить.

Вот пример переполнения машинного стека:

int foo(int a)
{
    return foo(a+1);
}

int main()
{
    return foo(1);
}

(у меня пишет "ошибка сегментирования", по стандарту это UB).


Исчерпание стека — это когда вы засунули в стек 4 эл-та, и пытаетесь вынуть пять. Для x86го стека это тоже UB по стандарту, а в реальности ничего страшного не происходит(конечно я не гарантирую, UB оно такое), а просто выводится мусор.

PS: СТРАШНОЕ происходит ПОСЛЕ исчерпания, когда указатель стека уменьшается за пределы, и во время pop просто получается "мусор", а во время push вы в этот "мусор" что-то пишете, что приводит к краху (в лучшем случае).

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

3

Спасибо за помощь.