Safe Integer Arithmetic in C: The Right Way to Prevent Overflows
C/C++ 정수 오버플로 안전 처리법
Hun Jang Dec 10, 2025
정수 오버플로우를 “직접 계산”으로 잡으려고 애쓰기보다, 컴파일러/플랫폼이 주는 안전 산술 API를 쓰는 게 깔끔하고 이식성도 좋다. 아래만 알면 실무 대부분이 끝난다.
1) GCC/Clang (glibc, musl, Android NDK 등)
- 내장 함수(builtin): 오버플로우 감지 + 결과 저장까지 한 번에 처리
- 가산:
__builtin_{u,s}add[overflow] - 감산:
__builtin_{u,s}sub_overflow - 곱셈:
__builtin_{u,s}mul_overflow - 반환값: 오버플로우 발생 여부(true=overflow). 안전하고 최적화 친화적.
주의
signed연산에서 UB(정의되지 않은 동작)를 직접 건드리지 말고, 꼭 위 빌트인을 사용.
- C++에선
<limits>와 함께std::overflow_error를 섞는 스타일도 있으나, 핫패스는 위 빌트인이 더 빠르다.
2) MSVC/Windows
- intsafe.h의 안전 산술(권장, WinSDK 기본 제공)
UInt64Add,Int64Add,SizeTAdd,ULongLongMult등 타입별 API 다양.
- x64 전용 carry intrinsics (더 저수준, 가독성↓)
- ARM 타깃에선 동일한 이름이 없을 수 있어 이식성 떨어짐 → 일반적으론
intsafe.h추천.
3) 공통 래퍼 예시 (크로스 플랫폼)
- 이 패턴으로
sub/mul,signed/unsigned전부 확장 가능.
- 헤더 하나로 GCC/Clang/MSVC 커버하면서 JIT/최적화 이점 유지.
4) 테스트 팁
- 경계값(fence)만 잘 잡아도 충분히 신뢰도 확보:
0 + 0,UINT64_MAX + 0,UINT64_MAX + 1INT64_MAX + 0,INT64_MAX + 1,INT64_MIN - 1등
- Fuzz(무작위) + 정답 생성기(128비트 임시 빌드 혹은 내장 big-int)로 교차 검증하면 금상첨화.
5) 왜 직접 체크보다 좋은가?
a > MAX - b같은 수동 체크는 서명/무부호 혼합, 승격 규칙, UB 때문에 실수 잦다.
- 빌트인은 정확한 코드 생성(carry 플래그 등)과 최적화 상호작용이 뛰어남.