정수 오버플로우에서의 동작

정수 오버플로우에서의 동작 (Behavior on integer overflow)

정수 오버플로우가 일어났을 때 gfortran이 어떤 동작을 보이는지, 그리고 오래된 코드가 예상 밖의 결과를 낼 때 어떻게 다뤄야 하는지 설명해요.

출처: Behavior on integer overflow

본문

포트란 표준은 정수 오버플로우를 금지해요. 그런데 gfortran은 기본적으로 정수 오버플로우 상황에서 **정의되지 않은 동작(undefined behavior)**을 보여요.

오래된 프로그램, 예를 들어 특정한 비표준 동작에 기대는 선형 합동 의사난수 생성기 같은 전통적인 코드는 예상 밖의 결과를 만들어낼 수 있어요. 이런 코드를 런타임에 잡아내려면 -fsanitize=undefined 옵션을 쓸 수 있어요.

난수 생성기가 필요하다면 내장 서브루틴 **RANDOM_NUMBER**를 쓰는 것을 권장해요. 만약 옛 동작을 그대로 유지하고 싶다면 -fwrapv 옵션을 쓰면 되는데, 이 옵션은 성능에 영향을 줄 수 있다는 점을 알아두세요.

요약하면 이래요. 기본적으로는 오버플로우 결과가 정의되어 있지 않으니, 특정 결과에 의존하는 코드는 피하고 RANDOM_NUMBER 같은 표준 도구를 쓰는 게 안전해요. 그리고 꼭 옛 방식의 순환 동작이 필요하다면 -fwrapv로 그 동작을 명시적으로 만들 수 있어요.

-fsanitize=undefined는 컴파일·링크 단계에 함께 넣어줘야 런타임 검사가 붙어요. 예를 들어 gfortran -fsanitize=undefined myprog.f90 -o myprog처럼 쓰면, 실행 중 오버플로우 같은 정의되지 않은 동작이 일어나는 지점에서 메시지를 내보내요. 다만 검사 자체에도 비용이 들기 때문에, 성능이 중요한 프로덕션 빌드보다는 개발·디버깅 단계에서 쓰는 편이 자연스러워요.

더 알아보기

  • RANDOM_NUMBER 내장 서브루틴
  • -fsanitize=undefined 옵션
  • -fwrapv 옵션과 순환 산술