본문 바로가기

Basic Theory/C/C++

Segmentation Fault란?

Buffer Over Flow (이하 BOF)를 공부하면서 자주 Segmentation Fault 라는 문구를 확인할 수 있었다. 무언가 문제가 발생했기때문에 일종의 Error 메시지 라고 생각했었는데 기본기를 다져야 겠다고 느낀 이후로 Segmentation Fault에 대해 정확히 짚고 넘어가야겠다는 생각이 들었기 때문에 이번에 정리를 하려고 한다.


구글링을 한 결과 Wiki 에서 아래와 같은 내용을 확인 할 수 있었다.


A segmentation fault (often shortened to segfault), bus error or access violation is generally an attempt to access memory that the CPU cannot physically address. It occurs when the hardware notifies an operating system about a memory access violation. The OS kernel then sends a signal to the process which caused the exception. By default, the process receiving the signal dumps core and terminates. The default signal handler can also be overridden to customize how the signal is handled. (출처:Wikipedia)


본문 中 '메모리를 잘못 접근해서 발생하는 문제'라는 것을 확인할 수 있었다. 조금 쉽게 풀어 쓴다면 '건드리지 말아야 할 곳을 건드렸기에 발생하는 에러'라고 표현할 수 있다. 그러면 여기에서 메모리를 잘못 접근한다는 것은 무엇일까? 조금 더 검색한 결과 NULL로 설정된 영역을 건드리거나, 할당받은 메모리 공간을 넘은 곳을 건드렸을 때를 이야기하는 것이었다.


할당받은 메모리 공간을 넘는다?! 이건 도 무슨 말인가? 계속 꼬리에 꼬리를 물고 따라가 보았다. 그 결과 아래의 내용을 찾을 수 있었다.


운영체제(Operating System)가 메모리를 관리할 때 수행하는 여러가지 작업 중에서 메모리 보호 기능이 있다.


메모리 보호란, 각각의 프로세스자신이 소유한 메모리에 대해서만 액세스(접근)하도록 하는 것이다. 즉, 다른 프로세스(심지어는 운영체제영역)의 영역에는 침범할 수 없다. (예를 들어 파일시스템에서 자기 소유가 아닌 디렉터리나 파일에는 쓰기, 읽기등이 안되는 것 같은 메커니즘) 


A라는 프로그램이 메모리 영역 100번지에서 200번지 까지를 사용하도록 운영체제에 의해 허가되었다고 가정해보자.(모든 메모리자원은 운영체제에게 할당받아 사용해야함) 


그런데, A라는 프로그램내부에서 10번지나, 210번지등 자신의 메모리 영역이 아닌 곳을 액세스하고자 하면, 운영체제는 해당 프로그램 즉 A를 죽여버린다.(살벌?) 왜냐하면 자신의 영역이 아닌 부분을 액세스(read또는 write)하려고 했기 때문이다. 위 경우에는 210번지를 B라는 다른 프로그램이 사용하고 있었다면, A는 B의 영역을 침범한 것이 된다. 이것을 운영체제 수준에서 막아주게 되어 있다. 바로 A를 죽여버리는 것이다. 

침범하도록 허용한다면? 문제가 있을것 이다. A 때문에 B가 죽을 수 있기 때문이다. 만일 B가 운영체제라면 시스템이 다운될 것이다. 구한말의 도스처럼.


이렇게 어떤 프로그램이 자신이 운영체제로 부터 배정받지 못한 영역(메모리)에 대해 침범하는 것을 운영체제 수준에서 막아주는 것Segmetation Fault Error 이다.

[출처] http://terapi.tistory.com/131


위의 예처럼 할당받은 메모리 이외의 공간을 건드릴 수 있는 것은 C/C++이 포인터를 사용할 수 있기 때문이다.


그리고 참고로 이야기하자면 디버그 모드로 프로그램을 실행시킬 경우, 건드리지 말아야 할 메모리를 건드렸을 때가 아니라, 할당받은 메모리를 해제할 때 에러가 발생한다.


- 참고 자료 출처 -

http://adnoctum.tistory.com/387

http://terapi.tistory.com/131


'Basic Theory > C/C++' 카테고리의 다른 글

지역변수(local variable)  (0) 2012.07.02
Libc(C 표준 라이브러리)  (0) 2012.06.26
strncpy 함수  (0) 2012.06.24