1. 스택 프레임이란?
함수가 호출될 때에도 스택의 원리를 사용하게 됩니다.
예를 들어 아래와 같은 프로그램이 있다고 칩시다.
int main()
{
func1();
}
void func1()
{
func2();
}
void func2()
{
}
그러면 스택에는 이런 식으로 함수들이 쌓이게 되겠죠.
step1 | step2 | step3 |
main() | func1() | func2() |
main() | func1() | |
main() |
이렇게 스택 영역에 차례대로 저장되는 각각의 함수 호출 정보를 스택 프레임 이라고 합니다.
예를 들자면 step 3에서는 스택 프레임 3개가 존재하게 되는 것입니다.
스택 프레임들도 마찬가지로 호출된 후 모든 프로그램 수행을 마치면 스택에서 삭제되겠죠?
step4 | step5 | step6 |
func1() | main() | |
main() | ||
2. 스택 프레임의 구조
위의 예시에서는 쉬운 이해를 돕기 위해 함수명만 적었지만,
하나의 스택 프레임은 해당 함수의
- 매개변수 (뒤에서 부터 저장)
- 반환 주소값
- 지역변수
등의 정보들을 저장하게 됩니다.
3. 스택 오버플로우
void main() {
func1();
}
void func1() {
func1();
}
만약 위와 같은 프로그램이 있다고 칩시다.
그럼 func1 함수의 재귀 호출로 인해서
스택에는 func1의 스택 프레임이 무한히 쌓이게 될 출처것입니다.
하지만 스택 영역도 크기가 한정되어 있기 때문에
어느 순간부터는 해당 프레임은 스택 영역을 넘어서게 됩니다.
그 순간 스택 오버플로우(Stack Overflow) 가 일어나게 되는데요,
그 이유는 프로그램이 만약 스택 영역을 넘어 다른 메모리 영역을 침범하여
저장되면 프로그램이 오작동하게 되고 보안상의 문제가 발생하기 때문입니다.
그래서 스택 오버플로우를 작동시켜 다른 메모리 침범을 막기 위해
프로그램을 강제적으로 종료시키는 것이죠.