경계 검사
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
경계 검사는 프로그램에서 특정 값이나 인덱스가 유효한 범위 내에 있는지 확인하는 검사 방법이다. 범위 검사는 숫자가 지정된 범위 내에 있는지, 인덱스 검사는 배열 접근 시 사용되는 인덱스 값이 배열의 유효한 범위 내에 있는지 검사한다. 많은 고급 프로그래밍 언어는 인덱스 검사를 내장하고 있으며, 하드웨어적으로 경계 검사를 지원하는 경우도 있다. 경계 검사는 프로그램 오류, 충돌, 보안 취약점 등을 방지하는 데 중요한 역할을 한다.
더 읽어볼만한 페이지
- 배열 - 원형 버퍼
원형 버퍼는 고정 크기의 자료구조로, 처음과 끝이 연결되어 데이터가 순환하며 저장되는 FIFO 방식의 버퍼이며, 큐 구현, 멀티미디어 스트리밍, 데이터 압축 등에 활용된다. - 배열 - 할바흐 배열
할바흐 배열은 특정 면에 자기장을 집중시키고 다른 면에서는 상쇄시키는 배열로, 자장 격리에 유용하며 다양한 산업 및 첨단 기술 분야에 응용된다. - 컴퓨터 오류 - 블루스크린
블루스크린은 윈도우 운영체제에서 발생하는 치명적인 오류로, 컴퓨터 작동을 멈추고 파란색 화면에 오류 메시지를 표시하며, 하드웨어 또는 소프트웨어 문제로 인해 발생하고, 시스템 복원, 안전 모드 부팅 등의 방법으로 대처한다. - 컴퓨터 오류 - 글리치
글리치는 예기치 않은 오작동이나 오류를 뜻하며, 전자 공학, 컴퓨터, 비디오 게임, 텔레비전 방송, 대중문화 등 다양한 분야에서 기능 실패, 오류, 그래픽 및 사운드 문제, 신호 오류 등의 이상 현상을 포괄적으로 지칭하는 용어이다.
경계 검사 |
---|
2. 범위 검사
범위 검사는 숫자가 특정 범위 안에 있는지 확인하는 검사이다. 범위 검사는 데이터 타입 검사와는 다르다.
2. 1. 범위 검사의 예시
범위 검사의 예시로는 16비트 정수형 변수에 숫자를 대입할 때, 그 숫자가 16비트 정수형으로 표현될 수 있는 범위 안에 있는지 검사하는 것이 있다. 월을 표현하는 변수의 경우에는 값이 1부터 12 사이에 있는지 검사한다.파이썬 예시:
```python
def set_month(month: int):
if month < 1 or month > 12:
raise ValueError("The month must be between 1 and 12")
2. 2. 범위 검사와 데이터 타입 검사
범위 검사는 어떤 숫자가 특정 범위 안에 있는지 확인하는 검사이다. 범위 검사의 예시는 다음과 같다.- 16비트 정수형 변수에 숫자를 대입할 때, 해당 숫자가 16비트 정수형으로 표현될 수 있는 범위 안에 있는지 검사한다.
- 월을 표현하는 변수의 값이 1부터 12 사이에 있는지 검사한다.
범위 검사는 데이터 타입 검사와는 다르다. 범위 검사는 숫자가 특정 범위 안에 있는지 확인하는 것이고, (16비트 정수에 값을 할당할 때 16비트 정수 용량 안에 있는지 확인하는 것처럼) 반올림 검사와 비슷하다. 타입 검사와는 다소 차이가 있다. 달력을 나타내는 변수가 1에서 12 사이의 값만 허용하는 것처럼, 범위 검사는 더 제한적일 수 있다.
파이썬 예시:
```python
def set_month(month: int):
if month < 1 or month > 12:
raise ValueError("The month must be between 1 and 12")
3. 인덱스 검사
인덱스 검사는 배열 접근 시 사용되는 인덱스 값이 배열의 유효한 범위 내에 있는지 검사하는 것이다. 흔히 '경계 검사'라고 하면 인덱스 검사를 의미한다. 인덱스 검사 실패는 통상적으로 에러로 인한 프로그램 종료로 이어진다.
파스칼, 포트란, 자바와 같은 고급 프로그래밍 언어들은 인덱스 검사를 내장하고 있다. VAX 컴퓨터는 ''INDEX''라는 배열 인덱스 검사를 위한 어셈블리 명령어를 가졌고, B6500 및 이와 유사한 Burroughs 사 컴퓨터는 작성된 프로그래밍 언어와 무관하게 하드웨어 차원에서 경계 검사를 수행했다. 이후 세대의 CPU 모델 중에선 소수만이 경계 검사를 위한 특수 명령어를 도입하였는데, CHK2 명령어가 있는 모토로라 68000 계열 CPU가 그 중 하나이다.
C를 포함한 많은 프로그래밍 언어는 빠른 실행 속도를 위해 경계 검사를 자동으로 수행하지 않는다.
3. 1. 인덱스 검사 실패의 결과
인덱스 검사 실패는 일반적으로 프로그램 오류 및 종료로 이어진다. 고급 프로그래밍 언어들은 배열 경계 바깥에서 데이터를 읽거나 쓰는 것이 허용되면 프로그램 오동작, 충돌, 심지어 버퍼 오버플로와 같은 보안 취약점 등이 발생할 수 있기 때문에 인덱스 검사 기능을 내장하고 있다.[5]파스칼, 포트란, 자바와 같은 고급 프로그래밍 언어들은 인덱스 검사를 내장하고 있다. 반면 C를 포함한 많은 프로그래밍 언어는 빠른 실행 속도를 위해 경계 검사를 자동으로 수행하지 않으며, 이로 인해 Off-by-one 에러나 버퍼 오버플로 취약점 등이 발견되지 않은 채 방치되기도 한다. 영국의 컴퓨터 과학자 C. A. R. Hoare는 1980년 튜링상 강연에서, 자동 경계 검사 기능을 내장한 ALGOL 60 프로그래밍 언어를 디자인하던 시절, 상용 서비스 중인 프로그램의 효율을 위해 경계 검사 기능을 켜고 끌 수 있는 옵션을 제공하자는 의견에 대해 고객들이 만장일치로 반대했다고 회고했다.
실행 시간 (런타임) 경계 검사 기능을 지원하는 언어로는 Ada, C#, 하스켈, 자바, 자바스크립트, 리스프, PHP, 파이썬, Ruby, 비주얼 베이직 등이 있다. D 언어와 OCaml은 컴파일러 옵션을 통해 실행 시간 경계 검사 기능을 켜거나 끌 수 있다.
3. 2. 인덱스 검사의 중요성
고급 프로그래밍 언어들이 인덱스 검사 기능을 내장하는 이유는 배열 경계 바깥의 데이터 읽기/쓰기가 프로그램 오작동, 충돌, 심지어 버퍼 오버플로와 같은 보안 취약점을 유발할 수 있기 때문이다.[5]파스칼, 포트란, 자바 등은 인덱스 검사를 내장하고 있다. VAX 컴퓨터는 ''INDEX''라는 배열 인덱스 검사 어셈블리 명령어를 가졌고, B6500 및 유사한 Burroughs 사 컴퓨터는 하드웨어 차원에서 경계 검사를 수행했다. 모토로라 68000 계열 CPU는 CHK2 명령어를 통해 경계 검사를 지원했다.[5]
반면, C를 포함한 많은 언어는 빠른 실행 속도를 위해 자동 경계 검사를 하지 않아 Off-by-one 에러나 버퍼 오버플로 취약점이 방치되기도 한다. 많은 프로그래머들은 속도를 위해 너무 많은 것을 희생한다고 비판한다.[5] 영국의 컴퓨터 과학자 C. A. R. Hoare는 1980년 튜링상 강연에서 ALGOL 60 설계 경험을 회고하며, 고객들이 경계 검사 기능을 끄는 옵션을 만장일치로 반대했다고 밝혔다. 이는 경계 오류가 얼마나 자주 발생하고, 발견되지 않으면 얼마나 파괴적인지 알고 있었기 때문이다.[5]
Ada, C#, 하스켈, 자바, 자바스크립트, 리스프, PHP, 파이썬, Ruby, 비주얼 베이직 등은 실행 시간 경계 검사를 지원한다. D와 OCaml은 컴파일러 옵션으로, C#은 unsafe 구역으로 경계 검사를 제어할 수 있다.[5]
3. 3. 인덱스 검사를 지원하는 프로그래밍 언어
파스칼, 포트란, 자바와 같은 고급 프로그래밍 언어들은 인덱스 검사를 내장하고 있다.[5] C, C++ 등 일부 언어는 빠른 실행 속도를 위해 자동 경계 검사를 수행하지 않지만, 라이브러리나 컴파일러 옵션을 통해 기능을 활성화할 수 있다.[1] 에이다, C#, 하스켈, 자바, 자바스크립트, 리스프, PHP, 파이썬, 루비, 비주얼 베이직 등은 실행 시간 경계 검사 기능을 지원한다.[5]3. 4. C. A. R. Hoare의 경계 검사 중요성 강조
영국의 컴퓨터 과학자 C. A. R. Hoare는 1980년 튜링상 강연에서 경계 검사의 중요성을 강조했다.[5] 그는 ALGOL 60 프로그래밍 언어 설계 경험을 예로 들면서, 사용자들은 효율성보다 안정성을 더 중요하게 생각하여 경계 검사 기능을 끄는 옵션을 만장일치로 반대했다고 밝혔다.[5] 그는 1980년에도 많은 프로그래밍 언어 설계자와 사용자들이 이 교훈을 배우지 못했다는 사실에 우려를 표했다.[1]4. 하드웨어 경계 검사
소프트웨어적인 경계 검사는 프로그램의 안전성을 높이는 대신 추가 CPU 시간을 소모하지만, 하드웨어적인 경계 검사는 이론적으로 실행 시간 손실 없이 안전성만 확보할 수 있다. 1974년 ICL 2900 시리즈가 하드웨어 경계 검사를 채택한 이래, 2005년부터 x86 시스템의 내장 메모리 관리 유닛(MMU)을 이용해 배열 및 버퍼 접근 시 안전성을 확보하는 방법에 대한 연구가 시작되었다.[7] 2015년 Intel은 CPU 레지스터와 메모리 상에 테이블로 경계를 저장하는 Skylake 프로세서 아키텍처 확장(Intel MPX)을 발표했고, 2017년 GCC 컴파일러에서 Intel MPX 확장을 지원하기 시작했다. 그러나 이후 다수의 연구에 의해 기존 소프트웨어적 기술들과 비교해 성능/기능상 이점을 갖추지 못한 것으로 평가받으며[8][9][10] 실세계 적용이 둔화되거나 위축되는 추세이다.[11]
4. 1. 하드웨어 경계 검사 지원 사례
ICL 2900 시리즈는 1974년 하드웨어 경계 검사를 채택한 초기 컴퓨터 시스템이다.[6] VAX 컴퓨터는 배열 인덱스 검사를 위한 INDEX 어셈블리 명령어를 가지고 있었다. B6500 및 Burroughs 사의 유사한 컴퓨터들은 하드웨어 차원에서 경계 검사를 수행했다. Motorola 68000 계열 CPU는 CHK2 명령어를 통해 경계 검사를 지원했다. Intel은 2015년 Skylake 프로세서 아키텍처에 Intel MPX 확장 기능을 도입하여 경계 검사를 지원했지만,[8][9][10] 성능 및 기능상의 한계로 인해 널리 사용되지 않고 있다.[11]참조
[1]
서적
Proceedings DARPA Information Survivability Conference and Exposition. DISCEX'00
[2]
웹사이트
JS++ 0.9.0: Efficient Compile Time Analysis of Out-of-Bounds Errors – JS++ Blog
https://www.onux.com[...]
2019-01-11
[3]
서적
The ICL 2900 Series
https://web.archive.[...]
Macmillan Computer Science Series
2018-04-20
[4]
서적
2005 International Conference on Dependable Systems and Networks (DSN'05)
[5]
서적
Proceedings DARPA Information Survivability Conference and Exposition. DISCEX'00
[6]
서적
The ICL 2900 Series
http://www.fujitsu.c[...]
Macmillan Computer Science Series
2018-04-20
[7]
서적
The ICL 2900 Series
http://www.fujitsu.c[...]
Macmillan Computer Science Series
2018-04-20
[8]
ArXiv
Intel MPX Explained: An Empirical Study of Intel MPX and Software-based Bounds Checking Approaches
2017
[9]
웹인용
Konstantin Serebryany - Research at Google
https://research.goo[...]
[10]
웹인용
Discussion of Intel Memory Protection Extensions (MPX) and comparison with AddressSanitizer
https://github.com/g[...]
Google
2013-11-04
[11]
웹인용
GCC 9 Looks Set To Remove Intel MPX Support
https://www.phoronix[...]
Phoronix
2018-04-27
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com