사이클론(프로그래밍 언어)
Cyclone (programming language)![]() |
설계자 | AT&T랩 |
---|---|
처음 등장한 | 전( |
최종 릴리즈 | 1.0 / 2006년 5월 , 전( |
웹 사이트 | 사이클론 |
영향을 받다 | |
C | |
영향받은 | |
러스트, 프로젝트 베로나 |
사이클론 프로그래밍 언어는 C 언어의 안전한 방언으로 사용됩니다.사이클론은 시스템 프로그래밍 도구로서의 C의 전력과 편리성을 잃지 않고 C 프로그램에서 발생할 수 있는 버퍼 오버플로우 및 기타 취약성을 방지하도록 설계되었습니다.
사이클론 개발은 2001년 AT&T Labs Research와 Cornell에 있는 Greg Morrisett 그룹의 공동 프로젝트로 시작되었습니다.버전 1.0은 2006년5월 8일에 출시되었습니다.
언어 기능
사이클론은 모양과 성능을 유지하면서 C의 일반적인 함정을 피하려고 한다.이를 위해 사이클론은 프로그램에 다음과 같은 제한을 두고 있다.
NULL
분할 결함을 방지하기 위해 검사가 삽입됩니다.- 포인터 산술이 제한되어 있습니다.
- 포인터는 사용하기 전에 초기화해야 합니다(확정 할당 분석을 통해 적용됨).
- 지역 분석 및 제한에 의해 점멸 포인터가 방지됩니다.
- "안전한" 캐스트 및 유니언만 허용됩니다.
goto
범위 내로의 이행은 허용되지 않습니다.switch
다른 범위의 라벨은 허용되지 않습니다.- 포인터 반환 함수를 실행해야 합니다.
return
setjmp
지원되지 않습니다.
C 프로그래머가 익숙한 공구 세트를 유지하기 위해 사이클론은 다음과 같은 확장 기능을 제공합니다.
- 절대...
NULL
포인터는 필요 없습니다.NULL
체크 - "Fat" 포인터는 런타임 경계 검사와 함께 포인터 산술을 지원합니다.
- 확장 가능한 영역에서 안전한 수동 메모리 관리 지원
- 힙 할당 값에 대한 가비지 컬렉션
- 태그 부착 유니언은 유형 가변 인수를 지원합니다.
- 주입을 통해 프로그래머용 태그 부착 유니언 사용 자동화
- 다형성은 일부 용도를 대체한다.
- varargs는 fat 포인터로서 구현된다
- 일부 용도는 예외로 대체됩니다.
setjmp
그리고.longjmp
사이클론에 대한 보다 높은 수준의 소개, 사이클론의 배경과 이러한 목록의 출처는 이 문서를 참조하십시오.
사이클론은 일반적으로 C와 많이 닮았지만 C와 비슷한 언어로 봐야 한다.
포인터 타입
사이클론은 세 가지 종류의 포인터를 구현합니다.
이러한 새로운 포인터 타입을 도입하는 목적은 포인터를 사용할 때의 일반적인 문제를 회피하는 것입니다.라고 하는 함수를 예로 들 수 있습니다.foo
int로의 포인터를 취득합니다.
인트 후우(인트 *);
비록 그 함수를 쓴 사람이지만foo
삽입할 수 있었다NULL
체크, 퍼포먼스상의 이유로 체크하지 않았다고 가정합시다.부르기foo(NULL);
는 정의되지 않은 동작을 일으킵니다(통상 SIGSEGV 시그널이 반드시 어플리케이션에 송신되는 것은 아닙니다).이러한 문제를 피하기 위해 사이클론은@
포인터 타입, 절대 그럴 수 없습니다.NULL
따라서 '안전한' 버전은foo
다음과 같습니다.
인트 후우(인트 @);
이것은 Cyclon 컴파일러에게 다음과 같은 주장을 합니다.foo
절대로 그래서는 안 된다NULL
상기의 정의되지 않은 동작을 회피합니다.의 간단한 변경*
로.@
프로그래머가 글을 쓰는 것을 막다NULL
operating system이 트랩을 하지 않도록 합니다.NULL
포인터 참조.그러나 이 추가 제한은 산술적으로 포인터를 직접 조작하는 데 익숙한 대부분의 C 프로그래머에게 큰 장애물이 될 수 있습니다.이는 바람직하지만 버퍼 오버플로우 및 기타 "off-by-one" 스타일의 실수가 발생할 수 있습니다.이를 피하기 위해?
포인터 유형은 알려진 바인딩, 즉 어레이 크기로 구분됩니다.이로 인해 포인터에 대한 추가 정보가 저장되므로 오버헤드가 증가하지만 안전성과 보안이 향상됩니다.단순한 것(그리고 순진한 것)을 예로 들어보자.strlen
함수, C로 작성:
인트 스트렌(컨스턴트 차 *s) { 인트 반복하다 = 0; 한다면 (s == 특수한 순서) 돌아가다 0; 하는 동안에 (s[반복하다] != '\0') { 반복하다++; } 돌아가다 반복하다; }
이 함수는 전달되는 문자열이 NULL에 의해 종료되는 것을 전제로 합니다( ).'\0'
단, 이 경우 어떤 일이 발생합니까?char buf[6] = {'h','e','l','l','o','!'};
이 문자열에 전달되었습니까?이것은 C에서 완전히 합법적이면서도 원인이 될 수 있습니다.strlen
반드시 끈과 관련이 없는 기억을 통해 반복하다s
. 다음과 같은 기능이 있습니다.strnlen
이러한 문제를 피하기 위해 사용할 수 있지만 이러한 함수는 ANSI C의 모든 구현에 표준적이지 않습니다.사이클론 버전strlen
는 C 버전과 크게 다르지 않습니다.
인트 스트렌(컨스턴트 차 ? s) { 인트 반복하다, n = s.크기; 한다면 (s == 특수한 순서) 돌아가다 0; 위해서 (반복하다 = 0; 반복하다 < > n; 반복하다++, s++) { 한다면 (*s == '\0') 돌아가다 반복하다; } 돌아가다 n; }
여기서,strlen
전달된 배열의 길이로 제한되므로 실제 길이를 초과하지 않습니다.각 종류의 포인터 타입은 다른 타입에 안전하게 캐스트할 수 있으며 어레이와 문자열은 자동으로 캐스트됩니다.?
컴파일러에 의해. (캐스팅 from)?
로.*
경계체크를 호출하여 캐스팅을 시작합니다.?
로.@
양쪽을 호출하다NULL
검사 및 경계 검사입니다.캐스팅원*
로.?
체크가 전혀 이루어지지 않는 결과?
포인터의 사이즈는 1 입니다).
매달림 포인터 및 영역 분석
C의 다음 코드를 고려합니다.
차 *이토아(인트 i) { 차 부프[20]; 스프린트(부프,%d,i); 돌아가다 부프; }
기능.itoa
문자 배열을 할당하다buf
스택의 선두에 포인터를 되돌립니다.buf
단, 스택에서 사용되는 메모리는buf
함수가 반환되면 할당 해제되므로 반환된 값을 함수 외부에서 안전하게 사용할 수 없습니다.gcc 및 기타 컴파일러는 이러한 코드에 대해 경고하지만 일반적으로 다음 컴파일은 경고 없이 컴파일됩니다.
차 *이토아(인트 i) { 차 부프[20], *z; 스프린트(부프,%d,i); z = 부프; 돌아가다 z; }
gcc는 옵션 -O2 또는 -O3의 부작용과 같은 코드에 대한 경고를 생성할 수 있지만 이러한 오류가 모두 감지된다는 보장은 없습니다.사이클론은 코드의 각 세그먼트에 대한 지역 분석을 수행하며, 이 버전에서 반환된 것과 같은 매달림 포인터를 방지합니다.itoa
. 특정 범위의 모든 로컬 변수는 힙 또는 다른 로컬 영역과는 별도로 동일한 영역의 일부로 간주됩니다.따라서 분석 시itoa
Cyclon 컴파일러는 다음과 같이 인식합니다.z
는 로컬 스택에 대한 포인터로 오류를 보고합니다.
「 」를 참조해 주세요.
레퍼런스
- 사이클론 사용 설명서
- Cyclone: Dan Grossman, Michael Hicks, Trevor Jim, Greg Morrisett의 Type-safe Language of C. 2005년 1월 발행
외부 링크
- 사이클론 홈페이지
- 공식 웹 사이트를 사용할 수 없기 때문에 오래된 웹 사이트입니다.
- 사이클론 - 소스 코드 저장소
- 사이클론 - FAQ
- C 프로그래머용 사이클론
프레젠테이션: