Rust без unsafe всё-таки может словить UB 😬
В сети разошёлся пример: код компилируется на stable Rust, не содержит ни одного unsafe-блока — и при этом позволяет получить dangling reference.
Причина не в том, что borrow checker внезапно «бесполезен», а в soundness-баге компилятора, связанном с lifetime и типами функций. Проблема известна Rust-команде как high-priority unsoundness issue и воспроизводится начиная с Rust 1.66.
То есть формула «safe Rust гарантированно исключает UB» имеет важную оговорку: если сам компилятор и стандартная библиотека sound.
Rust всё ещё сильно сокращает класс memory-safety ошибок - просто даже у borrow checker бывают баги.
В сети разошёлся пример: код компилируется на stable Rust, не содержит ни одного unsafe-блока — и при этом позволяет получить dangling reference.
Причина не в том, что borrow checker внезапно «бесполезен», а в soundness-баге компилятора, связанном с lifetime и типами функций. Проблема известна Rust-команде как high-priority unsoundness issue и воспроизводится начиная с Rust 1.66.
То есть формула «safe Rust гарантированно исключает UB» имеет важную оговорку: если сам компилятор и стандартная библиотека sound.
Rust всё ещё сильно сокращает класс memory-safety ошибок - просто даже у borrow checker бывают баги.