Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

영우

segmentation fault란 뭘까? 본문

CS

segmentation fault란 뭘까?

duddn 2024. 6. 12. 07:19

segmentation fault란 뭘까요?

segmentation fault(이하 segfault)는 메모리 보호를 갖춘 하드웨어(MMU)에 의해 발생하는 오류로, OS에 프로세스가 제한된 메모리 영역에 접근을 시도했음을 알리는것입니다.

운영체제는 segfault를 받으면 해당 프로세스에게 SIGSEGV 시그널를 보내 segfault가 발생했음을 알립니다.

제한된 메모리 영역에 접근을 시도한것은 어떤 경우인가요?

프로그램이 사용할 수 있는 주소공간 외부에 접근하려 하거나, 프로그램의 주소공간 중 읽기전용 segment에 쓰기를 시도하면 segfault 입니다.

paging으로 메모리를 관리하는 경우에도 segmentation fault 인가요?

네. paging으로 메모리를 관리하더라도 page fault가 발생시 segmentation fault가 발생할 수 있습니다. 특히 페이지 폴트 중 유효하지 않은 페이지에 잘못된 접근을 하는경우 segmentation fault와 마찬가지로 SIGSEGV 시그널을 받게 됩니다.

page fault임에도 segfault를 받는 이유는 불법적인 메모리 접근이라는 개념을 segfault가 가장 잘 표현하기 때문입니다. segfault라는 단어에 프로세스가 접근할 수 없는 segment를 접근했다는 의미가 잘 담겨있습니다.

구체적으로 어떤 상황에 segmentation fault를 받게 되나요?

  • 널 포인터에 역참조하는경우
    • 역참조(dereference)란 주소로 값을 접근하는 행위를 의미합니다.
int* ptr = (int*) 0x00000000;
*ptr = 1;
  • 읽기전용 메모리에 쓰기를 시도하는 경우
    • MAC 기준으로 bus error가 발생합니다. bus error는 메모리 버스가 데이터를 주고받을 때 발생하는 하드웨어 수준의 오류입니다.
    • 일부 시스템에서는 segfault 입니다.
const char *s = "hello world";
*s = 'H';
  • 버퍼 오버플로우
    • 메모리가 다른 중요한 영역을 침범하는 경우 segfault가 일어납니다.
char s[] = "hello world";
char c = s[200000];
  • 스택 오버플로우
    • 스택이 메모리의 다른 영역을 침범하기 때문에 segfault가 일어납니다.
int main(void)
{
    return main();
}

segmentation fault를 프로그램이 따로 처리할 수 있나요?

  • 시그널을 따로 처리하지 않으면 프로세스는 즉시 종료됩니다. 그러나 시그널핸들러를 정의해 프로그램의 커스텀 동작을 정의할 수 있습니다.
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void signal_handler(int signal) {
  if (signal == SIGSEGV) {
    printf("Caught segmentation fault!\n");
    exit(1);
  }

  if (signal == SIGBUS) {
    printf("Caught bus error!\n");
    exit(1);
  }
}

int main() {
  signal(SIGSEGV, signal_handler);
  signal(SIGBUS, signal_handler);

  char *s = "hello world";
  *s = 'H';

  int *ptr = NULL;
  *ptr = 0;

  return 0;
}

출처

'CS' 카테고리의 다른 글

도커는 뭘까?  (0) 2024.06.28
함수형 프로그래밍은 왜 레이스 컨디션이 발생하지 않을까?  (0) 2024.06.04
프레임워크와 라이브러리  (2) 2023.11.20