1. unsafe라고 다 같은 unsafe가 아닙니다.
2. Rust 프로그램에는 invariant가 있습니다. 예를 들어서 ownership이 없으면 수정을 하지 말라 라는 것 등등..
3. 고성능 프로그램을 짜려고 하면 위 invariant는 너무 가혹합니다.
4. unsafe 블록의 의미는
"이 블록 내에서는 invariant를 잠시 깰 텐데
이 블록이 끝나면 내가 다시 invariant를 돌려놓을게"
라는 약속입니다.
5. 예를 들어서
list.insert(a) 라는 함수는 prev/next 포인터를 동시에 만지면서 invariant를 깨지만
prev/next가 동시에 다 세팅된 후에는 list로서 type-safe 한 api를 제공할 수 있게 됩니다.
6. 더 쉽게 설명하면
prev = prev.next;
next = next.prev;
각각의 개별 statement는 invariant를 깨지만
두 statement가 모두 완료되면 invariant가 다시 복구됩니다. (list 의 모양새를 만족한다는 invariant)
7. 다른 유명 Rust 라이브러리, Tokio, Rayon, Crossbeam 등에 대해서는 unsafe가 조금 있어도
개발자를 믿으면서 사람들이 크게 태클을 걸지 않습니다.
8. 근데 이 리포지토리가 특히 이슈가 된 것은.. Rust에 대한 기본적인 이해가 부족한 것 같은 unsafety 가 보이기 때문입니다.
이러한 상황에서는 unsafe코드를 모두 의심하면서 standard에서 제공하는 safe 라이브러리만을 사용하도록 압박이 들어오기 시작합니다.
9. 그러한 unsafety의 예시로..
Cell 이라는 std lib에 get_mut 가 없어서 불편하다고.. 직접 만들어서 쓰는 예시입니다..
Cell에 get_mut를 만들지 않은 것은 Rust 제작자들이 멍청하거나 귀찮아서가 아니고..
Cell의 read-only ref 를 이용해서 in-place-replacement를 구현하기 위해서 모든 get 연산에 대해서 ref를 허용하지 않고 오직 복사본을 가져가도록 강제했기 때문입니다.
이러한 코드가 곳곳에서 발견되니.. 커뮤니티에서는 개발자의 자질을 의심하면서 모든 unsafe에 대해서 예민하게 받아들일 수 밖에 없게 된 것이죠.