불법 행위로 인해 프로그램을 종료하지 마십시오

불법 행위로 인해 프로그램을 종료하지 마십시오

해제된 주소를 사용하려고 하는 프로그램이 있습니다. 이렇게 하면 충돌이 발생합니다. 제 생각에는 리눅스가 잘못된 동작으로 인해 프로그램을 종료하기 때문에 이런 일이 발생한다고 생각합니다. 해제된 메모리에 액세스하면 경고 메시지가 표시되고 프로그램 실행이 계속되는 편안한 환경에서 프로그램을 실행할 수 있는 방법이 있습니까?

답변1

프로세스는 1970년대부터 UNIX 커널에 존재했던 "신호"라는 기능에 의해 종료됩니다. 불법적인 메모리에 접근하기 위해 프로세스가 수신한 신호는 SIGSEGV(Segmentation Violation)이다.

대부분의 신호는 종료를 유발하지만 프로그램은 특정 유형의 신호를 무시하거나 신호가 전달될 때 신호 처리 루틴을 실행하도록 선택할 수 있습니다. 모든 신호를 무시하거나 처리할 수는 없지만 SIGSEGV는 가능합니다.

이것은 매뉴얼 페이지에 문서화되어 있습니다신호(2)그리고신호(7). 그러나 질문에 C++로 태그를 지정했습니다. 아마도 C++에는 signal이를 수행하기 위한 자체 시스템 호출 기반 메커니즘이 있습니다.

이 글을 쓴 후 Stackoverflow에서 SIGSEGV를 캡처하는 C++ 프로그램을 발견했습니다.https://stackoverflow.com/a/918891/3548109.

답변2

매핑되지 않은 메모리에 대한 액세스는 응용 프로그램의 잘못된 동작으로 간주되므로 이를 종료하는 것이 절대적으로 옳습니다.

다른 프로그램이 메모리에 접근한다고 상상해 보세요당신의반면에 프로그램은...

그러나 MMU 지원 없이 컴파일된 작은 Linux를 사용해 볼 수 있습니다(단일 사용자 시스템에서만). 이러한 시스템은 악의적인 메모리 액세스를 허용합니다.

관련 정보