programing

가장 짧은 C 프로그램은 여전히 segfault를 유발합니다.

newsource 2023. 11. 6. 21:52

가장 짧은 C 프로그램은 여전히 segfault를 유발합니다.

잠시 동안 저는 아마도 저의 첫번째 C 버그가 없는 프로그램을 쓴 것이 매우 자랑스러웠습니다.전체 소스 코드는 다음과 같습니다.

int main;

그것은 그것이 없어도 완벽하게 컴파일합니다.int, 그러나 경고가 발령됩니다(없는 경우에도).-Wall) 그리고 버그가 없는 프로그램을 목표로 하는 프로그래머로서 오류로 취급합니다.

이 애플리케이션을 즐겁게 작성한 후, 저는 바로 그것을 출시하기 위해 달려갔습니다.놀랍게도 세그멘테이션 오류가 나타났어요...


이제 진짜.정확히 무슨 일이 일어나고 있는 거지?

제 추측으로는 다음과 같습니다. 부족한 부분입니다.main의 정의.이건 너무 뻔한데도 컴파일러가 허락해주잖아요main다른 단위로 정의될 수 있습니다.하지만 링커조차도 그것에 대해 아무것도 하지 않습니다.특별한 이유라도?

단어를main는 모든 변수의 법적 이름입니다.대표적인 사용 사례는 이름의 기능을 제공하는 것입니다.main컴파일러로, 컴파일러는 그것을 오브젝트 파일로 컴파일하고, 그것은 차례로 와 연결됩니다.crt0.o실행 시간(스택 할당 등)에 대한 초기화를 제공하고 레이블로 이동합니다.main.

C 개체 파일에서 기호는 프로토타입과 연관되지 않으며 링커는 전역 변수를 연결하는 데 성공합니다.int main;가장 중요한 프로그램으로.하지만 이 프로그램은 쓰레기입니다.아마도 0으로 초기화될 가능성이 높지만, 곧 프로세서는 할당된 데이터 공간(스택 + 힙) 외부의 메모리에 접근하는 임의의 명령어를 만나게 되거나 명령어 흐름이 예약된 코드 공간의 한계에 도달하게 됩니다.

둘 다 분할 오류를 발생시킵니다.실제로 시스템이 eXecution 플래그가 있는 아키텍처에서 실행되는 경우, 실행 권한 없이 데이터 세그먼트나 페이지로 이동하려는 첫 번째 시도에서 프로그램 segf에 장애가 발생합니다.

코멘트에서 토론을 지원하기 위한 추가 읽기: Data Execute Prevention, NX_bit

언급URL : https://stackoverflow.com/questions/15333215/the-shortest-c-program-still-causes-segfault