Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++에서 정수 오버플로를 감지하는 방법

C/C++에서 정수 오버플로를 다루는 데 있어 가장 안전한 방법은 오버플로가 발생하기 전에 미리 검사하는 것입니다. 하지만 이미 발생한 오버플로를 감지하는 몇 가지 트릭 같은 방법들도 존재합니다.

부호 없는 정수 덧셈에서의 오버플로 감지

부호 없는 정수(unsigned int)의 덧셈에서 오버플로를 감지하려면, 연산 결과가 피연산자 중 하나보다 작은지 확인하면 됩니다. 예를 들어 다음과 같습니다.

unsigned int x, y;
unsigned int value = x + y;
bool overflow = value < x; // "value < y"로 검사해도 동일하게 동작합니다

동작 원理

이 방법이 가능한 이유는 부호 없는 정수의 특성 때문입니다. xy가 모두 부호 없는 정수일 때, 두 값을 더한 결과가 오버플로를 일으켜 값이 반전(wrap around)되었다면, 그 결과값은 절대 xy보다 커질 수 없습니다. 값이 최대치를 넘어 처음으로 되돌아가려면 부호 없는 정수가 표현할 수 있는 최댓값보다 큰 수가 되어야 하기 때문입니다.

따라서 결과값이 피연산자 중 하나보다 작다면, 이는 오버플로가 발생했다는 확실한 신호입니다.

CPU 오버플로 플래그 활용

또 다른 방법은 CPU가 제공하는 오버플로 플래그(Overflow Flag)에 직접 접근하는 것입니다. 일부 컴파일러는 이 플래그에 접근할 수 있는 기능을 제공하여 이를 검사해볼 수 있지만, 이는 C/C++ 표준에 포함된 기능이 아니므로 이식성(portability) 측면에서 주의가 필요합니다.

참고: 안전한 코딩 습관

실무에서는 오버플로 자체를 감지하기보다, 연산 전에 x > UINT_MAX - y와 같은 조건으로 오버플로 가능 여부를 미리 확인하는 것이 권장됩니다. 또한 GCC나 Clang에서 제공하는 __builtin_add_overflow 같은 빌트인 함수를 사용하면 더욱 안전하고 명확하게 처리할 수 있습니다.