14.04에서는 분할 오류가 발생했지만 10.04에서는 실패하지 않았습니다.

14.04에서는 분할 오류가 발생했지만 10.04에서는 실패하지 않았습니다.

저는 우분투 14.04 64비트 LTS를 사용하고 있으며 C로 이미지 처리 프로그램을 작성하고 있습니다. 터미널에서 프로그램을 실행하면 분할 오류(코어 덤프)가 표시됩니다.
동일한 프로그램이 10.04에서도 잘 실행됩니다.

도움 좀 주세요?

$ cc -o out.e sub.c -lm
$ ./out.e
Segmentation fault (core dumped)

답변1

실제로 무슨 일이 일어났는지 자세히 말하기는 어렵지만, 문제의 종류에 대한 예를 들어보겠습니다.

중요한 것은 프로그램이 10.04에서는 작동했지만 14.0에서는 실패했다는 것입니다. 정확한 문제는 다를 수 있지만 유사하고 관련되어 있습니다.

뭔가 규칙에 어긋나네요

"세그먼트 오류" 오류는 일반적으로 프로그램에 속하지 않는 일부 메모리에 액세스했음을 의미합니다. 10.04와 14.04 모두에서 이러한 불법적인 메모리 접근이 있었을 수도 있는데, 10.04에서는 아무런 문제가 발생하지 않았습니다.

규칙은 엄격하게 시행되지 않습니다.

이는 10.04에서 우연히 작동했다는 의미입니다. 여러 가지 이유로 프로그램의 "공식" 메모리 근처에 있는 메모리도 기술적으로 프로그램에 속할 수 있기 때문에 이는 상당히 가능합니다.
이는 컴파일러의 생각을 더 쉽게 만들거나 보다 정기적인 메모리 액세스를 통해 프로그램을 더 빠르게 만드는 것입니다.
이를 통해 프로그램은 프로그램 텍스트에 따라 수행이 허용되지 않는 작업을 수행하도록 허용될 수 있습니다.

공차는 변경될 수 있습니다.

분할 오류 없이 액세스할 수 있는 "비공식" 메모리는 컴파일러 버전과 라이브러리 버전에 따라 달라집니다. 둘 다 변경되었습니다.

가장 간단하고 일반적인 경우는 인덱스의 일대일 오류로 배열 뒤의 바이트에 액세스하는 것과 같이 메모리 액세스가 멀리 떨어진 프로그램에 버그가 있는 경우입니다.

요약

버그는 이전에도 존재했지만 어쨌든 작동했습니다.
이제는 작동하지 않으며 분할 오류를 일으키는 일반적인 버그일 뿐입니다.

긍정적인 측면: 버그와 함께 작동했을 때 잘못된 결과가 생성되었을 수 있습니다. 이는 지금 보고 있는 충돌보다 훨씬 더 나쁩니다.


규칙을 시행하세요

이런 종류의 문제를 디버그하는 좋은 접근 방식은 일반 런타임 시스템에서 시행하지 않는 규칙을 시행하도록 프로그램을 계측하는 것입니다.
메모리 액세스 문제를 찾을 때 이를 수행하는 한 가지 도구는 다음과 같습니다.발그린드(man valgrind).

관련 정보