세그먼테이션 오류 (Segmentation Fault)

1. 정의

세그먼테이션 오류(Segmentation Fault)란, 프로그램이 허용되지 않은 메모리 영역에 접근하려고 시도할 때 운영체제가 해당 프로세스를 강제 종료시키며 발생하는 오류를 말한다.
주로 C, C++ 등 포인터를 직접 다루는 언어에서 발생하며, 하드웨어 메모리 보호 기능과 운영체제의 메모리 관리 기법(MMU, Memory Management Unit)에 의해 탐지된다.
개발 중 디버깅 과정에서 빈번히 발견되며, 보안 취약점(버퍼 오버플로우)과 직결될 수 있다.

※ 프로세스 메모리 구조

프로세스 메모리 구조는 코드(Code), 데이터(Data), 스택(Stack), 힙(Heap) 영역으로 구성된다. 각 영역은 프로세스의 실행에 필요한 데이터를 저장하고 관리하는 역할을 한다.
- Code : 실행할 코드 (기계어)
- Data : 전역 변수, 정적 변수 등 
- Heap : 사용자 동적 할당 영역
- Stack : 지역변수, 함수의 매개변수 등

 

2. 주요 원인

원인설명
잘못된 포인터 참조초기화되지 않은 포인터, NULL 포인터 역참조
경계 초과 접근배열 인덱스 범위 초과
해제된 메모리 접근free/delete 이후 포인터 사용
읽기 전용 영역 수정문자열 상수 수정 시도
스택 오버플로우재귀 호출 무한 반복 등으로 스택 한계 초과

 

3. 대응 방안

(1) 포인터 초기화 및 유효성 검사

NULL 체크, 범위 검사

(2) 메모리 동적 할당·해제 규칙 준수

해제 후 포인터 NULL 재설정

(3) 배열 및 버퍼 경계 검사

안전한 함수(strncpy, snprintf 등) 사용

(4) 디버깅 툴 활용

gdb, valgrind, AddressSanitizer 등을 통한 메모리 접근 추적

4. 결론

세그먼테이션 오류는 프로그램 안정성과 보안에 직결되므로, 메모리 안전성 확보와 철저한 검증이 필요하다. 안전한 프로그래밍 습관과 정적·동적 분석 도구 활용이 필수적이다.
 

+ Recent posts