source

분할 오류와 스택 오버플로의 차이점은 무엇입니까?

manysource 2023. 7. 29. 08:37

분할 오류와 스택 오버플로의 차이점은 무엇입니까?

예를 들어, 재귀 함수를 호출하면 연속 호출이 스택에 저장됩니다.그러나 무한정 계속되는 경우 오류로 인해 오류는 '세그먼트화 결함'입니다(GCC에 표시됨).

'스택 오버플로'였어야 하지 않았나요?그렇다면 둘 사이의 기본적인 차이점은 무엇입니까?

하지만 위키백과 링크보다 설명이 더 도움이 될 것입니다(그 과정을 거쳤지만, 구체적인 질문에 대한 답변은 없음).

스택 오버플로가 [a] 원인이며 분할 결함이 결과입니다.


적어도 x86 및 ARM에서 "스택"은 함수 호출의 로컬 변수 및 반환 주소를 배치하기 위해 예약된 메모리입니다.스택이 모두 사용되면 예약 영역 외부의 메모리에 액세스합니다.그러나 앱이 커널에 이 메모리를 요청하지 않았기 때문에 메모리 보호를 위해 SegFault가 생성됩니다.

최신 프로세서는 프로세스를 서로 보호하기 위해 메모리 관리자를 사용합니다.x86 메모리 관리자에는 많은 레거시 기능이 있으며, 그 중 하나가 세분화입니다.분할은 프로그램이 특정한 방식으로 메모리를 조작하지 못하도록 하기 위한 것입니다.예를 들어, 한 세그먼트는 읽기 전용으로 표시되고 코드는 거기에 배치되는 반면, 다른 세그먼트는 읽기/쓰기로 데이터가 이동합니다.

스택 오버플로가 발생하는 동안 세그먼트 중 하나에 할당된 공간을 모두 소진한 다음 프로그램이 메모리 관리자가 허용하지 않는 세그먼트에 쓰기 시작하면 분할 오류가 발생합니다.

스택 오버플로는 명시적 스택 오버플로 예외(컴파일러 및 아키텍처에 따라 다름) 또는 세그먼트화 오류(즉, 잘못된 메모리 액세스)로 나타날 수 있습니다.궁극적으로 스택 오버플로는 스택 공간이 부족한 결과이며, 스택 공간이 부족할 경우 액세스해서는 안 되는 메모리를 읽거나 쓰는 것이 가능합니다.따라서 많은 아키텍처에서 스택 오버플로의 결과는 메모리 액세스 오류입니다.

콜 스택이 오버플로되고 있지만 오버플로의 결과로 콜 관련 값이 스택의 일부가 아닌 메모리로 푸시된 다음 -SIGSEGV!

언급URL : https://stackoverflow.com/questions/2685413/what-is-the-difference-between-a-segmentation-fault-and-a-stack-overflow