오버플로

(오버플로우에서 넘어옴)

1 개요

Overflow
어떠한 것이 용량을 초과하여 넘쳐 흐르는 것을 의미하는 영단어.

2 컴퓨터 용어

프로그래밍에서, 메모리 용량을 넘어선 값이 들어가 생기는 오류.

AB
??1111
?10000

오버플로의 간단한 예(버퍼 오버플로). 이진법으로 15가 들어있는 4비트짜리 변수 B의 값을 1 증가시키자 결과가 옆에 있던 변수 A의 값을 침범하면서 B의 값은 0이 됐다.

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

xkcd 571화 'Can't Sleep'
32767에서 -32768로 나가는 걸로 봐서 이 예시에서 양의 수는 short 형태로 저장되는 모양이다. 사실 16비트 머신이라 카더라

오버플로의 가장 많은 예로 스택 오버플로(Stack Overflow)가 있다. 함수는 변수 등을 저장하기 위해 스택을 만드는데, 이 함수가 재귀적으로 계속 실행되면 스택이 점점 생겨난다. 이러면 어느 순간 메모리가 모자라는 순간이 되는데 이때 생기는 오류다. 프로그래밍 언어를 만들 때, 이 스택 오버플로가 잘 일어나지 않도록 하는 것도 일이다.

최상위 비트가 부호를 의미할 경우, 위의 예시에서는 원래 +7이던 값에 1을 더했더니 -8[1]이 되어버린다.

정수의 경우 보통 4바이트(32비트)의 크기의 2의 보수 방법으로 저장되므로, 2^31-1(= 2147483647)보다 큰 수는 저장할 수 없다. 여기에 1을 더하면 -2147483648이 된다. 프로그래밍 할 때, 1에 2를 계속 곱했는데 어느 순간 이상한 음수가 나오더니 0이 되어버리는 것도 오버플로 때문이다.

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

프로그램의 안정성과 신뢰성에 직결되는 문제이므로, 이것에 대한 대비(정확히 말하면 메모리 관리)가 얼마나 꼼꼼한지로 프로그래머의 실력을 가늠할 수 있다. 그렇지만 요즘엔 컴퓨터가 정말 좋아서 웬만한 건 전부 int, 아니면 double[2]로 저장하는 바람에 오버플로가 잘 안 난다. 아니 그냥 안 난다고 보는 게 낫다...[3] [4]


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

응용형으로 버퍼 오버플로(Buffer overflow)가 있다. 할당된 범위의 메모리를 벗어난 주소로 접근하게 되는 것으로, 하트블리드 사태도 이런 버퍼 오버플로로 벌어진 것.

여담이지만 평화주의자의 상징인 간디문명 시리즈 게임에선 툭하면 핵을 쏘는 폭력 주의자로 변한것에 오버 플로우가 한 몫했다. 이유는 항목 참고.

2.1 관련 문서

3 일본의 게임회사

도쿄의 치요다구에 본사를 둔 게임 회사로 아쥬, 니트로 플러스와 함께 치요다구 연합이란 연합에 소속되어 있다. 오버플로의 모 회사 이름은 STACK으로 모 회사 이름과 합치면 'Stack Overflow'라는 오류 메시지 이름이 된다.

영문 표기는 Overflow로 하지만 회사의 로고나 홈페이지 도메인엔 숫자 0을 사용한다. 이는 회사를 설립할 즈음, 도메인이 다른 컴퓨터 업체가 선점하여 일어난 해프닝이다.

치요다 구 연합 결성 당시 연합을 이룬 당시부터 같은 연합인 다른 두 제작사(니트로, 아쥬)보다 유명세가 떨어진다는 평가를 들어왔으며 이렇다 할 유명작이 없다는 점을 의식, 자기들만의 아이덴티티를 만들어가다보니 통칭 '토마루 월드'란 이름을 붙인 막장 세계관을 구축해 버렸다.잘도 이런 정신나간 세계관을!!

막장 세계관 '토마루 월드'는 사와고에 토마루라는 설정상의 캐릭터를 만들어, 오버플로에서 발매한 게임의 세계관은 사와고에 토마루라는 개막장 건달에 의해 세워졌다.라는 것을 기초로 흘러가는 세계관으로 초기에는 배드 엔딩 같은 경우만 막장으로 만들어졌으나 Days 시리즈의 성공 요소가 막장이란 것으로 판단, 코믹마켓 행사 등에 더더욱 박차를 가한 막장 엔딩들을 내놓으며 막나가는 설정을 남발했다.

참고로 세계관은 대부분 사와고에 토마루, 이노우 아유무, 하자마 슌의 하렘이 성공하여 이루어졌다.

이 탓인지 2007년에 2ch에서 주최한 에로게 제작사 안티 투표에서 리프, Key, 타입문 등의 유명한 제작사를 누르고 안티수 1위를 차지했으며 약 10개월 동안 1위 자리를 유지했다.(...)

2010년에 발매한 데이즈 시리즈의 최신작인 크로스데이즈와 연동되는 어떤 기구를 발매했는데 말로 설명할 수 없는 포스가 느껴지니 # 한 번 보자. 게다가 본 게임 역시 엄청난 막장이다. 오 마이 숄더!

2012년 2월, 니코니코 생방송을 통해 동년 4월 발매예정인 Shiny Summer Days가 마지막 작품임을 발표했다. 재정난이 심각한 모양. 이를 두고 넷에서는 도산한거 아니냐는 의견이 많지만, 일단 공식 트위터의 답변상으로는 도산까지는 아니라고 한다. 발표된 작품들의 서포트는 계속 실시할 예정이라지만, 에로게 업계를 떠나는 것만큼은 확정된 모양.

이후 사람들에게서 잊혀질 때 즈음인 2013년 연말, 2014년 봄에 신작 아일랜드 데이즈닌텐도 3DS로 출시할 것을 발표했다.

3.1 게임 목록

밑에 나와 있는 작품들은 전부 다 세계관을 공유한다. 참고로 세계관을 공유하지 않는 작품은 유일하게 매지컬☆유니티뿐이다.

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

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

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

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

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

5 GUN X SWORD에 등장하는 설정

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

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

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

뭐……뭐냐, 이건?!

오버……플로…….

뭐라고?

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

  1. 보통 10000....은 0을, 01111...은 -1을 의미한다. 때문에 최소값의 절대값이 1 크다
  2. 실수 저장 가능. 실수 자료형 중에서 일반적으로 가장 많이 사용되고, 크기는 8바이트(int의 2배)
  3. 물론 상업적인 프로그램을 제작하는 실무 프로그래머들에게 있어 사소한 오버플로, 또는 프로그램의 의도치 않은 동작을 절대로 놔두어서는 안 된다. 사소한 버그가 치명적인 보안 취약점이 되어 해커들에게 이용당할 수 있기 때문이다. 단순한 정수 오버플로 역시 보안 취약점을 야기할 수 있다.
  4. 다만 C++같이 저수준 제어를 하는 언어를 제외한 대부분의 고수준 언어들은 왠만하면 자체 해결책이 있다. 그리고 아예 자료형에 short, long이 없고 언어가 자동으로 자료형을 결정하는 언어도 있다.
  5. 오버플로 현상을 활용해 이스터 에그를 만들었다. 처음에는 진짜 버그인 척했지만, 이미 소스코드를 본 사람들은 이스터 에그인 줄 알았다. 자세한 내용은 유튜브 특별 서비스 단락을 참조.
  6. 지금의 폭력적인 간디는 사실 오버플로 때문에 생긴 것이었다. 원래 문명 1에서의 간디는 공격성이 가장 낮은 1이었는데 민주주의를 채택하여 공격성이 2만큼 떨어지게 되자 오버플로가 일어나 공격성이 가장 높은 255가 된 것.
  7. 스타크래프트의 방어력은 8비트로 저장하며 이 때문에 최대 255까지만 업그레이드가 가능하다. 울트라리스크는 별도의 방어력 업그레이드를 갖고 있는데 이게 단순히 방업을 2업 더 시켜주는 형식이라, 254 이상의 방업을 하고 울트라 방업까지 하면 오버플로가 일어나 추가 방어력이 0~1이 되어 버린다.
  8. 오버플로로 인해 무한 메달 획득이 가능한 버그가 발생했다. 해당 문서 버그 문단 참조.
  9. 무기연성에서 원래 필살수치가 있는 무기의 필살치를 마이너스로 만들면 간디 버그 마냥 필살률이 255가 되는 버그가 존재한다.
  10. BEMANI 시리즈에 속한 다른 기종에 비해 유독 오버플로 계열 버그가 많이 발생한다. MASS YOSHITAKA新曲이라든지, 팝픈뮤직 éclale의 호감도 버그라든지...
  11. 봉인석 버그는 오버플로를 이용한 버그이다.
  12. 참고로 LOST M과 더붙어 토마루 쪽의 혈통이 전혀 등장하지 않고, 세계관만 공유되는 작품.
  13. 겟츄 한정 판매이다.
  14. 주인공은 '카츠라 코코로'의 친구인 '이이 우즈키'의 오빠인 듯 하다.