2017-01-13 1 views
0

Rust reference 상태 : 원시 포인터 매달려/널을 역 참조 null 원시 포인터를 역 참조 해제하는 동작이 왜 발생합니까?

  • :

    • 안전하지 않은 블록과 안전하지 않은 함수 내에 포함한 모든 녹 코드에서 금지 행동의 목록입니다

이 질문은 전적으로 널 부분에 대해서. 주소 공간에 명확하지만 알 수없는 주소를 액세스 할 수 없도록 요구하는 고유 한 이유는 없습니다. 그게 내 논문입니다 (null 포인터의 대부분 구현이하는 것입니다). 그래서 it seems merely ancient C cruft 이후로 이러한 발자국에서는 왜 Rust를 따르고 있습니까?

내가 들어 여러 가지 이야기 (exampleanother, another) (, 구현에 따라서 등)이 같은 포인터를 액세스 할 필요가 있었다, 그래서 왜 스펙을 허용 내 경력에 다시 길을 얻으려면?

어셈블리 출력과 많은 질문이 나오는 문맥이 in the C++ Reddit thread입니다. 그것도이 Rust Reddit thread에서 자랐습니다.

위에서 언급 한 많은 "전쟁 이야기"에도 불구하고 실제로 나를 괴롭히는 것은 그 영역이 아니라 추상적 인 것입니다. 하드웨어에서 제공되는 주소 공간 액세스를 언어의 명세는 모든 하드웨어/OS/아키텍처를 선험적으로 사용한다.

+1

(심지어 C에서) 널 포인터는 값이 0 인 포인터 일 필요는 없습니다. 주소 0이 일부 플랫폼의 포인터에 유효한 값인 경우 널 포인터에 대해 다른 자리 표시자를 사용할 수 있습니다. – mcarton

+2

@mcarton 질문을 올릴 때이 오해를 피하기 위해 열심히 노력하고, 누군가 실패 할 때마다 실패하기 때문에 실패합니다. 그리고 끝없는 토론은 널 포인터가 값 0이되지 않는 것으로 시작합니다. 미안하지만 질문은 그것에 관한 것이 아니라이 해석을 피하려고합니다. –

+0

질문을 편집하여 "이전에 사용 된 모든 하드웨어/OS/아키텍처에 우선"을 추가했지만 이것이 바로 null 포인터의 요점입니다 : * 모든 하드웨어/OS/아키텍처에 선험적으로 설정되지 않았습니다 . 이는 하드웨어/OS/아키텍처에 대해 선험적으로 설정되지만 값은 해당 하드웨어/OS/아키텍처에서 참조를 해제하는 데 의미가없는 값일 수 있습니다. – mcarton

답변

3

null 포인터는 언어의 다른 곳에서 이미 특수하게 처리됩니다. 예를 들어 Option<Box<T>> (여기서 T: Sized)은 None을 나타내는 데 null 포인터가 사용되므로 두 개가 아닌 한 단어 만 사용합니다. null 포인터를 따르는 코드를 허용하지 않는 것은이 아이디어와 일치합니다.

광범위한 의미에서 Rust는 이국적인 아키텍처를 C로 지원하는 데 많은주의를 기울이지 않았습니다. 이는 악의가 아니며 단지 설계 과정에서의 우선 순위에 불과합니다. 이 언어는 modern web browser으로 작성되었으며, 모두 – 이후에 x86 또는 ARM에서 사용자 모드로 실행되는 응용 프로그램입니다. 이러한 문제가 발생하는 유스 케이스가 아닙니다. 아마도 누군가 1.0 이전 버전을 가져온 경우 다르게 진행되었을 수 있습니다.

+1

그것에 대해 논쟁하고 싶지는 않지만 일관된 것처럼 보인다고 동의합니다.하지만 여전히 그렇습니다. 원할 경우 안전하지 않은 원시 주소 공간 액세스에 어떤 영향을 미칠 수 있는지에 대한 추론은 없습니다. 내 말은, 구현 자체가 도구로 사용하여 기능을 구성하고 제공하기 위해 null을 사용하지만, 안전하지 않은 주소로 액세스 할 주소는 여전히 허용하지 않거나 신경 쓰지 않는 상황에서 생각하고 있습니다. 방법. 플랫폼에서, 그래, 나도 동의하지만 진행을 멈출 수는 없다. 이제 커널/드라이버 공간, 유니 커널 등에서 녹이 나타나고있다. –

관련 문제