Stackoverflow и bufferoverflow - это разные понятия.
Stackoverflow:
Размер стека программ является статическим, он никогда не изменяется во время выполнения. Поскольку невозможно узнать, сколько памяти понадобится вашему стеку во время выполнения, зарезервирован достаточно большой блок памяти. Однако некоторые программы выходят из этого, вызывая рекурсивную функцию.
Вызов функции резервирует столько места, сколько необходимо для хранения локальных переменных в стеке и освобождает память после ее выхода. Рекурсивная функция резервирует новую память каждый раз, когда она вводится, и освобождает ее при выходе. Если рекурсия никогда не заканчивается из-за ошибки программирования, все больше и больше памяти в стеке резервируется до тех пор, пока стек не будет заполнен.
Попытка зарезервировать память для полного стека приведет к ошибке, стекопотока.
Пример кода:
volatile bool args = false;
int myoverflow(int i){
int a[500];
if(args)
return a[i%500];
else
return myoverflow(i+1);
}
Это должно переполнить стек. Он будет резервировать 500 * sizeof (int) каждый раз при входе в функцию.
переполнение буфера:
У вас есть две переменные, массив a и массив b. a может содержать 4 элемента, а b может содержать 2.
Теперь вы записываете 5 элементов в a, 5-й элемент попадает в b.
Пример:
void main(int ,char**)
{
int a[4];
int b[2];
a[5] = 22;
std::cout<<b[0];
}
Это должно вывести 22. он запишет вне a, в память, используемую b.
Примечание: ни одна из моих примеров функций гарантированно не будет работать, компилятор может оптимизировать вызовы функций и распределять память, используемую в стеке, как ему нужно Он может даже напечатать ошибку компиляции при доступе к памяти вне границ для массива a.