pulse.huny.dev
HunyDev
Safe Integer Arithmetic in C: The Right Way to Prevent Overflows

Safe Integer Arithmetic in C: The Right Way to Prevent Overflows

C/C++ 정수 오버플로 안전 처리법

Hun Jang
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 + 1
    • INT64_MAX + 0, INT64_MAX + 1, INT64_MIN - 1
  • Fuzz(무작위) + 정답 생성기(128비트 임시 빌드 혹은 내장 big-int)로 교차 검증하면 금상첨화.

5) 왜 직접 체크보다 좋은가?

  • a > MAX - b 같은 수동 체크는 서명/무부호 혼합, 승격 규칙, UB 때문에 실수 잦다.
  • 빌트인은 정확한 코드 생성(carry 플래그 등)과 최적화 상호작용이 뛰어남.

You might also like

BlogPro logo
Made with BlogPro

Tags