귀여운 오버플로우 버그는 왜 일어날까
코딩애플 (Computer Science)|조회 1|2026.06.09 10:30
0:00 / 5:22
귀여운 오버플로우 버그는 왜 일어날까
5:22💥 컴퓨터의 숫자 한계로 생기는 '오버플로우(Overflow)' 버그
1. 오버플로우 버그의 실제 사례들
- 쿠키런: 코인을 21억 넘게 모으면 갑자기 마이너스(-)가 되어 빚쟁이가 됨.
- 마비노기: 고가 아이템의 구매 개수를 1,000개 이상으로 늘리면 계산 과정에서 오버플로우가 발생해 지불 액수가 줄어들고 골드가 복사됨.
- 프리코네: 캐릭터(코코로)의 힐량이 21억을 넘어가면 아군에게 힐이 아닌 '딜(데미지)'을 넣음.
- 오버워치: 경쟁전 점수를 계속 떨어뜨려 1 밑으로 내리면 갑자기 최대 점수인 5,000점으로 변함.
- 페이팔: 한 사용자의 계좌 잔고가 오버플로우로 인해 무려 9경 원($92 quadrillion)이라는 비현실적인 숫자로 표기됨.
- 카지노 슬롯머신: 최대 당첨금이 6,000달러인 기계에서 버그로 인해 4,000만 달러가 당첨되었다고 표기되어 지급 거절 소송이 일어남.
2. 오버플로우가 발생하는 원인
메모리의 한계
- 컴퓨터는 숫자를 저장할 때 메모리(RAM)에 공간을 할당하고 이진수(0과 1) 로 변환하여 저장합니다.
- 이때 다른 데이터와 겹치지 않도록 "어떤 주소에 몇 칸(몇 비트)을 쓸지" 최대 길이를 미리 정해놓아야 합니다.
- 예: 8칸(8비트) 공간을 쓰면 모든 칸을 1로 채웠을 때 이진수
11111111이 되며, 이는 십진수로 최대 255까지만 저장할 수 있음을 의미합니다.
숫자가 넘쳐흐르는 과정
- 8칸 공간에
255(11111111)가 꽉 차 있는 상태에서1을 더하면, 이진수 연산 법칙에 따라 왼쪽에 한 칸이 더 생기며100000000이 되어야 합니다. - 하지만 컴퓨터가 쓸 수 있는 공간은 딱 8칸으로 고정 되어 있으므로, 맨 왼쪽의
1은 버려지고 나머지00000000만 남게 됩니다. - 결과적으로 255에 1을 더했는데 갑자기 숫자 0이 되어버리는 현상 이 발생하며, 이를 오버플로우 라고 부릅니다.
3. 왜 양수가 갑자기 음수(-)로 바뀔까?
- 컴퓨터에서 음수(Minus)를 표현할 때는 맨 왼쪽의 첫 번째 칸을 부호 비트(Sign bit) 로 사용합니다. (
0은 양수,1은 음수) - 이를 부호가 있는 정수, 즉 사인드 인티저(Signed Integer) 라고 합니다.
- 8칸 중 첫 칸을 부호로 쓰면 나머지 7칸만 숫자를 표현하는 데 쓰이므로, 표현 범위가 -128 ~ +127 이 됩니다.
- 이때 최댓값인
+127 (01111111)상태에서1을 더하면, 이진수 연산 결과 맨 앞자리가 1로 바뀌면서10000000이 됩니다. - 컴퓨터는 맨 앞자리
1을 보고 음수로 인식하므로, 숫자가 계속 커지다가 한계를 넘는 순간 갑자기 최솟값인-128로 변해버리는 것 입니다. (게임에서 21억 코인이 갑자기 마이너스가 되는 이유도 32비트형 데이터의 한계치인 2,147,483,647을 넘었기 때문입니다.)
4. 해결책 및 예방 방법
- 안전한 라이브러리 사용: 실무에서는 오버플로우 발생 시 조용히 넘어가 버그를 키우는 경우가 많으므로, 오버플로우 탐지 시 강제로 에러를 내주는 안전한 연산 라이브러리를 활용해 예외 처리를 합니다.
- 언어 자체의 기능 활용: 파이썬(Python) 같은 하이레벨 언어들은 숫자가 커지면 자동으로 메모리 저장 영역을 확장해 주기 때문에 정수 오버플로우 걱정 없이 편하게 코딩할 수 있습니다.
- 데이터 구조 점검: 서비스가 오래되어 게임 내 재화 인플레이션 등이 발생할 수 있다면, 숫자를 담는 데이터 타입을 더 큰 것(예: 32비트 ➡️ 64비트)으로 변경해 주어야 합니다.