Это зависит от того, что вы подразумеваете под «уничтожить стек», но это распространенная ошибка, которая обычно приводит к повреждению важных резидентных данных стека:
void dumb()
{
char small[2];
strcpy(small, "too long to fit"); // Writes past the end of "small", overwriting vital information
}
Это общий источник безопасностиотверстия.Он может потенциально использоваться для перехвата указателя инструкций, позволяя выполнить вредоносный код.См. переполнение буфера .
Другая ошибка, которую можно описать как «уничтожение стека», - это случай бесконечной рекурсии (прокрутите вниз на этой странице):
int add(int n)
{
return n + add(n + 1);
}
Который, поскольку ему не хватает условия выхода, будет помещать в стек столько кадров, что в конечном итоге он будет «заполнен». (Если компилятор не может применить оптимизация хвостового вызова ; см. Ниже)
Оба эти примера компилируются без предупреждения с использованием GCC 4.4.3.
Примечание: Как отметил Билли ONeal ниже, поведение этих примеров специфично для x86, а не для языка C, и может варьироваться от одного компилятора к другому.Это не означает, что они не демонстрируют, как можно разбить стек в конкретной (и чрезвычайно распространенной) реализации C.