최근 수정 시각 : 2020-03-07 10:36:38

오버플로

1. 사전적 의미2. 컴퓨터 용어
2.1. 10진수 오버플로2.2. 8비트 오버플로2.3. 16비트 오버플로2.4. 32비트 오버플로2.5. 기타2.6. 관련 문서
3. 일본의 에로게 상표4. 창세기전 3: 파트 2의 기술 중 하나
4.1. 관련 문서
5. GUN X SWORD에 등장하는 설정6. 사운드 볼텍스 비비드 웨이브의 수록곡 ΩVERFLOW

1. 사전적 의미

Overflow

'범람하다'를 의미하는 영단어.

2. 컴퓨터 용어

파일:external/imgs.xkcd.com/cant_sleep.png
xkcd 571화 'Can't Sleep'
32767에서 -32768로 나가는 걸로 봐서 이 예시에서 양의 수는 short 형태로 저장되는 모양이다.
프로그래밍에서 메모리 용량을 넘어선 값이 들어가 생기는 오류.

예를 들어 0001=1, 1001=-7 처럼 최상위 비트가 부호를 의미할 경우,[1] 원래 +7이던 값에 1을 더하면[2] -8[3]이 되어버린다.

종류에 따라 발생 시 오류 메시지를 출력하는 경우도 있고, 그러지 않는 경우도 있다. 이 중 오류 메시지를 출력하지 않는 경우가 더 위험하다. 잘못된 정보로 명령을 계속 수행하기 때문에 쓰레기 값을 출력하거나 오류 메시지를 출력하는 곳과 오버플로가 일어난 곳이 다른 일이 일어날 수가 있다.

오버플로의 가장 많은 예로 스택 오버플로(Stack Overflow)가 있다. 함수는 변수 등을 저장하기 위해 스택을 만드는데, 이 함수가 재귀적으로 계속 실행되면 스택이 점점 생겨난다. 이러면 어느 순간 메모리가 모자라는 순간이 되는데 이때 생기는 오류다. 프로그래밍 언어를 만들 때, 이 스택 오버플로가 잘 일어나지 않도록 하는 것도 일이다. 응용형으로 버퍼 오버플로(Buffer overflow)가 있다. 할당된 범위의 메모리를 벗어난 주소로 접근하게 되는 것으로, 하트블리드 사태도 이런 버퍼 오버플로로 벌어진 것이다.

정수(int)의 경우 보통 크기가 32비트이다. 첫 비트는 부호 비트이고 나머지 31개의 비트에 숫자의 절댓값을 정하므로, 2^31-1(=2147483647[4])보다 큰 수는 저장할 수 없다. 음수는 절댓값을 2의 보수로 저장한다. 그래서 -1에 1을 더하는 연산을 하면 자연스럽게 0이 되며, 반대로 2147483647에 1을 더하면 -2147483648이 된다. 프로그래밍을 배울 때 반복문으로 2를 계속 제곱하면 어느 순간 이상한 음수가 나오더니 0이 되어버리는 것도 오버플로 때문이다. 단 int 형 변수 앞에 unsigned 선언을 해주면 32비트 모두를 절댓값을 저장하는 데 쓴다

많은 사람들이 하는 실수로, 정수의 최솟값(4바이트 정수의 경우 -2147483648)에서 1을 뺄 경우 2147483647이 되는 것은 언더플로가 아니라 오버플로이다. 산술 언더플로는 부동소수점 연산에서 지수부가 타입의 한계를 넘어 작아지면 0에 가까워지다가 결국 0이 되어버리는 현상을 의미한다.

프로그램의 안정성과 신뢰성에 직결되는 문제이므로, 이것에 대한 대비(정확히 말하면 메모리 관리)가 얼마나 꼼꼼한지로 프로그래머의 실력을 가늠할 수 있다. 그렇지만 요즘엔 컴퓨터가 정말 좋아서 웬만한 건 전부 int, 아니면 double[5]로 저장하는 바람에 오버플로가 잘 안 난다. 아니 그냥 안 난다고 보는 게 낫다... 물론 상업적인 프로그램을 제작하는 실무 프로그래머들에게 있어 사소한 오버플로, 또는 프로그램의 의도치 않은 동작을 절대로 놔두어서는 안 된다. 사소한 버그가 치명적인 보안 취약점이 되어 해커들에게 이용당할 수 있기 때문이다. 단순한 정수 오버플로 역시 보안 취약점을 야기할 수 있다. 다만 C++같이 저수준 제어를 하는 언어를 제외한 대부분의 고수준 언어들은 웬만하면 자체 해결책이 있다. JavaScript처럼 변수라고만 선언해도 언어가 자동으로 자료형을 결정하는 언어도 있다. C++은 변수가 서로 호환이 안되고 서로 다른 자료형끼리 연산하려 하면 컴파일 에러가 난다. float형 변수는 소수점이 반드시 존재하는 변수형인데 int나 double에서 float형 변수로 강제로 변환하면 컴퓨터가 알아서 소수점을 써넣거나 오버플로를 아주 열심히 하다가 죽는다.

보다 심각한 문제도 있었는데, 1996년 아리안 5 로켓이 발사 후 37초만에 궤도를 벗어나 자폭하였다. 그 로켓에는 무려 5억 달러짜리 통신위성이 탑재되었기 때문에 당연히 엄청난 피해가 발생했다. 나중에 조사해본 결과 컴퓨터로 조종되던 엔진 노즐에 잘못된 데이터가 전송된 때문이었고, 그 이유는 64비트 부동소수점 데이터를 16비트 정수형 데이터로 변환하는 과정에서 생긴 오버플로였다. 원래 그 코드는 아리안 4에서 가져온 코드였는데, 당시 학자들은 아리안 4의 속도는 절대 16비트 정수형의 최댓값을 넘지 못할 것을 알았기 때문에 최적화의 이유로 16비트 정수형을 사용했던 것이고, 아리안 5는 속도가 더 빨랐기 때문에 그걸 넘었던 것.

평화주의자의 상징인 간디문명 시리즈 게임에선 툭하면 플레이어에게 협박과 선전포고를 날리고 핵을 쏘는 Be폭력주의자로 변한 것에는 오버플로가 한 몫했다. 이유는 항목 참고.

자바 기반 게임인 마인크래프트에서 give 명령어를 사용해 마법부여를 최대 32767까지만 올릴 수 있는 이유도 오버플로 때문이다. 32768 이상을 입력하게 되면 그대로 -32768이 되어 1보다 못하다.[예시]

Windows XP에서도 날짜를 조작한 다음 재부팅하면 이렇게 된다.

이런 현상을 묘사하는 고사성어도 있다. 물극필반(物極必反)이다.

2.1. 10진수 오버플로

파일:external/fanaru.com/187451-the-simpsons-free-gas.gif
10진수 기반 시스템에서 발생하는 오버플로이다.

초창기의 컴퓨터는 BCD(Binary Coded Decimal) 나 EBCDIC(Extended Binary Coded Decimal Interchange Code)이라 불리는 10진수 기반의 수체계를 사용했다. 또한, 이 당시에 사용하던 코볼(COBOL) 같은 컴퓨터 언어도 이런 수체계 기반을 사용하도록 만들어져 있었다. 그래서, 99나 999를 넘어가면 100이나 1000이 되는 것이 아니라 0이 되어버리는 버그가 존재했다.

이로 인해서 가장 문제가 되었던 것이 바로 Y2K 문제이다. 년도 저장을 위해서 2자리의 십진수 정수형만 사용하다 보니 (19)99년 다음에 2000년이 되어야 하는데 (19)00년이 되어 버리는 버그이다.

2.2. 8비트 오버플로

8비트 정수의 저장 범위는 최상위 비트를 음수 부호로 사용하는(signed) 경우 -128 ~ 127이고, 음수 부호를 사용하지 않는(unsigned) 경우 0 ~ 255이다. 255나 127을 넘어 갈 경우 오버플로가 발생한다.
  • 간디(문명 시리즈): 지금의 폭력적인 간디는 사실 오버플로 때문에 생긴 것이었다. 원래 문명 1편에서의 간디는 공격성이 가장 낮은 1이었는데 민주주의를 채택하여 공격성이 2만큼 떨어지게 되자 오버플로가 일어나 공격성이 가장 높은 255가 된 것. 전설의 시작[7]
  • 갤라가(갤러그): 오버플로 현상 덕분에 255[8]판이 마지막 판이고 256판이 되는 순간 0 스테이지가 되면서 이상한 문자들과 기호들이 화면을 가득 메우고, 게임이 리셋된다.
  • 스타크래프트: 본래 유닛의 공격력과 방어력은 3까지만 업그레이드가 가능하지만 특수 맵 에디터를 이용하면 255까지 업그레이드가 가능한 유즈맵을 만들 수 있다. 이 유즈맵에서 저그 지상군 방어력을 255까지 업그레이드 완료한 상태에서 울트라리스크 방어력 추가 업그레이드를 하면 오버플로가 일어나 방어력이 1로 떨어진다.
  • 슈퍼 마리오 브라더스: 3-1 스테이지에서 거북이를 무한으로 밟으면 목숨을 무한으로 늘릴 수 있는 비기가 있다. 하지만, 최대 잔기수가 127이며, 이를 초과하면 잔기수가 0 미만으로 인식되어버리기 때문에 127 초과 상태에서 죽으면 그대로 게임 오버가 된다.[9]
  • 파이어 엠블렘 창염의 궤적: 무기연성에서 원래 필살수치가 있는 무기의 필살치를 마이너스로 만들면 간디 버그 마냥 필살률이 255가 되는 버그가 존재한다.
  • 풍래의 시렌: 소지품/기탄 0인 상태에서 독초나 썩은 주먹밥 대미지로 자멸하면 스코어가 괴상하게 변하거나, 무기의 - 수치가 본래 무기의 수정치를 초과했을 경우 공격력이 255까지 변화하거나, 풀강한 장비에서 장비 자체의 수정치는 오버플로를 인식하지만 합성능력의 가격은 인식 못하여 팔았다 샀다 하는것만으로 본전치기가 가능한 등 수치가 꼬이는 버그가 꽤 많이 존재한다.

2.3. 16비트 오버플로

16비트 정수의 저장 범위는 -32768 ~ 32767(signed) 또는 0 ~ 65535(unsigned)이다. 65535나 32767을 넘어갈 경우 오버플로가 발생한다.
  • 빈센트 발렌타인: 빈센트의 최강 무기는 적을 처치할 때마다 위력이 강해지는데, 65535마리 이상을 처치하면 공격력이 무한에 가까워져 최강 보스 마저도 일격에 이길 수 있다. 자세한 것은 항목 참조.
  • 스타크래프트: 스타크래프트의 방어력은 8비트로 저장하며 이 때문에 최대 255까지만 업그레이드가 가능하고 공격력은 65535까지 가능하다. 때문에 방어력이 255를 넘으면 1로 되돌아가고 공격력이 65535를 넘으면 표기 대미지가 65535 이상이라도 실제 공격력은 1부터 시작한다. 요즘은 EUD나 에디터의 발달 덕분에 유즈맵에서 오버플로를 경험할 일은 별로 없는 편. 스타크래프트 2에서도 게임 시간이 32768초[10]에 가게 되면 모든 세력이 나가고 게임에서 나가게 된다.
  • 슈퍼로봇대전 시리즈:윙키 시절 슈퍼로봇대전은 16비트 오버 플로 때문에 적 체력이 65000을 넘지 못했고, Z시리즈 전까지는 최대로 낼수 있는 대미지가 65535였다.
  • 성검전설 3블랙 라비
  • 폴아웃: 뉴 베가스: 전 재산이 32767캡 초과인 상태에서 모든 캡을 탑스 카지노 칩으로 바꾼 뒤 모두 버리면 탑스 카지노 칩의 갯수가 마이너스 단위로 나타나게 되는데 이때 탑스 카지노 칩을 줍고 카지노 칩을 캡 등 재화로 환전하면 무한으로 환전이 가능하다.[11] 이를 이용해 환전을 반복하여 전 재산을 몇백만 캡 단위로 불릴 수 있다.
  • 브롤스타즈: 공격력이 32768이 넘으면 1이 돼서 1렙 틱에게도 의미없는 데미지가 된다.(예시: 테이크다운에서 파이퍼가 80~90개 이상 파워 큐브를 수집 https://www.youtube.com/watch?v=cGNziTCFl1I

2.4. 32비트 오버플로

32비트 정수의 저장 범위는 대략 -231 ~ 231-1(signed) 또는 0 ~ 232-1(unsigned)까지이다. 이 값을 넘어 갈 경우 오버플로가 발생한다. 이 값들을 풀어 쓰면 42949672952147483647인데, 관련 버그에서 흔히 등장하는 값이다.
  • 2038년 문제
  • 497일 문제
  • 강남스타일: 조회수가 2147483647을 넘기자 조회수가 오버플로해 음수 단위로 떨어지는 척하는 이스터 에그를 만들었다. 물론 조회수를 저장하는 변수는 해당 시점 이전에 64비트로 갈았다. 자세한 내용은 유튜브 특별 서비스 단락을 참조.
  • 메이플스토리: 옛날부터 메이플을 해온 유저들은 2,147,483,647이라는 숫자가 익숙할 것이다. 바로 옛날 풀 메소 수치로, 이 숫자는 위에서 설명된 것처럼 32비트로 나타낼 수 있는 "부호가 있는 숫자" 중 최댓값이다. 그리고 보스 몬스터의 HP도 해당 수치를 넘길 수 없어 시그너스의 경우 체력 회복을 40번이나 했었다. 지금은 직접 조 단위의 숫자 시스템을 구현하여 해당 문제는 사라졌다.
  • 워크래프트 3: 해당 문서에는 없으나 영웅의 경우 체력값이 본래 체력+힘×1당 체력 증가 수치이므로 유즈맵 등에서 아이템으로 힘이나 체력 감소로 체력이 0 미만이 되었을 경우 체력이 0으로 간주하고 사망하게 된다. 다시 재부활하게 될 경우 체력이 정확히 0이라면 1/1으로, 0 미만이라면 1/4294967136으로 표시된다.
  • 하스스톤: 전승지기 초와 천상의 정신, 빛의 정령을 이용해 빛의 정령의 공체를 20억 정도까지 올릴 수 있는데 그 이상 올리면 오버플로 때문에 죽는다.(실험영상)
  • 마인크래프트: 경험치 레벨이 2147483647레벨을 넘으면 다시 0레벨이 된다.
  • 쿠키런: 핑크초코쿠키에서 점수 폭주가 발생했고, 21억에 도달하면 0으로 리셋되는 버그가 존재했었다. 현재는 패치로 수정되었다. 그리고 48억을 낸 또 하나의 버그쿠키가 나오고 말았다
  • 그란 투리스모 시리즈: 그란 투리스모 3에서 시애틀 서킷에서 토요타 GT-One 같은 다운포스가 큰 차를 타고 맵을 뚫고 가속하면 어느새 차가 들리면서 속도가 붙더니 21억 km/h 혹은 21억 mph 로 가속되며 높은 확률로 게임이 뻗어버린다.
  • 옛날에 만들어진 리니지(게임)이나 뮤 온라인, 라그하임 등의 옛날 온라인 게임의 경우에 소지가능한 화폐의 양을 32비트 정수로 해서 최대 20억 ~ 21억 정도까지만 소지되게끔 해놓은 게임이 많았다. 그래서 이런 오버 플로우를 막기 위해 소지 가능한 액수를 아예 20억이나 21억으로 잡아두고 추가 소지를 못하게 하면서 대체 화폐 아이템을 만들거나 혹은 시스템 자체를 갈아엎어서 21억 이상이 소지되게 변경한 경우가 주를 이룬다.

2.5. 기타

  • 스텔라리스의 경우 (2.5버전까지 기준으로) 주로 210만 정도를 초과할 때 오버플로가 발생하는데, 고정 소수점 방식의 실수 구현 때문이다. signed 32비트의 한계인 2,147,483,647의 대략 1/1000인 것으로 봐서, 32비트에 10비트 지점을 고정한 방식으로 보인다. 자세한 것은 모드 정보의 주의 사항 참고
  • 괴리성 밀리언아서: 암속성 헤브리디즈에서 유저들이 감전 데미지를 증폭해서 1800만 데미지를 넘겨 1데미지로 표기되는 오버플로 현상이 있었다. 후에 수정되어 더이상 문제는 없다.
  • 던전 앤 드래곤 섀도 오버 미스타라: 매직 유저가 마법의 대미지를 올려주는 최강의 지팡이 스태프 오브 위저드리를 착용한 상태에서 최강 마법 메테오 스웜을 사용하면 오버플로 현상이 발생, 평타 한대만큼의 쥐꼬리만한 대미지가 들어간다.
  • 오버워치: 경쟁전 시즌 2에서 1점에서 패배하면 0점이 아닌 가장 높은 5,000점이 되었다. 실제로 이런 유저가 등장했었다.
  • 메탈슬러그 디펜스: 오버플로로 인해 무한 메달 획득이 가능한 버그가 발생했다. 해당 문서 버그 문단 참조.
  • 팝픈뮤직: BEMANI 시리즈에 속한 다른 기종에 비해 유독 오버플로 계열 버그가 많이 발생한다. MASS YOSHITAKA新曲이라든지, 팝픈뮤직 éclale의 호감도 버그라든지.
  • 모두의마블: 봉인석 버그는 오버플로를 이용한 버그이다.
  • Windows 10: 계산기로 e+9999를 초과하면 오버플로라는 문자와 함께 한번 더 계산을 하면 0으로 된다.
  • GPS 신호 중 주(week)를 기록하는 부분은 8비트도 16비트도 아닌 10비트로 대략 19.7년마다 오버플로가 일어난다. 1999년과 2019년에 오버플로가 있었다.
  • EUD
  • 버퍼 오버플로

2.6. 관련 문서

3. 일본의 에로게 상표

파일:나무위키상세내용.png 자세한 내용은 Overflow(게임 브랜드) 문서를 참고하십시오.

4. 창세기전 3: 파트 2의 기술 중 하나


사이클론 일반형에서 배울 수 있는 어빌리티로, 적에게만 사용 가능하다. 이 어빌리티에 걸린 적은 어빌리티 사용시 필요한 소울치가 증가한다. 가령 살라딘이 걸렸을 경우, 천지파열무에 필요한 소울이 150이 아니라 154, 163 이런식으로 평소보다 더 많은 소울이 필요하게 된다는 것이다. 또한 기술 레벨에 따라 증가하는 필요 소울치의 양이 증가한다.

그러나 사실상 필요 없는 기술. 솔직히 적군이 쓰는 경우는 한없이 드물고, 설령 적군이 아군한테 사용한다고 해도 캐릭터가 전체 공격 기술을 두세 개씩 보유하고 있는 데다가 평타만으로도 충분히 다 때려잡을 수 있는 창세기전 3: 파트 2에서는 별 의미도 타격도 없다.

과거 창세기전 아레나가 서비스 될 때 아주 가끔 쓰는 경우도 있었다. 그러나 역시나 사용 빈도는 매우 적었다, 차라리 리미트플로를 더 많이 쓰는 편.

또한 상당히 유저들의 짜증을 사고 있는 기술이기도 하다. 창세기전 3: 파트 2에서 군단필살기, 어빌리티, 공격력 등으로 가장 쓸만한 군단 중 하나인 바루스 슬레이어의 용병 캐릭터 '스턴'이 이 기술을 가지고 있는데, 이 양반이 소울 채워지면 평타 때릴 생각은 안 하고 허구헌 날 오버플로만 쓰고 있다. 근데 더 열받는 건 시전 시간도 꽤 길다는 것. 다른 아군들이 평타 다 때리고 대기하고 있는데 스턴 혼자 오버플로를 쓰는 경우가 대다수이다.

4.1. 관련 문서

5. GUN X SWORD에 등장하는 설정

갈고리 손톱의 남자의 습격에 의해 빈사상태가 되고, 그를 살리기 위해 가드베드는 반을 개조하고 단 오브 서즈데이에 그를 등록하게 된다.

하지만 그는 본디 다른 네오 오리지널 7의 멤버들처럼 개조 없이 오리지널을 조종할 수 있는 체질이었고(자세한 것은 문서 참조), 그런 그가 개조된 끝에 발현된 미지의 가능성.

본편 마지막에서 등장하여, 실제로 어떤 능력인지 정확히는 알 수 없지만 여러 요인에 의해 발현된 미지의 가능성이라는 점에서, 컴퓨터 프로그램의 오류인 1번이 모티브인 듯 싶다(실제로 컴퓨터 프로그램에서 오버플로가 발생한 경우 예측하지 못한 오류가 발생한다).
뭐……뭐냐, 이건??

오버……플로…….

뭐라고?

아마도…… 결번 멤버는 원래부터 개조 따위 하지 않아도 (갑주를) 움직일 수 있는 힘이 있었다고 밖에는……. 마더의 기술과 새로운 가능성의 융합…….

6. 사운드 볼텍스 비비드 웨이브의 수록곡 ΩVERFLOW

ΩVERFLOW 문서 참조.

[1] 음수일 경우 2의 보수가 그 절댓값이 된다는 점에 주의.[2] 0111(2)+1(2)=1000(2)인데, 1000(2)를 2의 보수를 절댓값으로 가진 음수로 변환하면 -(7+1)=-8[3] 보통 00000....은 0을, 11111...은 -1을 의미한다. 때문에 최솟값의 절댓값이 1 크다.[4] 8번째 메르센 소수로, 레온하르트 오일러가 1772년에 이 수가 소수임을 발견했다.[5] 실수 저장 가능. 실수 자료형 중에서 일반적으로 가장 많이 사용되고, 크기는 8바이트(int의 2배).[예시] /give @p diamond_sword{Enchantments:[{id:"sharpness",lvl:32767}\]} 라고 입력하면 날카로움 32767의 다이아몬드 검을 얻지만, /give @p diamond_sword{Enchantments:[{id:"sharpness",lvl:32768}\]} 이라고 입력하면 날카로움 -32768의 검을 얻게 된다. 회복의 검?[7] 0에서 더 아래로 내려갔는데 최대값이 되는 것도 오버플로이다.[8] 간디(문명 시리즈)랑 마찬가지로 255였다.[9] 이 개념을 럭키스타 9화에서 이즈미 코나타가 엔딩 곡이 나온 이후 다음 이야기 소개 때 설명해준다.[10] 9시간을 약간 넘는 시간이다.[11] 이 때 얻는 캡의 갯수는 65535에서 가지고 있는 칩 갯수를 뺀 만큼 얻는지라 칩이 32768캡에 가까울수록 얻는 캡이 많아진다.