본문 바로가기
CS

배열의 범위를 넘어서면 항상 segfault가 발생할까?

by seongjko 2025. 7. 8.
728x90
int ary[10];

ary[10] = 1;

 

이 코드는 항상 segfault를 발생시킬까?

그렇다고 대답해도 절반만 맞고, 그렇지 않다고 대답해도 절반만 맞다.

 

일단  segfault의 정확한 정의를 정리할 필요가 있다.

segfault는 segmentation fault의 준말로 잘못된 메모리 영역을 건드렸을 경우에 발생한다. 그렇다면 segmentation이란 무엇일까? 프로세스는 크게 데이터, 힙, 스택, 코드의 4가지 영역으로 나뉘는데 이 4가지 영역으로 나뉜 모양 자체를 segmentation이라고 하고(좀더 정확히는 권한에 관련되어 있다) 각각의 영역을 segment라고 부른다. segfault는 예를 들어 stack 영역에 있는 변수나 객체가 적절한 권한 없이 heap, data, code 등 다른 영역을 침범하려 할 때 발생하는 에러가 segfault라고 할 수 있다.

 

그렇다면 왜 어떨 때는 발생하고 어떨 때는 발생하지 않는 것일까?

위 코드에서 stack 안에 선언된 배열의 끝이 stack의 경계선에 걸친다면 그 다음 메모리 주소를 참조하기 위해서는 영역을 넘어가야 하고, 이때 segfault가 발생한다. 하지만 stack 안에 선언된 배열 끝 다음에 충분한 여유 공간이 있다면 다른 메모리 영역을 침범하지 않을 테고 잘못된 메모리 접근이기는 해도 segfault가 발생하지는 않는다.

 

그렇기 때문에 메모리 영역을 잘못 사용한다고 해도 그 잘못 사용한 영역이 특정 segment를 벗어나냐 벗어나지 않느냐에 따라서 segfault 발생 여부가 갈린다고 볼 수 있다.

반응형