У ключевого слова unsafe две роли
-
Создание API с соображениями безопасности
- небезопасные функции:
unsafe fn get_unchecked(&self) { ... } - небезопасные трейты:
unsafe trait Send {}
- небезопасные функции:
-
Использование API с соображениями безопасности
- вызов встроенных небезопасных операторов:
unsafe { *ptr } - вызов небезопасных функций:
unsafe { x.get_unchecked() } - реализация небезопасных трейтов:
unsafe impl Send for Counter {}
- вызов встроенных небезопасных операторов:
Две роли:
- Создание API с соображениями безопасности и определение того, что нужно учитывать
- Использование API с соображениями безопасности и подтверждение того, что эти соображения учтены
Создание API с соображениями безопасности
«Во-первых, ключевое слово unsafe позволяет создавать API, которые могут нарушить гарантии безопасности Rust. В частности, ключевое слово unsafe нужно использовать при определении небезопасных функций и небезопасных трейтов».
«В этой роли вы сообщаете пользователям вашего API, что им нужно быть осторожными».
«Создатель API должен сообщить, какой осторожности требуется придерживаться. Небезопасные API неполны без документации о требованиях безопасности. Вызывающий код должен знать, что он выполнил все требования, а это невозможно, если их не записать».
Использование API с соображениями безопасности
«Ключевое слово unsafe выполняет свою вторую роль — использование API — когда оно стоит рядом с фигурной скобкой».
«В этой роли ключевое слово unsafe означает, что автор был внимателен. Он проверил, что код безопасен, и дал гарантию другим».
«Небезопасные блоки встречаются чаще всего. Они позволяют вызывать небезопасные функции, определённые в первой роли».
«Небезопасные блоки также позволяют выполнять операции, которые компилятор знает как небезопасные, например разыменование сырого указателя».
«Ключевое слово unsafe также может использоваться для реализации небезопасных трейтов».