개발/프로그래밍(일반)

Segmentation fault 가 발생하는 경우

kyu76 2012. 4. 27. 18:51

(출처: http://hosang.tistory.com/180)

Segmentation fault 가 발생하는 경우는 원인을 찾기 어려운 경우가 종종 있으므로 여러가지 경우를 정리해보자.


1. File open 시 실제 파일이 없는 데 계속 진행하는 경우

-> 그러므로 반드시 FILE pointer 사용시는 파일이 올바르게 열렸는지 여부를 체크해야 한다.

ex)
#include <assert.h>

pfReference = fopen(pcInputFileName, "r"); // Open an input file
pfConvertReference = fopen(pcOutputFileName, "w");    // Open an output file
assert(pfReference && pfConvertReference);    // Validate input and output file

2. Array out of bound index

-> Java 에서야 명확하게 array out of bound index 라는 메시지가 나오지만, C/C++의 경우 index bound 를 넘어서도 가능하면 접근해보고자 하기 때문에 segmentation fault 가 발생했다가, 안했다가 할 수 있다.

3. Function prototyping 문제

-> 가끔보면 실제 segmentation fault 와는 정말로! 전혀 상관없는 코드인데, 그 코드를 어떻게 수정하느냐에 따라 segmentation fault 가 발생했다가, 하지 않았다가 하는 경우가 있다. 이런 경우는 segmentation fault 와 관련된 함수 등의 prototype 이 명확히 정의되어 include 되어있는지 확인하자. 예를 function.c 파일에 함수를 잘 정의해 놓고, function.h 에는 prototype을 정의해 두지 않은 상태에서 실제 segmentation fault 가 발생하는 소스파일에서 function.h 를 include 하지는 않았는지 확인해보자. 이런 경우 함수는 실행하지만 함수의 return value 의 data type 이 잘못인식되어 array index 를 잘못 참조하는 경우가 발생할 수 있다.

4. Compiler Optimization 문제

-> Compiler 의 optimization 값이 너무 높은 레벨로 설정 되어있을 경우 segmentation fault 또는 core dump 가 발생할 수 있다. 혹시 compiler optimization 값이 -O3 로 되어있다면 -O2 로 레벨을 낮추고 이래도 문제가 해결 되지 않을 경우 -O0 로 설정한 뒤 테스트 해보길 바란다.