경계 검사

Bounds checking

컴퓨터 프로그래밍에서 경계 검사는 변수가 사용되기 전에 특정 범위 내에 있는지 여부를 탐지하는 방법입니다.일반적으로 숫자가 지정된 유형에 맞는지(범위 검사) 또는 배열 인덱스로 사용되는 변수가 배열의 범위 내에 있는지(색인 검사) 확인하기 위해 사용됩니다.일반적으로 경계 검사에 실패하면 일종의 예외 신호가 생성됩니다.

사용 시마다 경계 검사를 수행하는 것은 시간이 많이 걸리기 때문에 항상 수행되지는 않습니다.경계 검사 제거는 불필요한 경계 검사를 제거하는 컴파일러 최적화 기술입니다.

범위 확인

범위 체크는 수치가 특정 범위 내에 있는지 확인하는 체크입니다.예를 들어 16비트 정수에 할당되는 값이 16비트 정수의 용량 내에 있는지 확인합니다(랩 어라운드에 대한 체크).이것은 타입 체크와는 전혀 다릅니다.다른 범위 체크는 더 제한적일 수 있습니다.예를 들어 달력 월 수를 유지하는 변수는 1 ~12 범위만 받아들이도록 선언될 수 있습니다.

인덱스 체크

인덱스 체크는 어레이를 인덱싱하는 모든 식에서 인덱스 값이 어레이의 경계(어레이가 정의되었을 때 설정)에 대해 체크되는 것을 의미합니다.인덱스가 범위를 벗어나면 어떤 종류의 오류로 인해 추가 실행이 일시 중단됩니다.읽기 또는 특히 배열의 범위를 벗어난 값을 쓰거나 하면 프로그램이 오작동하거나 크래쉬하거나 보안 취약점을 활성화(버퍼 오버플로 참조)할 수 있으므로 인덱스 체크는 많은 고급 언어의 일부입니다.

인덱스 체크 기능이 있는 초기 컴파일된 프로그래밍 언어에는 BASIC과 같은 해석된 프로그래밍 언어뿐만 아니라 ALGOL 60, ALGOL 68 및 Pascal이 포함되어 있습니다.

C와 같은 많은 프로그래밍 언어는 속도를 높이기 위해 자동 경계 검사를 수행하지 않습니다.그러나 이로 인해 많은 오류버퍼 오버플로우가 수집되지 않습니다.많은 프로그래머들은 이러한 언어들이 빠른 [1]실행을 위해 너무 많은 것을 희생한다고 믿고 있습니다.1980년 튜링상 강연에서 C. A. R. Hoare는 경계 검사를 포함한 언어인 ALGOL 60의 설계 경험을 다음과 같이 기술했다.

이 원칙의 결과로 각 첨자 변수의 모든 첨자가 런타임에 배열의 상한 및 하한에 대해 확인되었습니다.몇 년 후, 우리는 고객에게 생산 공정의 효율성을 높이기 위해 이러한 검사를 끌 수 있는 옵션을 제공하기를 원하는지 물었습니다.그들은 만장일치로 그러지 말 것을 촉구했습니다. 그들은 이미 프로덕션 운영에서 서브스크립트 오류가 얼마나 자주 발생하는지 알고 있었습니다. 서브스크립트 오류를 감지하지 못하면 심각한 결과를 초래할 수 있습니다.나는 1980년에도 언어 디자이너와 사용자들은 이 교훈을 배우지 못했다는 것을 두려움과 공포로 기억한다.공학의 어떤 훌륭한 분야에서도, 그러한 기본적인 예방책을 지키지 않는 것은 오랫동안 법에 저촉되었을 것이다.

런타임 체크를 강제하는 주요 언어로는 Ada, C#, Haskell, Java, JavaScript, Lisp, PHP, Python, Ruby, Rust, Visual Basic 등이 있습니다.D 언어 및 OCaml 언어에는 컴파일러 스위치로 활성화 또는 비활성화되어 있는 실행 시간 범위 체크가 있습니다.C++에서는 실행 시간 체크는 언어의 일부가 아니라 STL의 일부이며 컴파일러 스위치(_GLIBCXX_DEBUG=1 또는 _LIBCPP_DEBUG=1)를 사용하여 활성화됩니다.또한 C#은 안전하지 않은 영역도 지원합니다.코드의 섹션은 (특히) 효율을 높이기 위해 경계체크를 일시적으로 정지합니다.이는 전체 프로그램의 안전을 희생하지 않고 시간에 중요한 작은 병목 현상을 가속화하는 데 유용합니다.

JS++ 프로그래밍 언어는 기존 유형(인덱스 또는 키가 경계 내인지 또는 경계 외인지를 나타내는 공칭 유형)을 사용하여 배열 인덱스 또는 맵 키가 경계 외인지 분석할 수 있으며 코드 생성을 안내합니다.기존 유형은 컴파일 [2]시간에 1ms의 오버헤드만 추가하는 것으로 나타났습니다.

하드웨어 한계 검사

경계 검사를 통해 추가된 안전성은 소프트웨어에서 검사를 수행할 경우 CPU 시간을 필요로 하지만 하드웨어에서 검사를 수행할 수 있다면 런타임 비용 없이 "무료"로 안전을 제공할 수 있습니다.하드웨어 경계 검사를 갖춘 초기 시스템은 [3]1974년에 발표된 ICL 2900 시리즈 메인프레임입니다.VAX 컴퓨터에는 어레이 인덱스 체크를 위한 INDEX 어셈블리 명령이 있으며, 이 명령어는 6개의 오퍼랜드를 사용하며, 모두 임의의 VAX 어드레싱 모드를 사용할 수 있습니다.B6500 및 이와 유사한 Burroughs 컴퓨터는 머신 코드를 생성하기 위해 컴파일된 컴퓨터 언어에 관계없이 하드웨어를 통해 바인드 검사를 수행했습니다.Motorola 68000 시리즈에서의 CHK2 명령 등, 한정된 수의 최신 CPU에는 경계를 체크하기 위한 특수한 명령이 있습니다.

어레이 및 버퍼 [4]액세스의 안전성을 확보하기 위해 x86에 내장된 가상 메모리 관리 유닛을 사용하는 방법에 대한 연구는 적어도 2005년부터 진행되어 왔습니다.2015년에 인텔은 CPU 레지스터에 경계를 저장하고 메모리에 테이블을 저장하는 Skylake 프로세서 아키텍처에 인텔 MPX 확장을 제공하였습니다.2017년 초 현재 적어도 GCC는 MPX 확장을 지원합니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Cowan, C; Wagle, F; Calton Pu; Beattie, S; Walpole, J (1999). "Buffer overflows: Attacks and defenses for the vulnerability of the decade". Proceedings DARPA Information Survivability Conference and Exposition. DISCEX'00. Vol. 2. pp. 119–129. doi:10.1109/DISCEX.2000.821514. ISBN 978-0-7695-0490-2. S2CID 167759976.
  2. ^ "JS++ 0.9.0: Efficient Compile Time Analysis of Out-of-Bounds Errors – JS++ Blog". Archived from the original on 2019-01-12.
  3. ^ J. K. Buckle (1978). The ICL 2900 Series (PDF). Macmillan Computer Science Series. pp. 17, 77. ISBN 978-0-333-21917-1. Archived from the original (PDF) on 20 April 2018. Retrieved 20 April 2018.
  4. ^ Lap-Chung Lam; Tzi-Cker Chiueh (2005). "Checking Array Bound Violation Using Segmentation Hardware". 2005 International Conference on Dependable Systems and Networks (DSN'05). pp. 388–397. doi:10.1109/DSN.2005.25. ISBN 0-7695-2282-3. S2CID 6278708.

외부 링크