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 발생 여부가 갈린다고 볼 수 있다.
'CS' 카테고리의 다른 글
[객체지향]다형성은 어떻게 코드로 구현되는가? (0) | 2025.07.09 |
---|---|
[객체지향]조합, 위임이 상속을 대체하는가? (0) | 2025.06.06 |
형변환이란? (0) | 2025.05.28 |
운영체제 기본 3 - CPU는 어떻게 컴퓨터를 제어하는가 (0) | 2023.07.08 |
가상화에 대하여 (0) | 2023.06.29 |