>백엔드 개발 >C++ >이 C 코드가 최적화가 활성화된 GCC에서 무한 루프를 생성하는 이유는 무엇입니까?

이 C 코드가 최적화가 활성화된 GCC에서 무한 루프를 생성하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-05 04:47:13790검색

Why Does This C   Code Produce an Infinite Loop on GCC with Optimizations Enabled?

x86의 정수 오버플로: 무한 루프 수수께끼 풀기

GCC를 사용하여 컴파일할 때 불가사의하게 무한 루프에 빠지는 다음 코드 조각을 고려해보세요. :

int i = 0x10000000;
do {
    i += i;
    cout << i << endl;
} while (i > 0);

미스터리 풀림

정수 오버플로는 일반적으로 정의되지 않은 동작이지만 x86 아키텍처의 정수 산술 명령어는 일반적으로 오버플로가 발생하면 래핑됩니다. 그러나 이 경우 GCC의 최적화는 예외를 발생시킵니다.

최적화의 오해

최적화를 활성화하면 GCC는 정수 오버플로가 불가능하다고 가정하고 루프 종료 조건 확인을 제거합니다. 결과적으로 정수 i가 음수 값으로 바뀌면 루프가 끝없이 계속됩니다.

Visual Studio의 올바른 처리

반면에 Visual Studio는 정수 오버플로를 올바르게 처리하고 의도한 대로 루프를 종료합니다.

정의되지 않음 확인 행동

이 기괴한 행동은 정의되지 않은 행동의 예측 불가능성을 강조합니다. x86에서는 정수 순환이 예상되지만 정의되지 않은 동작이 예상치 못한 방식으로 나타나 컴파일러의 예측을 좌절시킬 수 있습니다.

해결 방법

  • 최적화 비활성화(-O0) 명시적인 오버플로 검사를 시행합니다.
  • 잘 정의된 오버플로를 활성화하려면 -fwrapv 플래그를 사용하세요. 의미론. 그러나 잠재적인 성능 저하에 주의하십시오.

결론

정의되지 않은 동작이 있을 때 루프 종료 조건을 최적화하기 위한 GCC의 선택은 당황스러운 결과를 초래합니다. 무한 루프. 이는 정의되지 않은 동작 규칙을 위반할 경우 예측할 수 없는 결과가 발생할 수 있음을 상기시켜 주는 역할을 하며 x86 플랫폼에서 정수 산술 작업을 수행할 때 주의가 필요합니다.

위 내용은 이 C 코드가 최적화가 활성화된 GCC에서 무한 루프를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.