오버플로우 예제

변수에 서명된 정수 유형이 있는 경우 프로그램은 변수에 항상 양수 값이 포함되어 있다고 가정할 수 있습니다. 정수 오버플로는 값이 래핑되고 음수가 되어 프로그램의 가정을 위반하고 예기치 않은 동작으로 이어질 수 있습니다(예기치 않은 동작으로 이어질 수 있습니다(예: 8비트 정수 추가 127 + 1의 결과 -128, 두 개의 보완물 128). 이 특정 문제에 대한 해결책은 프로그램이 예상하고 가정하는 값에 대해 부호 없는 정수 형식을 사용하는 것입니다. 컴퓨터 그래픽 또는 신호 처리에서는 0에서 1 또는 -1에서 1까지의 데이터에서 작업하는 것이 일반적입니다. 예를 들어 0이 검정을 나타내고 1은 흰색을 나타내고 그 사이의 값은 다양한 회색 음영을 나타내는 그레이스케일 이미지입니다. 지원하려는 작업 중 하나는 모든 픽셀에 상수를 곱하여 이미지를 밝게 하는 것입니다. 포화 산술 은 1보다 큰 모든 픽셀 (즉, “흰색보다 밝다”)이 흰색이되고 모든 값이 “어둡게”되는 합리적인 결과를 고수하여 오버 플로우에 대해 걱정하지 않고 모든 픽셀을 맹목적으로 곱할 수 있습니다. 검은 색보다”그냥 검은 색이된다. 오버플로 오류는 레지스터가 보유할 수 있는 가장 큰 수를 초과할 때 발생합니다.

처리할 수 있는 비트 수를 단어 크기라고 합니다. 임의 정밀도 산술 및 형식 안전성(예: Python 또는 Common Lisp)을 기본으로 지원하는 언어에서는 오버플로가 발생할 때 숫자가 자동으로 더 큰 크기로 승격되거나 범위 제약 조건이 있을 때 예외가 throw(조건 신호)됩니다. 존재. 따라서 이러한 언어를 사용하면 이 문제를 완화하는 데 도움이 될 수 있습니다. 그러나 이러한 일부 언어에서는 정수 오버플로가 발생할 수 있는 상황이 여전히 발생할 수 있습니다. 프로파일러에서 병목 현상으로 간주되는 코드 경로를 명시적으로 최적화하는 예제가 있습니다. Common Lisp의 경우 명시적 선언을 사용하여 변수를 컴퓨터 크기 단어(fixnum)[14]에 입력하여 특정 코드 블록에 대해 형식 안전 수준을 0[15]으로 낮출 수 있습니다. [16] [17] [18] [19] 특히 두 정수를 곱하거나 추가하면 예기치 않게 작은 정수에서 빼면 큰 양수 값으로 랩이 발생할 수 있습니다(예: 8비트 정수 추가 255+ 2개 결과 1, 257 mod 28 , 유사하게 뺄셈 0 – 1은 255, -1의 두 개의 보완 표현의 결과. 오버플로 버그는 일부 컴퓨터 게임에서 분명하게 나타납니다.

아케이드 게임 당나귀 콩에서, 시간 / 보너스에 정수 오버 플로우로 인해 지난 레벨 22를 진행하는 것은 불가능하다. 이 게임은 사용자가 있는 레벨 번호를 10으로 곱하고 40을 추가합니다. 22레벨에 도달하면 시간/보너스 번호는 260이며, 이는 8비트 256 값 레지스터에 너무 크므로 0으로 재설정하고 나머지 4를 시간/보너스로 제공하여 레벨을 완료하기에는 너무 짧습니다. 당나귀 콩 주니어 수학에서, 10000 이상 숫자를 계산하려고 할 때, 그것은 단지 처음 4 자리를 보여줍니다. 오버플로우는 팩맨[26]과 문명의 “핵 간디”에서 유명한 “분할 화면” 레벨의 원인입니다. [27] 그것은 또한 발생 “먼 땅” 마인 크래프트에서 존재 하는 Infdev 개발 기간에서 베타 1.7.3; 그러나, 그것은 나중에 베타에서 고정 되었다 1.8 하지만 여전히 포켓 에디션 및 윈도우에 존재 10 마인 크래프트의 에디션 버전. [28] 슈퍼 닌텐도 게임 람보르기니 아메리칸 챌린지에서, 플레이어는 정수를 결함과 플레이어를 부여 경주에 대한 수수료를 지불 한 후 남아있는 돈의 한계를 통해 벌금을 부과하여 경주 기간 동안 $ 0 이하로 떨어질 돈의 양을 일으킬 수 있습니다 $ 65,535,000 이상이 마이너스를 기록한 후 가졌을 것입니다. [29] S.T.A.L.K.E.R.에서 비슷한 결함이 발생합니다: 클리어 스카이는 플레이어가 충분한 자금 없이 빠르게 이동하여 음수금액으로 떨어질 수 있으며, 플레이어가 강탈당하고 모든 화폐를 빼앗긴 이벤트로 진행됩니다.

Share on FacebookPin on PinterestTweet about this on TwitterShare on TumblrShare on Google+Digg this