지난글에 메모리 구조에 대해 공부하였습니다. 근데 그중에서 스택 영역이라는게 눈에 보입니다.
개발자 커뮤니티로 유명한 스택 오버플로우(https://stackoverflow.com/) 입니다. 이 사이트 이름을 자주 보다보니 스택 오버플로우가 어떤 뜻인지 궁금해서 알아보도록 하겠습니다.
스택 영역에 대해 한번더 알아보겠습니다.
스택 영역은 함수를 호출 할 때 지역변수, 매개변수들이
저장되는 영역이라고 알았습니다. 프로그램이 실행될 때 함수를 호출하고 빠져 나오게 되는데 그때마다 스택 영역에 메모리가 반환도는 것을 반복합니다.

예제 코드를 보면
int main(void)
{
func1(); // func1() 호출
return 0;
}
void func1()
{
func2(); // func2() 호출
}
void func2()
{
}
그리고 이를 표현한 그림입니다.


위 코드에서 main 함수가 호출되면 해당 함수의
스택 프레임이 스택에 저장됩니다.
그 후 func1 함수를 호출하면 func1 함수의 스택 프레임이 추가로 스택에 저장되고, 이어서 func2 함수를 호출하면 func2 함수의 스택 프레임이 또 다시 스택에 저장됩니다.
각 함수의 실행이 완료되면 해당 함수의 스택 프레임이 스택에서 제거됩니다. 이런 방식으로 스택은 함수 호출의 순서에 따라 메모리를 할당하고 해제합니다.
스택은 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출됩니다.
그리고 함수의 재귀 호출이 무한히 반복되거나 반복문이나 재귀 호출이 결합된 경우에, 일어나는게 스택 오버플로우 입니다.
좀더 자세히 써보면
위에 설명에 과정중 재귀 호출이 무한히 반복되면 스택프래임이 계속 쌓여 갈 것이고 스택 영역의 공간을 다 차지하고 난 후 더 이상 여유 공간이 없을때 또 다시 스택 프레임을 저장하게 되면, 해당 데이터는 스택 영역을 넘어가서 저장되게 됩니다.

이렇게 해당 스택 영역을 넘어가 데이터를 저장하려 하면, 해당 프로그램은 오동작을 하게 되거나 보안상의 크나큰 취약점을 가지게 됩니다.
따라서 스택 오버플로우를 방지하기 위해서는 재귀 호출이나 반복문을 사용할 때 주의가 필요합니다. 또한, 스택 오버플로우가 발생할 경우 프로그램이 비정상적으로 종료될 수 있으므로, 이를 방지하기 위한 다양한 대응책이 필요합니다.