정수 오버플로
Integer overflow
컴퓨터 프로그래밍에서 정수 오버플로는 산술 연산이 주어진 자릿수로 표시할 수 있는 범위를 벗어나는 수치(최대값보다 크거나 최소값보다 작음)를 생성하려고 할 때 발생합니다.
오버플로의 가장 일반적인 결과는 결과의 최하위 자릿수가 저장되는 것입니다. 그 결과는 최대값(즉, 현대의 컴퓨터에서는 보통 2자리, 때로는 10자리 또는 다른 기수)으로 정리됩니다.
오버플로우 상태가 발생하면 의도하지 않은 동작이 발생할 수 있습니다.특히 예상하지 못한 경우 오버플로로 인해 프로그램의 신뢰성과 보안이 저하될 수 있습니다.
타이머나 클럭 등 일부 어플리케이션에서는 오버플로우를 랩하는 것이 바람직할 수 있습니다.C11 규격에서는 부호 없는 정수의 경우 모듈로 랩핑은 정의된 동작이며 오버플로라는 용어는 적용되지 않습니다. "부호 없는 오퍼랜드를 포함하는 계산은 오버플로할 [1]수 없습니다."
포화 연산을 지원하는 GPU(그래픽 처리 장치)나 디지털 신호 처리 장치(DSP)와 같은 일부 프로세서에서는 오버플로우된 결과가 "클램프"될 수 있습니다. 즉, 랩핑이 아닌 최소값 또는 표시 가능한 범위의 최대값으로 설정됩니다.
기원.
프로세서의 레지스터 폭은 레지스터에서 나타낼 수 있는 값의 범위를 결정합니다.대부분의 컴퓨터가 메모리 내의 오퍼랜드에 대해 복수 정밀 연산을 실행할 수 있기 때문에 숫자가 임의로 길고 오버플로가 발생하지 않도록 할 수 있지만 레지스터 폭은 연산당 하나의 명령을 사용하여 연산할 수 있는 숫자의 크기를 제한한다(예를 들어 더하기 또는 빼기).부호 없는 정수의 일반적인 이진 레지스터 폭은 다음과 같습니다.
- 4비트: 최대 표시값4 2 - 1 = 15
- 8비트: 최대 표시값8 2 - 1 = 255
- 16비트: 최대 표시값16 2 - 1 = 65,535
- 32비트: 최대 표시값32 2 - 1 = 4,294,967,295(2005년 현재[update] 개인용 컴퓨터의 가장 일반적인 폭),
- 64비트: 최대 표시값64 2 - 1 = 18,446,744,073,709,551,615 (Personal Computer Central Processing Units(CPU; 퍼스널컴퓨터 중앙처리장치)의[update] 가장 일반적인 폭)
- 128비트: 최대 표시값128 2 - 1 = 340, 282, 366, 920, 938, 463, 463, 374, 607, 431, 768, 211, 455
부호 없는 산술 연산에 의해 N비트 정수의 최대값보다 큰 결과가 생성되면 오버플로에 의해 결과가 모듈로N의 거듭제곱 2로 감소하여 결과의 최하위 비트만 유지되며 실질적으로 랩어라운이 발생합니다.
특히, 2개의 정수를 곱하거나 더하면 예기치 않게 작은 값이 될 수 있으며, 작은 정수에서 빼면 큰 양의 값으로 랩할 수 있습니다(예를 들어 8비트 정수 더하기 255 + 2는 257 mod8 2가 되고, 마찬가지로 0 - 1을 빼면 255는 2의 보완 표현 -1이 됩니다).
이러한 랩어라운드로 인해 보안이 저하될 수 있습니다.버퍼에 할당하는 바이트 수로 오버플로우 값이 사용되면 버퍼가 예기치 않게 적게 할당되어 버퍼 오버플로우가 발생할 수 있으며 버퍼 사용에 따라서는 임의의 코드가 실행될 수 있습니다.
변수에 부호 있는 정수 유형이 있는 경우, 프로그램은 변수가 항상 양의 값을 포함한다고 가정할 수 있습니다.정수 오버플로는 값이 랩되어 음수가 될 수 있으며, 이는 프로그램의 가정을 위반하고 예기치 않은 동작을 초래할 수 있습니다(예를 들어 8비트 정수 더하기 127 + 1은 -128로, 2는 128로 보완됩니다).(이 문제에 대한 해결책은 프로그램이 예상하거나 절대 음이 아니라고 가정하는 값에 부호 없는 정수 유형을 사용하는 것입니다.)
플래그
대부분의 컴퓨터에는 오버플로 상태를 확인하기 위한 전용 프로세서 플래그가 2개 있습니다.
carry 플래그는 피연산자와 결과를 부호 없는 숫자로 간주하는 덧셈 또는 뺄셈 결과가 지정된 비트 수에 맞지 않을 때 설정됩니다.이는 최상위 비트에서 캐리어 또는 차입된 오버플로우를 나타냅니다.이행을 수반하는 덧셈 또는 차용 조작을 수반하는 뺄셈 직후에는 이 플래그의 내용을 사용하여 레지스터 또는 복수 워드 값의 상위 부분을 포함하는 메모리 위치를 변경합니다.
오버플로 플래그는 서명된 숫자에 대한 연산 결과가 오퍼랜드의 부호로부터 예측되는 부호를 가지지 않는 경우(예를 들어 두 개의 양의 숫자를 더했을 때 음의 결과)로 설정됩니다.이는 오버플로가 발생하여 2의 보완 형식으로 표시된 서명된 결과가 지정된 비트 수에 맞지 않음을 나타냅니다.
정의의 차이와 모호성
부호 없는 유형의 경우, 이상적인 연산 결과가 유형의 대표 범위를 벗어나 반환된 결과를 래핑하여 얻은 경우 이 이벤트는 일반적으로 오버플로로 정의됩니다.이와는 대조적으로 C11 표준은 이 이벤트가 오버플로가 아니라고 정의하며 "서명되지 않은 피연산자와 관련된 계산은 절대 [1]오버플로가 될 수 없다"고 명시하고 있다.
정수 연산의 이상적인 결과가 유형의 대표 범위를 벗어나고 클램핑을 통해 반환된 결과를 얻을 경우 이 이벤트는 일반적으로 포화 상태로 정의됩니다.포화도가 오버플로인지 아닌지에 따라 용도가 달라집니다.애매함을 없애기 위해 래핑[2] 오버플로와 포화[3] 오버플로라는 용어를 사용할 수 있습니다.
언더플로우라는 용어는 정수 [4]산술이 아닌 부동 소수점 산술에 가장 일반적으로 사용됩니다.단, 정수 [5][6][7][8][9]언더플로우에는 많은 참조가 있습니다.정수 언더플로우라는 용어가 사용되는 경우 이상적인 결과는 출력 유형의 표현 가능한 값보다 마이너스 무한대에 가까웠음을 의미합니다.정수 언더플로우라는 용어가 사용되는 경우 오버플로우의 정의는 모든 유형의 오버플로우를 포함할 수 있으며, 이상적인 결과가 양의 무한대에 가장 가까운 출력 유형의 표시 값보다 양의 무한대에 가까웠던 경우에만 포함될 수 있습니다.
연산의 이상적인 결과가 정확한 정수가 아닌 경우, 엣지의 경우 오버플로우의 의미가 모호해질 수 있습니다.이상적인 결과의 값이 127.25이고 출력 유형의 최대 대표 값이 127인 경우를 고려합니다.오버플로우가 출력 타입의 대표 가능한 범위를 벗어나는 이상적인 값으로 정의되어 있는 경우, 이 경우는 오버플로로 분류됩니다.반올림 동작이 잘 정의된 작업의 경우 반올림 적용 후까지 오버플로 분류를 연기해야 할 수 있습니다.C11[1] 규격에서는 부동소수점에서 정수로의 변환은 제로로 반올림해야 한다고 정의하고 있습니다.부동소수점 값 127.25를 정수로 변환하기 위해 C를 사용하는 경우 이상적인 정수 출력 127을 제공하기 위해 반올림을 먼저 적용해야 합니다.반올림된 정수는 출력 범위 내에 있으므로 C 표준은 이 변환을 오버플로로 분류하지 않습니다.
일관성이 없는 동작
오버플로우 발생 시 동작은 모든 상황에서 일관되지 않을 수 있습니다.예를 들어 Rust 언어에서는 사용자에게 선택과 제어를 제공하는 기능을 제공하는 동안 수학 연산자의 기본 사용 동작은 자연스럽게 고정되지만, 이 고정 동작은 디버깅 모드에 내장된 프로그램과 릴리스 [10]모드에 내장된 프로그램 간에 다릅니다.C에서는 부호 없는 정수 오버플로는 랩하도록 정의되어 있지만 서명된 정수 오버플로는 정의되지 않은 동작을 일으킵니다.
정수 오버플로 문제를 해결하는 방법
언어 | 부호 없는 정수 | 부호 있는 정수 |
---|---|---|
아다 | 그 타입의 계수를 모듈로 하다. | raise Constraint_Error |
C, C++ | 2의 모듈로 거듭제곱 | 정의되지 않은 행동 |
C# | 체크되지 않은 상황에서 2의 모듈로 검정력System.OverflowException 체크된[11] 컨텍스트에서 발생합니다. | |
자바 | 2의 modulo 거듭제곱(자바에서는 char가 부호화되지 않음) | 2의 모듈로 거듭제곱 |
자바스크립트 | 새로운 BigInt를 제외한 모든 숫자는 2배 정밀도의 부동 소수점입니다. | |
매트랩 | 내장된 정수는 포화됩니다.랩 또는 포화하도록 구성할 수 있는 고정 소수점 정수 | |
파이썬 2 | — | 타입(bigint)으로 변환하다 |
시드7 | — | raise OVERFLOW_ERROR[12] |
스킴 | — | bigNum으로 변환하다 |
시뮬링크 | 랩 또는 포화되도록 구성할 수 있는 | |
스몰토크 | — | LargeInteger로 변환하다 |
재빠르다 | 특수한 오버플로 [13]연산자를 사용하지 않는 한 오류가 발생합니다. |
검출
런타임 오버플로우 검출 구현UBSan
는 C 컴파일러에서 사용할 수 있습니다.
Java 8에서는 다음과 같은 오버로드된 메서드가 있습니다.Math.addExact(int, int)
, 그것은 던질 것이다.ArithmeticException
오버플로우일 경우.
컴퓨터 긴급대응팀(CERT)은 런타임 [14]오류처리를 사용하여 C/C++에서 정수 오버플로와 절단을 제거하는 크게 자동화된 메커니즘인 AIR(As-if Infinitially Range) 정수 모델을 개발했습니다.
회피.
계산하여 저장할 수 있는 모든 값을 포함할 수 있을 만큼 큰 데이터 유형을 사용하여 변수를 할당하면 항상 오버플로를 방지할 수 있습니다.사용 가능한 공간이나 프로그래밍 언어 또는 환경에 의해 제공되는 고정 데이터 유형이 너무 제한적이어서 변수를 넉넉한 크기로 방어적으로 할당할 수 없는 경우에도 연산을 주의 깊게 지시하고 피연산자를 사전에 체크함으로써 결과가 s보다 크지 않음을 사전에 확인할 수 있습니다.정적 분석 도구, 공식 검증 및 계약 기술에 의한 설계를 사용하여 오버플로가 우발적으로 발생하지 않도록 보다 확실하고 견고하게 보장할 수 있습니다.
처리
오버플로가 발생할 것으로 예상될 경우 프로그램에 테스트를 삽입하여 언제 발생하거나 발생을 앞둔지를 감지하고 이를 완화하기 위한 기타 처리를 수행할 수 있습니다.예를 들어, 사용자 입력 오버플로우로부터 계산된 중요한 결과가 있는 경우, 프로그램은 무효 오버플로우 입력으로 진행되어 그 결과 오작동하는 것이 아니라, 프로그램을 중지하고 입력을 거부하며 사용자에게 다른 입력을 요구할 수 있다.이 전체 프로세스는 자동화할 수 있습니다.예를 들어 핸들러가 완전 [15]종료인 정수 오버플로우용 핸들러를 자동으로 합성할 수 있습니다.
CPU에는 일반적으로 상태 비트를 사용하여 레지스터 크기보다 큰 숫자의 추가를 지원하는 방법이 있습니다.이 기술을 다중 정밀도 산술이라고 합니다.따라서 스텝에서 바이트 추가만 사용하여 2바이트마다 2바이트씩의 숫자를 추가할 수 있습니다.처음에는 낮은 바이트를 추가한 후 높은 바이트를 추가할 필요가 있지만, 낮은 바이트를 실행할 필요가 있는 경우 이는 바이트 추가의 산술 오버플로우이며 높은 바이트의 합을 검출하여 증가시켜야 합니다.
계산의 가능한 오버플로를 처리하면 계산 전(오버플로의 발생 여부를 판단하기 위해) 또는 계산 후(결과 값에 따라 발생 가능성이 있는지 여부를 고려하기 위해) 중 하나를 선택할 수 있습니다.후자의 선택에 주의를 기울여야 한다.첫째, 신뢰할 수 있는 검출 방법이 아닐 수 있기 때문에(예를 들어, 덧셈이 반드시 낮은 값으로 줄지 않아도 됩니다).둘째, 오버플로 발생 자체가 정의되지 않은 동작일 수 있기 때문입니다.C 언어에서, 부호 없는 정수 타입의 오버플로는 래핑이 되지만, 부호 있는 정수 타입의 오버플로는 정의되지 않은 동작입니다.따라서 C 컴파일러는 프로그래머가 서명된 오버플로를 발생시킬 수 없으며, 따라서 다음과 같은 계산에 이은 모든 체크를 묵묵히 최적화할 수 있습니다.결과를 체크하여 프로그래머에게 경고를 주지 않고 검출합니다.따라서 항상 계산을 수행하기 전에 체크를 실행하는 것이 좋습니다.
명시적 전파
값이 너무 커서 저장할 수 없는 경우 오버플로가 발생했음을 나타내는 특별한 값을 할당하고 이후 모든 연산이 이 플래그 값을 반환하도록 할 수 있습니다.이러한 값은 "not a number"에 대해 NaN으로 언급되기도 한다.이는 각 단계 후가 아니라 긴 계산 끝에 문제를 한 번 확인할 수 있도록 하기 위해 유용합니다.이것은 FPU라고 불리는 부동소수점 하드웨어에서 지원되는 경우가 많습니다.
프로그래밍 언어 지원
프로그래밍 언어는 우발적인 오버플로에 대한 다양한 완화 방법을 구현합니다.Ada, Seed7(및 특정 기능 언어의 변형)은 오버플로우 시 예외 조건을 트리거하는 반면, Python(2.4 이후)은 숫자의 내부 표현을 심리스하게 변환하여 결국 다음과 같이 표현합니다.long
사용 가능한 [16]메모리에 의해서만 기능이 제한됩니다.
임의 정밀도 산술 및 유형 안전(Python, Smalltalk, Common Lisp 등)을 네이티브로 지원하는 언어에서는 오버플로가 발생할 때 숫자가 자동으로 더 큰 크기로 승격되거나 범위 제약이 있을 때 예외가 느려집니다(조건이 신호됨).따라서 이러한 언어를 사용하면 이 문제를 완화하는 데 도움이 될 수 있습니다.그러나 일부 언어에서는 정수 오버플로가 발생할 수 있는 상황이 여전히 발생할 수 있습니다.예를 들어 프로파일러에 의해 병목현상으로 간주되는 코드 패스의 명시적 최적화가 있습니다.Common Lisp의 경우 명시적 선언을 사용하여 변수를 기계 크기 단어(fixnum)[17]에 주석하고 유형 안전 수준을 특정 코드 [19][20][21][22]블록에 대해 0으로[18] 낮춤으로써 가능합니다.
C와 같은 오래된 언어와는 대조적으로 Rust와 같은 일부 새로운 언어에는 내장된 기능이 있어 쉽게 검출할 수 있으며 경우에 따라 오버플로를 처리하는 방법을 사용자가 선택할 수 있습니다.Rust에서는 기본 연산자의 사용에는 이러한 유연성이 당연히 없지만, 사용자는 각 정수 원시형이 제공하는 일련의 방법을 통해 교대로 계산을 수행할 수 있다.이러한 방법에서는 체크된(또는 오버플로우) 작업(반환 유형을 통해 오버플로가 발생했는지 여부를 나타냄), 체크되지 않은 작업, 래핑을 수행하는 작업 또는 숫자 경계에서 포화 상태를 수행하는 작업 중 몇 가지 선택지가 제공됩니다.
포화 산술
컴퓨터 그래픽스 또는 신호 처리에서는 일반적으로 0 ~1 또는 -1 ~1 범위의 데이터를 처리합니다.예를 들어, 그레이스케일 이미지를 촬영합니다.여기서 0은 검은색, 1은 흰색, 중간 값은 회색 음영을 나타냅니다.지원하고자 하는 작업 중 하나는 모든 픽셀에 상수를 곱하여 이미지를 밝게 하는 것입니다.포화 연산을 사용하면 1보다 큰 픽셀(즉, "흰색보다 밝은")이 모두 흰색으로 변하고 "검은색보다 어두운" 값이 모두 검은색으로 된다는 합리적인 결과를 고수함으로써 오버플로우 걱정 없이 모든 픽셀에 그 상수를 무작정 곱할 수 있습니다.
예
예기치 않은 산술 오버플로는 프로그램 오류의 매우 일반적인 원인입니다.이러한 오버플로 버그는 매우 큰 입력 데이터 세트에 대해서만 나타날 수 있기 때문에 검출 및 진단이 어려울 수 있습니다.이는 검증 테스트에서 사용될 가능성이 낮기 때문입니다.
많은 검색 알고리즘에서와 같이 두 숫자의 산술 평균을 더하고 2로 나누면 합계가 너무 커서 나타낼 [23]수 없을 경우 오류가 발생합니다.
엔진 스티어링 소프트웨어의 처리되지 않은 [24]산술적 오버플로가 1996년 아리안 5 로켓의 처녀 비행 추락의 주된 원인이었다.이 소프트웨어는 이전의 많은 비행에서 사용되었기 때문에 버그가 없는 것으로 여겨져 왔지만, 그것들은 아리안 5보다 더 낮은 가속도를 내는 작은 로켓을 사용했다.실망스럽게도, 오버플로 오류가 발생한 소프트웨어 부분은 로켓이 고장났을 때 아리안 5를 위해 가동할 필요도 없었다: 그것은 아리안 5가 새로운 로켓에 적합할 때 소프트웨어에 남아있던 작은 이전 아리안 5의 발사-시간 프로세스였다.또한, 고장의 진짜 원인은 소프트웨어가 오버플로를 탐지했을 때 어떻게 처리했는지를 기술 사양에 있는 결함이었다. 즉, 개발 중 소프트웨어 테스트 중 테스트 장비에 연결되었을 것이지만 비행 중 로켓 스티어링 모터에 연결되었을 것이다.덤프가 엔진 노즐을 한쪽으로 강하게 몰아넣어 로켓이 공기역학적 제어에서 벗어나게 하고 공기 [25]중의 빠른 분해를 촉진시켰다.
2015년 4월 30일, 미국 연방 항공청은 전력과 램 공기 터빈의 배치로 이어질 수 있는 정수 오버플로를 방지하기 위해 보잉 787 운영자들에게 정기적으로 전기 시스템을 재설정하도록 명령할 것이라고 발표했고, 보잉은 4분기에 [26]소프트웨어 업데이트를 배포했다.유럽 항공 안전국은 2015년 [27]5월 4일에 그 뒤를 따랐다.이 에러는, 32 비트의 부호 있는 정수를 나타내는, 2 킬로초(약 249일) 후에 발생합니다.
일부 컴퓨터 게임에서 오버플로 버그가 나타납니다.슈퍼마리오 브라더스.NES의 경우 저장된 생명수는 서명된 바이트(-128~127)로 플레이어가 안전하게 127명의 생명을 가질 수 있지만, 플레이어가 128번째 생명에 도달하면 카운터가 0으로 롤오버되고(이전에 숫자 카운터가 점멸하지만) 즉시 게임이 종료됩니다.개발자들은 많은 생명을 얻을 수 있다고 생각하지 못했을 수도 있기 때문에, 이것은 데이터 오버플로에 의한 것입니다.아케이드 게임 동키콩은 시간/보너스의 정수 오버플로로 레벨 22를 넘어서는 것이 불가능하다.이 게임은 사용자가 속한 레벨 번호를 가져와서 10을 곱하고 40을 더합니다.레벨 22에 도달하면 시간/보너스 번호는 260으로 8비트 256 값 레지스터에는 너무 크기 때문에 0으로 리셋되고 나머지 4는 시간/보너스로서 표시됩니다.레벨을 완료하기에는 너무 짧습니다.동키콩 주니어에서. 10,000을 넘는 숫자를 계산하려고 하면 처음 4자리 숫자만 표시됩니다.오버플로는 팩맨에서 [28]유명한 "화면 분할" 수준의 원인입니다.문명에서의 악명 높은 핵 간디 버그는 게임이 간디의 기본 공격 수준인 1에서 2를 빼서 보통 최대 공격 수준인 10보다 거의 26배 높은 255로 설정했을 때 발생한 정수 저류에 의해 발생했다고 한다.이러한 버그로 인해 Infdev 개발 기간부터 베타 1.7.3까지 존재했던 마인크래프트의 Far Lands가 발생하였고, 나중에 베타 1.8에서 수정되었지만 마인크래프트 포켓 에디션과 Windows 10 [29]Edition에는 여전히 존재합니다.슈퍼닌텐도엔터테인먼트시스템(NES) 게임 람보르기니 아메리칸챌린지에서 플레이어는 레이스 비용을 지불한 후 남은 돈의 한도를 초과하여 벌금을 부과받음으로써 경기 중 금액이 0달러 이하로 떨어지게 할 수 있다. 이는 정수를 제거하고 마이너스보다 65535,000달러를 더 준다.ve.[30] S.T.A.L.K.E.R.에서도 유사한 결함이 발생합니다. Clear Sky에서는 플레이어는 충분한 자금 없이 빠르게 이동하다가 플레이어가 도난당하여 모든 통화를 빼앗기는 이벤트로 이동합니다.게임이 플레이어의 돈을 0달러까지 빼앗으려 한 후, 플레이어는 게임 [31]통화로 2147482963을 부여받는다.

IBM – Microsoft Macro Assembler (MASM) 버전 1.00 및 동일한 Pascal 컴파일러에 의해 빌드된 다른 모든 프로그램에는 스택 설정 코드에 정수 오버플로 및 서명 오류가 있어 512KB 이상의 메모리를 가진 새로운 DOS 머신이나 에뮬레이터에서 실행할 수 없었습니다.프로그램이 행업하거나 에러 메시지를 표시하고 DOS로 [32]이행한다.
2016년 8월 Resorts World 카지노의 한 카지노 기계는 버그가 넘쳐나 4천294만9672.76달러의 경품 티켓을 인쇄했다.카지노 측은 기계가 최대 지급액이 1만 달러라고 분명히 밝혔기 때문에 이 금액을 초과하는 상금은 프로그래밍 버그에 의한 것일 수 밖에 없다는 점을 들어 오동작이라며 지급을 거부했다.뉴욕 주 게임 위원회는 [33]카지노의 손을 들어주었다.
「 」를 참조해 주세요.
레퍼런스
- ^ a b c ISO staff. "ISO/IEC 9899:2011 Information technology - Programming languages - C". ANSI.org.
- ^ "Wrap on overflow - MATLAB & Simulink". www.mathworks.com.
- ^ "Saturate on overflow - MATLAB & Simulink". www.mathworks.com.
- ^ 산술 언더플로
- ^ "CWE - CWE-191: Integer Underflow (Wrap or Wraparound) (3.1)". cwe.mitre.org.
- ^ "Overflow And Underflow of Data Types in Java - DZone Java". dzone.com.
- ^ Mir, Tabish (4 April 2017). "Integer Overflow/Underflow and Floating Point Imprecision". medium.com.
- ^ "Integer underflow and buffer overflow processing MP4 metadata in libstagefright". Mozilla.
- ^ "Avoiding Buffer Overflows and Underflows". developer.apple.com.
- ^ "Operator expressions - The Rust Reference". Rust-lang.org. Retrieved 2021-02-12.
- ^ BillWagner. "Checked and Unchecked (C# Reference)". msdn.microsoft.com.
- ^ Seed7 매뉴얼, 섹션 16.3.3 OFLOW_ERROR.
- ^ Swift Programming Language.Swift 2.1 에디션2015년 10월 21일
- ^ As-if 무한 범위 정수 모델
- ^ Muntean, Paul Ioan; Monperrus, Martin; Sun, Hao; Grossklags, Jens; Eckert, Claudia (2019). "IntRepair: Informed Repairing of Integer Overflows". IEEE Transactions on Software Engineering. 47 (10): 2225–2241. arXiv:1807.05092. doi:10.1109/TSE.2019.2946148. ISSN 0098-5589. S2CID 51627444.
- ^ Python 문서, 섹션 5.1 산술 변환.
- ^ "Declaration TYPE". Common Lisp HyperSpec.
- ^ "Declaration OPTIMIZE". Common Lisp HyperSpec.
- ^ Reddy, Abhishek (2008-08-22). "Features of Common Lisp".
- ^ Pierce, Benjamin C. (2002). Types and Programming Languages. MIT Press. ISBN 0-262-16209-1.
- ^ Wright, Andrew K.; Felleisen, Matthias (1994). "A Syntactic Approach to Type Soundness". Information and Computation. 115 (1): 38–94. doi:10.1006/inco.1994.1093.
- ^ Macrakis, Stavros (April 1982). "Safety and power". ACM SIGSOFT Software Engineering Notes. 7 (2): 25–26. doi:10.1145/1005937.1005941. S2CID 10426644.
- ^ "Extra, Extra - Read All About It: Nearly All Binary Searches and Mergesorts are Broken". googleresearch.blogspot.co.uk.
- ^ Gleick, James (1 December 1996). "A Bug and A Crash". The New York Times. Retrieved 17 January 2019.
- ^ 아리안 5호 발사 실패 사건 공식 보고
- ^ Mouawad, Jad (30 April 2015). "F.A.A. Orders Fix for Possible Power Loss in Boeing 787". New York Times.
- ^ "US-2015-09-07: Electrical Power – Deactivation". Airworthiness Directives. European Aviation Safety Agency. 4 May 2015.
- ^ Pittman, Jamey. "The Pac-Man Dossier".
- ^ "Minecraft Gamepedia Page". Minecraft Gamepedia.
- ^ Ghostarchive 및 Wayback Machine에서 아카이브:
- ^ "Money glitch :: S.T.A.L.K.E.R.: Clear Sky General Discussions".
- ^ Lenclud, Christophe. "Debugging IBM MACRO Assembler Version 1.00".
- ^ Kravets, David (June 15, 2017). "Sorry ma'am you didn't win $43M – there was a slot machine 'malfunction'". Ars Technica.