Search
Duplicate
⚠️

Bus error vs Segmentation fault?

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
CS
Scrap
태그
오류
9 more properties

두 개 모두 잘못된 메모리 주소에 대한 접근이다

그러나 오류가 나는 원인이 다르다

1) Segmentation fault

Segmentation (분할)은 OS에서 메모리를 사용하는 방식을 의미한다. c코드를 실행하면 일정부분의 메모리를 차지하게 되는데 그 부분이 RAM(혹은 가상메모리가 될 수 있다)에 존재하는 하나의 segmemt가 되는 것이다.
OS에 따라서 segmentation, page 등 메모리에 대한 정책이 다르다. (혹은 두 개 모두 사용할 수 도 있다)
Segmemtation fault는 메모리에서 접근하면 안되는 부분에 접근했을 때 발생하는 오류다.
예를들어
1.
읽기전용으로 정해져있는 메모리 부분을 수정하려 하는 경우
2.
자신의 프로그램이 아닌 다른 프로그램 소유의 메모리에 접근하는 경우
3.
NULL에 접근하려는 경우
가 있으며 이 경우 OS에서 오류를 출력한다. (POSIX계열에선 SIGSEGV신호를 보낸다)

2) Bus error

Bus (버스)는 컴퓨터의 부품 사이에 데이터가 통신되는 통로를 일컫는다.
Bus error는 메모리주소가 유효하지 않을 경우(메모리 주소가 물리적으로 존재하지 않거나 1바이트 단위로 보는 메모리를 4바이트 단위로 접근했을 때) 발생하는 오류다. 또는 하드웨어에 문제가 생긴 경우도 있다. Bus error는 하드웨어에서 OS로 error신호를 보내며 POSIX계열에서는 SIGBUS신호를 보낸다.
char buf[10]; *(int *)(buf) = 1;
C
복사
위의 코드는 char단위로 할당된 메모리에 int형 데이터를 할당하는 코드다. 즉 1바이트로 나누어진 메모리에 그보다 큰 자료를 할당하려 한 경우다. 이를 비정렬 메모리 접근이라 한다. 다만 위의 경우는 cpu의 종류에 따라 오류를 전달할 수도 있고 전달하지 않을 수도 있다. (Intel CPU의 경우는 오류를 출력하지 않는다)