동음이의어에 대한 내용은 오버플로(동음이의어) 문서 참고하십시오.
1. 개요
Overflowxkcd 571화 'Can't Sleep'[1] | |
기계식( 아날로그) 체중계가 측정 범위를 넘어 버린 모습.[2] |
네이버 날씨에서
모종의 오류로 오버플로가 발생한 상황.[3] - |
컴퓨터의 정수 연산의 계산 결과가 허용 범위를 초과할 때 발생하는 오류.[4]
2. 원인
자세한 내용은 컴퓨터에서의 수 표현 문서 참고하십시오.컴퓨터의 메모리가 8비트의 데이터를 저장할 수 있다고 하고 편의상 부호는 없는 양수인 경우만 고려해 보자. 가장 작은 값은 0000 0000 (=0) 이며, 1씩 증가시키면 0000 0001(=1)을 거쳐 최댓값인 1111 1111 (=255)에 도달하게 된다. 여기에서 1을 다시 한 번 더하게 되면 최댓값의 범위를 넘어서게 되고 최솟값인 0000 0000(=0)으로 되돌아가게 된다. 이를 오버플로라고 부른다.
이는 2의 보수를 사용하는 부호형 정수 방식(signed integer)에서도 동일하며 8비트 정수형은 -128 ~ 127 사이의 값을 저장할 수 있다. 그런데, 0111 1111(=127)에서 1을 더하게 되면 1000 0000인데 이는 -128이 된다. 이 역시 최댓값의 범위를 넘어서서 가장 작은 값으로 바뀌는 것이다.
32비트 부호형 정수형이라면 -2147483648 ~ 2147483647이며 이 경우에도 2147483647 + 1은 허용범위를 초과하므로 최솟값인 -2147483648가 된다. 반대로 정수의 최솟값에서 1을 뺄 경우에는 최댓값이 되어 버린다. 즉ㅡ=, -2147483648 - 1 = 2147483647이 된다. 일부 사람들이 이를 언더플로라고 부르지만 잘못된 표현이며 이 경우도 오버플로라고 부르는게 맞다. 양이건 음이건 범위를 벗어나면 모두 오버플로이다. 산술 언더플로(Arithmetic underflow)는 부동소수점 연산에서 지수부가 타입의 한계를 넘어 작아지면 0에 가까워지다가 결국 0이 되어버리는 현상을 의미한다. 하지만, 정수 자료형에서 최댓값에서 최솟값으로 넘어가는 오버플로와 구분하기 위해 언더플로라는 용어를 혼용해서 사용하고 있는데 명확하게 하기 위해서는 '정수 언더플로'(Integer underflow)라는 용어를 사용해 산술 언더플로와 다르다는 것을 명시하는 것이 좋다.
오버플로의 가장 많은 예로 스택 오버플로( Stack Overflow)가 있다. 함수는 변수 등을 저장하기 위해 스택이라는 메모리 공간을 만드는데 이 함수가 재귀적으로 계속 실행되면 스택이 점점 생겨난다. 이러면 어느 순간 메모리가 모자라는 순간이 찾아오는데 이때 생기는 오류다. 프로그래밍 언어를 만들 때 스택 오버플로가 잘 일어나지 않도록 하는 것도 일이다. 응용형으로 버퍼 오버플로(Buffer overflow)가 있다. 할당된 범위의 메모리를 벗어난 주소로 접근하게 되는 것으로, 하트블리드 사태도 버퍼 오버플로로 인해 벌어진 것이다.
컴퓨터 또는 프로그래밍 언어의 동작에 따라 오버플로 발생 시 오류 메시지를 출력하는 경우도 있고[5] 그러지 않는 경우도 있다. 이 중 오류 메시지를 출력하지 않는 경우가 더 위험하다. 잘못된 정보로 명령을 계속 수행하므로 잘못된 값을 출력하거나 오류 메시지를 출력하는 곳과 오버플로가 일어난 곳이 다른 일이 일어날 수 있다. 일부 프로그래밍 언어는 오버플로가 일어나지 않도록 언어 자체적으로 보완책을 가지는 경우도 존재한다.
3. 분류
3.1. 10진수 오버플로
10진수 기반 시스템에서 발생하는 오버플로다.최대 9999까지 표현 가능한 기기에서 9999에 1을 더할 때 발생하는 10진수 오버플로. 이 현상은 일상에서도 흔히 볼 수 있다.
초창기의 컴퓨터는 BCD(Binary Coded Decimal) 나 EBCDIC(Extended Binary Coded Decimal Interchange Code)이라 불리는 10진수 기반의 수체계를 사용했으며 이 당시 사용하던 코볼(COBOL) 같은 컴퓨터 언어도 이런 수체계 기반을 사용하도록 만들어져 있었다. 그래서 99나 999를 넘어가면 100이나 1000이 되는 것이 아니라 0이 되어 버리는 버그가 존재했다.
이로 인해서 가장 문제가 되었던 것이 바로 2000년 문제이다. 년도를 저장할 때 저장공간 압축을 위해 4자리가 아니라 2자리의 십진수 정수형을 사용하다 보니 (19)99년 다음에 올 (20)00년을 (19)00년으로 인식하지 않을까 하는 문제가 대두된 것이다.[7] 덕분에 전 세계 프로그래머들은 1999년 말에 엄청나게 갈려나갔다고 한다.
3.2. 8비트 오버플로
8비트 정수의 저장 범위는 최상위 비트를 음수 부호로 사용하는(signed) 경우 -128 ~ 127이고 음수 부호를 사용하지 않는(unsigned) 경우 0 ~ 255이다. 255나 127을 넘어갈 경우 오버플로가 발생한다.- 스타크래프트: 본래 유닛의 공격력과 방어력은 3까지만 업그레이드가 가능하지만 맵 에디터를 이용하면 255까지 업그레이드가 가능한 유즈맵을 만들 수 있는데 이 유즈맵에서 저그 지상군 방어력을 255까지 업그레이드 완료한 상태에서 울트라리스크 방어력 추가 업그레이드를 하면 오버플로가 일어나 방어력이 1로 떨어진다. 관련 문서에서 언급한 EUD도 오버플로우로 인한 임의 코드 실행 구멍에 그 기반이 있으나 결은 다르다.
- 슈퍼 마리오브라더스: 3-1의 마지막 계단에 있는 엉금엉금을 계속 밟아 남은 마리오의 수를 계속 늘릴 수 있는 기술이 있지만 이 게임에서의 최대 남은 마리오의 수는 127이다. 그런데 최대 남은 마리오의 수를 달성한 후 더 이상 올라가지 않게 막도록 프로그래밍되어 있지 않아 이를 초과하면 오버플로로 남은 마리오의 수가 0으로 인식되어 버리기 때문에 이 상태에서 실수하면 그대로 게임 오버가 된다. 한 가지 더 있는데, 그 유명한 마이너스 월드. 1-2의 맨 마지막에 있는 지상으로 올라가는 토관 위에서 오른쪽에서 두 번째 블록을 부수고 왼쪽을 바라보고 웅크린 상태에서 점프하여 맨 오른쪽 블록에 닫아 마리오가 벽 안에서 오른쪽으로 서서히 움직이도록 만들자. 그 후 곧장 나오는 파이프로 들어가면 마이너스 월드에 들어가게 된다.[8]
- 파이어 엠블렘 창염의 궤적: 무기연성에서 원래 필살수치가 있는 무기의 필살치를 마이너스로 만들면 간디 버그마냥 필살률이 255가 되는 버그가 존재한다.
- 팩맨: 원래는 스테이지가 255까지 있도록 프로그래밍되었으나 오버플로로 스테이지 256이 생겨났다. 스테이지 256에 도달하면 이상한 문자들과 기호, 스프라이트들이 화면의 반을 메우고 다음 레벨로 진행할 수 없다.
- 풋볼 매니저: 선수의 한 시즌 득점이 255골을 넘어가면 기록이 0으로 초기화된다.
- 풍래의 시렌: 소지품/기탄 0인 상태에서 독초나 썩은 주먹밥 대미지로 자멸하면 스코어가 괴상하게 변하거나, 무기의 - 수치가 본래 무기의 수정치를 초과했을 경우 공격력이 255까지 변화하거나, 풀강한 장비에서 장비 자체의 수정치는 오버플로를 인식하지만 합성능력의 가격은 인식 못하여 팔았다 샀다 하는 것만으로 본전치기가 가능한 등 수치가 꼬이는 버그가 꽤 많이 존재한다. 본 게임에서 이런 류의 버그 중 가장 유명하며 일종의 비기로 인식되는 게 '무기나 방패의 수정치를 -1로 만든 후 그 장비에 도금을 하여 팔면 매우 비싼 값에 팔 수 있다'이며, 본래 수정치인 -1에 도금에 의한 +1이 합쳐지면 본래는 0으로 인식해야 하지만 오버플로로 인한 값인 +256으로 인식되는 버그이다.
- 모탈 컴뱃 2에서 250연승시 미니 게임으로 퐁이 들어간 이유는 정황상 연승표기가 255를 넘어갈 때 오버플로우가 발생하는 것을 방지하기 위한 목적도 있는 것으로 추정된다.
- 창세기전 2에 등장하는 용병 사키스키는 민첩(DEX)수치가 무려 253이라는 엄청난 값을 가지고 있다. 그런데 DEX를 더 올려 주는 아이템을 장착하면 256이 넘어가서 오버플로가 발생한다.
-
시드 마이어의 문명의 간디- 비폭력주의자의 상징인 간디는 이 게임에서 툭하면 플레이어에게 협박과 선전포고를 날리고 핵을 쏘는 Be폭력주의자로 변한 것이 오버플로 때문일 것이라는 추측이 강했으나 훗날 오버플로가 아니라 고의로 그랬음이 밝혀졌다. 1편에서 간디가 가진 여러 가지 성향은 호전적인 면을 증가시키는 효과도 있는데 이것이 간디에게 일괄 적용된 것을 재미있다고 생각해 컨셉화시켰다.
3.3. 16비트 오버플로
16비트 정수의 저장 범위는 -32768 ~ 32767(signed) 또는 0 ~ 65535(unsigned)이다. 65535나 32767을 넘어갈 경우 오버플로가 발생한다.- 리그 오브 레전드: 비에고가 암흑의 인장을 구매한 상태에서 적 챔피언을 지배 후 죽으면 인장의 스택이 -65534가 되는 버그가 있었다. 이때 인장 스택에 영향을 받는 주문력에도 32비트 오버플로가 덤으로 일어나서 -2147483647이 되었다. 현재는 패치되었다.
- 리니지(게임)도 예외는 아니어서, 플레이어의 성향은 - 32768(Chaotic) ~ 32767(Lawful)이다. 이 수치는 [short] 자료형의 최소~최대값이다. 이 16비트 숫자를 넘기면 오버플로우가 발생한다. 참고로 무기 인챈트의 한계가 +127이다.
- 마인크래프트 - give 명령어를 사용해 마법부여를 최대 32767까지만 올릴 수 있는 이유도 오버플로 때문이다. 32768 이상을 입력하게 되면 그대로 -32768이 되어 1보다 못하다.[예시] 현재는 해당 변수의 정수형을 교체해서 2147483647까지 마법부여가 가능하다. 하지만 1.17.1부터 최대레벨이 255로 바뀌었다. #
- 브롤스타즈: 공격력이 32768이 넘으면 1이 돼서 1렙 틱에게도 의미없는 데미지가 된다.[예시2] 체력이 65536을 넘어가면 게임이 튕긴다.
- 성검전설 3의 블랙 라비: 블랙라비의 HP가 65500인데 회복을 시켜주면 65535를 넘어서 오버플로가 발생한다.
- 슈퍼로봇대전 시리즈: 윙키 시절 슈퍼로봇대전은 16비트 오버플로 때문에 적 체력이 65000을 넘지 못했고 Z 시리즈 전까지는 최대로 낼 수 있는 대미지가 65535였다.
- 스타크래프트 시리즈: 스타크래프트의 방어력은 8비트로 저장하기 때문에 최대 255까지만 업그레이드가 가능하고 공격력은 65535까지 가능하다. 그래서 방어력이 255를 넘으면 1로 되돌아가고 공격력이 65535를 넘으면 표기 대미지가 65535 이상이라도 실제 공격력은 0부터 시작한다. 다만, 실제 데미지는 0.5가 들어간다. 엔진상으로 데미지연산은 이진법에서 끝자리가 1로 끝나는 홀수만을 사용하기 때문으로 추정된다. 오버플로를 이용해서 클리어하는 유즈맵(흑운장) 요즘은 EUD나 에디터의 발달 덕분에 유즈맵에서 오버플로를 경험할 일은 별로 없는 편이다. 스타크래프트 2에서도 게임 시간이 32,768초[11]를 넘기면 모든 세력이 패배하고 플레이어도 게임에서 강제로 퇴장당하게 된다.
- 파이널 판타지 7: 바레트 월리스와 빈센트 발렌타인의 최강 무기는 각각 장착 마테리아의 AP와 직접 처치한 적의 수에 비례해 제한 없이 위력이 강해지는데 바레트의 미싱 스코어에 대량의 AP를 보유한 마테리아를 8개 꽉 채우거나 빈센트로 65535마리 이상을 처치하면 공격력이 무한에 가까워져 최강 보스마저도 일격에 이길 수 있다. 자세한 것은 각 항목 참조.
- 폴아웃: 뉴 베가스: 전 재산이 32767캡 초과인 상태에서 모든 캡을 탑스 카지노 칩으로 바꾼 뒤 모두 버리면 탑스 카지노 칩의 갯수가 마이너스 단위로 나타나게 되는데 이때 탑스 카지노 칩을 줍고 카지노 칩을 캡 등 재화로 환전하면 무한으로 환전이 가능하다.[12] 이를 이용해 환전을 반복하여 전 재산을 몇백만 캡 단위로 불릴 수 있다.
- 카트라이더 러쉬플러스: S17 시즌에 시뮬레이션 모드 팀 릴레이 모드에서 65535점을 넘기면 점수가 초기화되는 현상이 생겼다. 현재는 해결되었다.
- 아리안 5 로켓: 첫 발사 당시 정상적으로 비행했으나 수평속도값이 16비트 정수를 초과하자 컴퓨터가 비정상 비행으로 판단하고 자폭시켜 버렸다.
3.4. 32비트 오버플로
32비트 정수의 저장 범위는 대략 -231 ~ 231-1(signed) 또는 0 ~ 232-1(unsigned)까지인데 이 값을 넘어갈 경우 오버플로가 발생한다. 이 값들을 풀어 쓰면 4294967295과 2147483647인데 관련 버그에서 흔히 등장하는 값이다. 다만 고정소수점 사용이나 최종 저장은 다른 데이터 형식을 쓰는 경우 214만 등의 변종이 나올 수 있다.- 강남스타일: 조회수가 2,147,483,647을 넘기자 조회수가 오버플로해 음수 단위로 떨어지는 척하는 이스터 에그를 만들었다. 물론 조회수를 저장하는 변수는 해당 시점 이전에 64비트로 갈았다. 자세한 내용은 강남스타일/인기 문서의 유튜브 특별 서비스 문단 참조.
- 메이플스토리: 옛날부터 메이플을 해 온 유저들은 2,147,483,647이라는 숫자가 익숙할 것이다. 바로 옛날 풀 메소 수치로, 이 숫자는 전술한 것처럼 32비트로 나타낼 수 있는 "부호가 있는 숫자" 중 최댓값이다. 보스 몬스터의 HP도 해당 수치를 넘길 수 없어 초창기 시그너스의 경우 억 단위의 체력 회복을 40번이나 했었다. 지금은 전부 상위 비트 변수로 교체해서 해당 문제는 사라졌다. 그러나 스우 이상의 보스 몬스터들부터는 클라이언트를 뒤져봐도 체력을 21억이나 0으로 표기하면서 실제 체력 자체를 숨기고 있다. 그 이유는 메이플스토리/보스 몬스터/체력 순위 문서 참조.
- 워크래프트 3: 해당 문서에는 없으나 영웅은 체력값이 본래 체력+힘×1당 체력 증가 수치이므로 유즈맵 등에서 아이템으로 힘이나 체력 감소로 체력이 0 미만이 되었을 경우 체력이 0으로 간주하고 사망하게 된다. 재부활하게 될 경우 체력이 정확히 0이라면 1/1으로, 0 미만이라면 1/4294967136으로 표시된다.
- 하스스톤: 공격력, 생명력 또는 방어도가 2147483647을 넘기면 오버플로 현상으로 인해 0이 되어 버린다.( #) 하지만 이러한 경우는 보통 이러한 상황을 위해 실험하면서 나타나므로 실제로 나타나는 경우는 극히 드물다.
- 마인크래프트: 경험치 레벨이 2147483647레벨을 넘으면 다시 0레벨이 되며 /xp 명령어로 줄 수 있는 경험치의 최대 양도 2147483647이다. 그리고 스코어보드의 최대 양수값도 2147483647까지이다. 이 이상을 넘어가면 -2147483648으로 바뀐다.
-
쿠키런:
핑크초코 쿠키에서 점수 폭주가 발생했고 21억에 도달하면 0으로 리셋되는 버그가 존재했다. 현재는 패치로 수정되었다.
그리고 48억을 낸 또 하나의 버그 쿠키가 나오고 말았다 - 쿠키런: 오븐브레이크: 32비트 운영체제 한정으로 떼탈출에서 21.4억을 넘기면 점수가 -21억이 되는 버그가 있었다. # 이후 패치로 32비트 운영체제에서 21.4억을 넘기면 점수가 표시되지 않게 바뀌었다. 64비트 운영체제는 21.4억을 뚫어도 정상적으로 점수 표시가 된다.
- 그란 투리스모 시리즈: 그란 투리스모 3에서 시애틀 서킷에서 토요타 GT-One 같은 다운포스가 큰 차를 타고 맵을 뚫고 가속하면 어느새 차가 들리면서 속도가 붙더니 21억 km/h[13] 혹은 21억 mph로 가속되며 높은 확률로 게임이 뻗어 버린다.
- 리니지이나 뮤 온라인, 라그하임 등의 2000년대 초반까지 제작된 온라인 게임 중에는 소지 가능한 화폐의 양을 32비트 정수로 해서 최대 20억 ~ 21억 정도까지만 소지되게끔 해 놓은 게임이 많았다. 그래서 이런 오버플로를 막기 위해 소지 가능한 액수를 아예 20억이나 21억으로 잡아두고 추가 소지를 못 하게 하면서 대체 화폐 아이템을 만들거나 시스템 자체를 갈아엎어서 21억 이상이 소지되게 변경한 경우가 많다.
- Egg, Inc.: 가격이 황금 계란 1000개 이상인 부스터를 사용할 때에는 진짜로 사용할 것인지 물어보는데 해당 부스터가 1개 있는 상태에서 Yes 버튼을 두 손가락으로[14] 터치하면 부스터가 두 번 사용되고 개수는 -1에서 부호 없는 32비트 정수형 최댓값인 4294967295로 오버플로된다.
- 카트라이더: 2021년 4월 15일 등급전에서 -2147483647점이 부여되어 0점이 되는 오버플로 현상이 발견되었다.
- 엘소드: 플레이어블 캐릭터인 이브의 전직 중 하나인 코드: 네메시스의 나소드 무기 강화 패시브 스킬은 커맨드 공격 시 일정 확률로 추가 피해를 주는데 일정 확률로 발동 시 적을 한방에 즉사시키기도 했는데 이 때 표기되는 데미지가 -2147483648다.
- 리그 오브 레전드- 비에고: 암흑의 인장 버그 버그를 이용하면 주문력이 -21억으로 표기되는 버그가 있었다.
- 헝그리 샤크 월드: 한 게임당 찍을수 있는 최대 점수의 한계가 최대 2,147,483,647점이며 이 점수를 넘게 되면 점수 획득량이 음수로 변경된다.
- 프린세스 커넥트! Re:Dive: 콧코로가 힐량이 21억을 넘기면서 오버플로가 발생 힐이 데미지가 되어 버리면서 파티가 전멸했다.
-
메탈기어 솔리드 V 더 팬텀 페인: 모든 게이머들이 핵무기를 만들지 않으면 나오는 히든 엔딩이 존재했는데 비매너 유저들이 해킹 프로그램을 이용해서 핵을 마구 찍어냈기 때문에
역시 핵을 벌려면 핵이지이 엔딩을 보는 건 요원한 일이었지만 황당하게도 게임내 핵무기의 총합이 오버플로우가 발생하면서 히든 엔딩이 나와 버렸다. # - 리그 오브 레전드/전략적 팀 전투: 시즌7 패치 이후 특정 상황에서 볼리베어의 체력이 -2147483648가 되는 버그가 발생했다.
- 테라리아: DPS 미터기의 최대 표싯값이 2147483647이다. 넘어갈 경우 음수로 표시된다. #
- 하츠 오브 아이언 4: 전쟁 도중 부족한 장비의 숫자가 너무 커지면[15] 오버플로우가 일어나서 되려 장비수가 2147483648개로 늘어나는 버그가 있는데 실제로도 장비가 채워지고 보급이 원활해진다. 공업력이 부족하고 인력이 넘쳐나는 중국 국가들이 멀티에서도 이런 버그성 플레이를 하기도 한다.
- CATS: 해커의 스킬인 추가주스를 부메랑이 발사된 후 사용하면 2147483647%가 뜨며 체력이 모두 채워진다.
- GTA 5: GTA 5 스토리모드에서는 $2147483647 이상으로 돈이 늘어나지 않는다.
- 지오메트리 대시: 플랫포머 맵에서 점수(points)가 2147483647을 초과하면 음수가 된다. 맵 이름 끝에 2147483647을 입력하고 복사하면[16] -2147483648이 되며 다시 복사하면 --2147483647가 되어 무한 오버플로가 발생한다.
- 1회 획득 가능 최대 한도는 32비트지만 최종적으로 쌓을 수 있는 한도는 훨씬 큰 경우. 우주전쟁 플래시 게임에선 2의 31제곱이지만 세금을 20억씩 얻다 보면 1000조를 넘겨서 1e+15로 표시된다. 정확한 것은 코드를 리버스 엔지니어링해야 알 수 있겠지만 이런 류의 플래시 게임에선 부동소수점을 많이 쓰기 때문에 대략적인 추측은 쉽다. 일례로 배정밀도(64비트 표준) 부동소수점이라면 10^303~304쯤에서 오버플로가 난다.
- 스텔라리스에서는 (2.5버전까지 기준으로) 주로 210만 정도를 초과할 때 오버플로가 발생하는데 고정 소수점 방식의 실수 구현 때문이다. signed 32비트의 한계인 2,147,483,647의 대략 1/1000인 것으로 봐서 32비트에 10비트 지점을 고정한 방식으로 보인다. 자세한 것은 모드 정보의 주의 사항 참고.
- 쿠키런에서도 2,147,483,647 코인을 넘기면 오버플로가 일어나 -21억 코인이 되는 현상이 있었다.[17] 현재는 패치로 21억 코인이 넘어도 정상적으로 코인을 사용할 수 있게 됐다.
3.5. 64비트 오버플로
[18]
64비트 오버플로도 존재하지만 signed int라도 9223372036854775807이라는 상당히 큰 수를 넘겨야 하기 때문에 어지간한 파워 인플레가 아닌 이상 발생하는 일은 거의 없다. 시간으로 오버플로가 발생하려면 2922억년을 기다려야 한다.
비교적 쉽게 볼 수 있는 사례로는 스텔라리스가 있다. 현재 64비트 고정소수점을 써서 184조쯤[19]에서 오버플로가 일어나는데 # 모딩이 활성화된 게임이라 소위 ( 파워 인플레) 뇌절 모드 여러개로 시너지를 일으키면 쉽게 넘길 수 있다. 해킹이나 치팅을 포함하면 더욱 쉬운데 숫자 놀음 아이들 플래시 게임은 배정밀도 부동소수점(64비트 표준 실수 표현형)을 많이 써서 해킹으로 10^302 정도로 올려도 정상 처리되고 심지어 한계(대략 10^303~304 정도)를 넘겨 오버플로가 나도 게임 진행은 정상적으로 되는 경우도 있다.[20]
3.6. 기타
여러 기기의 설정 가능한 최대 날짜를 넘겨서 오버플로를 실험해 보는 영상. 각종 OS, 전자기기, 프로그래밍 언어를 테스트했다.[21]
- 괴리성 밀리언아서: 암속성 헤브리디즈에서 유저들이 감전 데미지를 증폭해서 1800만 데미지를 넘겨 1데미지로 표기되는 오버플로 현상이 있었다. 후에 수정되어 더 이상 문제는 없다.
- 던전 앤 드래곤 섀도 오버 미스타라: 매직 유저가 마법의 대미지를 올려주는 최강의 지팡이 스태프 오브 위저드리를 착용한 상태에서 최강 마법 메테오 스웜을 사용하면 오버플로 현상이 발생해 평타 한 대만큼의 쥐꼬리만한 대미지가 들어간다.
- 오버워치: 경쟁전 시즌 2에서 1점에서 패배하면 0점이 아닌 가장 높은 5,000점이 되었다. 실제로 이런 유저가 등장했다.
- 메탈슬러그 디펜스: 오버플로로 인해 무한 메달 획득이 가능한 버그가 발생했다. 해당 문서 버그 문단 참조.
- 팝픈뮤직: BEMANI 시리즈에 속한 다른 기종에 비해 유독 오버플로 계열 버그가 많이 발생한다. MASS YOSHITAKA新曲이라든지, 팝픈뮤직 éclale의 호감도 버그라든지.
- 모두의마블: 봉인석 버그는 오버플로를 이용한 버그이다.
- Windows 10: 계산기로 절댓값이 e+9999를 초과하거나 e-9999보다 작아지면 오버플로라는 문자와 함께 한 번 더 계산하면 0으로 된다.
- Games Done Quick에서 슈퍼 마리오 월드를 TAS로써 즉석으로 해킹해(!) 해당 게임의 에셋으로 또다른 미니게임을 만드는 장면이 있는데(상세는 항목 참조) 오버플로가 일어날 수 있는 메모리상의 헛점을 발생시킨 뒤 이를 역이용한 것으로 보인다. 사실 이쪽은 임의 코드 실행에 가까운데 오버플로가 임의 코드 실행을 하게 만드는 구멍 중 하나로 작용하는 것일 뿐이다.
- GPS 신호 중 주(week)를 기록하는 부분은 8비트도 16비트도 아닌 10비트로 대략 1024주 = 19.7년마다 오버플로가 일어난다. 1999년과 2019년에 오버플로가 있었다. 다음은 2038년 12월에 발생할 것으로 예상된다. 공교롭게도 2038년에는 2038년 문제라는 다른 오버플로 문제가 존재한다.
- EUD - 스타크래프트의 유즈맵에 사용 가능한 트리거 중 'Set Deaths'에 입력값을 검증하는 루틴이 전혀 존재하지 않아 어떠한 값이던 마음대로 설정할 수 있는 임의 코드 실행 취약점이 존재하는 것을 이용한 각종 기상천외한 짓들이 가능하다.
- 버퍼 오버플로 - 하트블리드
- 아리안 5 로켓 - 1996년 아리안 5 로켓이 발사 후 37초만에 궤도를 벗어나 자폭했다. 그 로켓에는 무려 5억 달러짜리 통신위성이 탑재되어 있어서 당연히 엄청난 재산피해가 발생했다. 나중에 조사해 본 결과, 컴퓨터로 조종되던 엔진 노즐에 잘못된 데이터가 전송된 것이 원인이었는데 64비트 부동소수점 데이터를 16비트 정수형 데이터로 변환하는 과정에서 생긴 오버플로였다. 원래 그 코드는 아리안 4에서 가져온 코드였는데 당시 학자들은 아리안 4의 속도는 절대 16비트 정수형의 최댓값을 넘지 못할 것을 알았던 탓에 최적화의 이유로 16비트 정수형을 사용했고 아리안 5는 속도가 더 빨랐으니 그걸 넘겼던 것이다.
- Therac-25 - 초창기인 1980년대에 개발된 방사선 암 치료기기. 작동 중에 정수 오버플로 문제로 방사선 수치가 잘못되어 최대 100배의 방사선을 조사하는 의료사고 수 건을 일으켰다. 전술한 로켓은 재산피해만 일으켰지 이건 인명피해까지 일으켰으니... 관련 영상[22]
- 도돈파치 최대왕생 - GP카운터가 2147만을 넘는 순간 갑자기 GP카운터가 999999999로 증폭되는 버그가 있다. 덕분에 최대왕생의 본래 케이브에서 의도했던 방향과는 달리 스코어 패턴은 얼마나 오버플로를 일으킬 수 있느냐가 관건이 되어 버렸다.
- Android - 기본 스톱워치는 99시간 59분 59초 99까지만 측정되며 이를 넘어갈 경우 최대 시간에 도달했다는 메시지와 함께 정지한다.
- 그 외에도 적당히 제한을 뒀는데[23] 어떤 식으로든 더 얻을 수 있는 허점이 있는 경우[24] 데이터 형식 자체의 한계(예: unsigned 32bit int의 2147483648 이상)에 도달해서 오버플로를 일으킬 수 있다.
- 전자기기의 각종 센서들도 오버플로를 일으키기도한다. 한겨울에 꺼내두었던 스마트폰의 온도센서가 온도가 너무 낮아진 나머지 영하 10~30도 이하를 영상 110~117도로 인식해 강제종료되어버린다던가...
4. 관련 문서
[1]
32767에서 -32768로 나가는 걸로 봐서 이 예시에서 양의 수는 부호 있는 2바이트 정수 형태(short)로 저장되는 모양이다.
[2]
실제 무게는 131.5kg인 것으로 추정된다. 지난 측정값인 117kg에서 14kg 이상 찐 것.아무리 오버플로라도 이건 막장인데? 도대체 무슨 일이 있었길래... 사진 한 장만으론 앞뒤 정황을 알 수 없으니 영점이 틀어져서 실제보다 수kg~십수kg 정도 더해져서 오버플로가 된 것이거나 체중계의 측정 범위를 초과한 게 아니라 체중계의 바늘이 고장나서 1.5kg에서 걸려 멈춘 걸 수도 있다. 물론 어느 쪽이든 사람이 알아채기 쉬운 증상을 보이므로(전자는 체중계에 올라가기 전 바늘이 이미 10kg 전후를 가르키고, 후자는 바늘이 돌아가는 모습 없이 그냥 멈춰야 한다) 실제로 그랬다면 일종의
낚시가 된다.
[3]
참고로
절대영도는 약 영하 273.15도이다.
[4]
원래 나와야 할 값 대신 필요없는 값이 나온다고 '쓰레기 값'이라고 부르기도 한다. 다만 쓰레기 값이라는 말 자체는 메모리를 초기화하지 않고 사용해서 그 전에 그 자리를 점유하던 임의의 값이 참조되는 등 여러 이유로 사용하기 곤란한 값이 나올 때 쓰이는 좀 더 광범위한 말이다.
[5]
프로그래머가 코딩을 하며 catch, try 등으로
예외 처리를 했으면 오류 메세지가 뜬다. 보통은 '메모리가 XXXXXX~YYYYYY 값을 초과하였습니다. 이 메모리는 read될 수 없습니다' 와 같이 뜬다.
[6]
보험 가입이 거부되는
호머를 보고 마지의 강박적인 절약으로 인해 생긴 돈을 빼돌려 구매한 캠핑카이다. 뒤의 조금 작은 00은
센트 단위다. 짤방 속 마지막에 나오는 문구는
스페인어로 '휘발유 공짜!'
[7]
현재는 허무맹랑할 이야기뿐이지만 당시에는 실제로 일어난 일들이다. 당연히 컴퓨터는 문제가 없으나 컴퓨터에 돌아가는 프로그램을 사람이 짰으니까... 도서 반납을 새천년에 했더니 컴퓨터가 1900년부터 대여한 것으로 인식해 100년치의 반납금을 산정한 일, 1900년 출생자들에게 입영통지서가
날아간 일... 다만 너무 나가서 금융망이 붕괴한다느니 방사능이 유출된다느니 등의 정말 말도 안 되는 소리까지 나오기도 했다.
[8]
여기서 월드를 나타내야 할 칸이 빈칸으로 나오는 것도 오버플로 때문인데 사실은 월드 36이지만 프로그램에서는 36을 빈칸으로 인식하여 나타나는 것이다. 사실 마이너스 월드는 오버플로라기보다는 포인터가 잘못 동작한 것에 더 가깝기는 하다.
[예시]
/give @p diamond_sword{Enchantments:[{id:"sharpness",lvl:32767}\]}
라고 입력하면 날카로움 32767의 다이아몬드 검을 얻지만, /give @p diamond_sword{Enchantments:[{id:"sharpness",lvl:32768}\]}
이라고 입력하면 날카로움 -32768의 검을 얻게 된다. 때리면 몬스터가 치료되는 마법의 검.
[예시2]
테이크다운에서 파이퍼가 80~90개 이상 파워 큐브를 수집
#
[11]
9시간 6분 8초이다.
[12]
이때 얻는 캡의 갯수는 65535에서 가지고 있는 칩 갯수를 뺀 만큼 얻는 지라 칩이 32768캡에 가까울수록 얻는 캡이 많아진다.
[13]
이는 광속의 약 2배에 달하며 당연히 현실에서는
상대성 이론에 의해 불가능하다.
[14]
엄밀히 말하면 두 터치 간격이 30ms 이하여야 한다.
[15]
즉, 장비가 부족한데 군대를 계속 만들면.
[16]
레벨의 이름 마지막 글자가 숫자가 아니라면 2를 붙이고, 숫자라면 1을 더해서 복사된다. 예: Stereo Madness 2를 복사 → Stereo Madness 3이 되어 크리에이트 창에 저장.
[17]
영상을 보면 표기로도 시스템으로도 -21억인지 코인을 1원 조차 쓸수 없고, 재료를 팔면 표기상 코인이 오르긴 오르나 터무니 없이 부족한 양이다.
[18]
만화를 해석하자면 지니가 건넨 조건은 '소원을 늘리면 안된다' 였기 때문에 '소원을 줄이는 것'은 가능하다. 여기서 소원자가 말한 갯수 타입인 unsigned long long(unsigned 64bit int)은 표현 가능한 숫자 범위가 0 ~ 18446744073709551615까지인데 마지막 소원 1개가 남은 시점에서 '남은 소원의 갯수를 1개 줄여달라'는 소원을 썼고 그 소원을 사용한 것 자체로 갯수가 소진되어 0이 되었는데 소원의 내용대로 추가로 -1이 발생한다. 여기서 오버플로가 발생하면
평생 소원을 사소한 것에 내다 버려도 다 쓰지 못할 양수 18,446,744,073,709,551,615의 소원 갯수가 된다.
[19]
초기 버전은 32비트 고정소수점이라 210만 쯤에서 오버플로가 발생했다.
[20]
해당 수치는 (오류로 게임이 꺼지지 않았다면) 편의상
무한으로 표시되는 경우가 대부분이다. 다만 내부적으로는 0과 똑같이 취급해서 해당 자원을 못 쓰게 되는 경우도 많다.
[21]
기기에 따라 반응이 다른데 무한정으로 늘어나거나, 기기에 저장된 가장 이른 날짜로 설정되거나 설정할 수 있는 최대치 이후의 날짜로 옮겨가기도 한다.
[22]
게다가 이 기기의 코드는 단 한 명의 아마추어 코더가 작성한 것으로 밝혀졌고, 이 일련의 사태 이후 FDA는 의료기기에 쓰이는 코드 다큐멘테이션을 의무화했다. 오늘날 이 사태는 IT 윤리 분야에서 널리 인용되는 케이스로 남아있다.
[23]
999999까지 표시되어 이를 넘겨도 계속 999999로 표시된다든가
[24]
애초에 표시만 제한한 경우거나, 직접 구매만 불가능할 뿐이지 채집 등으론 얻을 수 있다던가, 특정 글리치를 통해 얻을 수 있다던가 등