study/C언어

스택 프레임(Stack frame)

IT공부 2020. 3. 31. 15:47
반응형

스택 프레임 개념

 

메모리의 스택(Stack) 영역은 함수의 호출과 관계되는 지역변수매개변수가 지정되는 영역 

스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다. 

 

* 함수가 호출되면 스택에는 함수에 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소, 함수에서 선언된 지역 변수 등이 저장된다. 이렇게 스택 영역에 차례대로 저장되는 함수를 호출 정보를 스택 프레임(Stack frame)이라고 합니다. 

 

스택은  후입 선출 LIFO(Last-in First-out) 방식이라고도 합니다. 

 

스택 프레임 동작 방식

예제)

int main(void)
{
	func1(); //func1() 호출
    return 0;
}

void func1()
{
	func2(); //func2() 호출
}

void func2() 
{
}

Step 1

프로그램이 실행되면, 가정 먼저 main() 함수가 호출되며 스택 프레임이 스택에 저장 

 

Step 2

 func1() 함수를 호출하면, 해당 함수의 매개변수, 반환 주소 값, 지역 변수 등이 저장

 

*나머지 함수들도 똑같은 방식으로 스택에 저장됩니다. 

 

Step 3

func2() 함수의 모든 작업이 완료되어 반환되면, func2() 함수의 스택 프레임이 스택에서 제거

 

*나머지 함수들도 똑같은 방식으로 스택에서 제거됩니다. 

 

 

스택 오버플로우(Stack overflow)

함수의 재귀 호출이 반복되면, 해당 프로그램은 스택 오버플로우에 의해 프로그램이 비정상 종료가 될 수 있습니다.

 

만약 재귀 호출이 무한히 반복된다면, 아래 그림과 같이 마지막 메로리 주소 그림처럼 스택 프로임이 계속해서 쌓아져 가는데, 스택의 모든 공간을 다 사용하고 난 후 여유공간이 없을 때 다시 스택 프레임을 저장하게 되면 해당 스택 영역을 넘어가서 저장하게 됩니다. 

 

위 그림처럼 해당 스택 영역을 넘어가도 데이터가 저장할 수 있으면, 해당 프로그램은 오동작을 하게 되거나, 보안상의 취약점을 가지게 된다. 

'study > C언어' 카테고리의 다른 글

배열(Array) 과 포인터(Pointer)  (0) 2020.03.31
함수(Function) 란?  (0) 2020.03.31
[C언어] printf 함수와 scanf 기본적인 이해  (0) 2019.12.20
[C언어] 주석처리  (0) 2019.12.20
[C언어] 1. HelloWorld  (0) 2019.12.20