Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Поведение, не считающееся unsafe

Компилятор Rust не считает следующие поведения небезопасными, хотя программист может (должен) находить их нежелательными, неожиданными или ошибочными.

  • Взаимные блокировки (Deadlocks)
  • Утечки памяти и других ресурсов
  • Выход без вызова деструкторов
  • Раскрытие рандомизированных базовых адресов через утечки указателей

Переполнение целых чисел

Если программа содержит арифметическое переполнение, программист допустил ошибку. В следующем обсуждении мы сохраняем различие между арифметическим переполнением и оборачивающей арифметикой. Первое ошибочно, в то время как второе является преднамеренным.

Когда программист включил утверждения debug_assert! (например, включив неоптимизированную сборку), реализации должны вставлять динамические проверки, которые вызывают panic при переполнении. Другие виды сборок могут приводить к panic или тихому оборачиванию значений при переполнении, на усмотрение реализации.

В случае неявно оборачиваемого переполнения реализации должны предоставлять хорошо определенные (даже если все еще считающиеся ошибочными) результаты, используя соглашения о переполнении дополнения до двух.

Целочисленные типы предоставляют встроенные методы, позволяющие программистам явно выполнять оборачивающую арифметику. Например, i32::wrapping_add предоставляет сложение с оборачиванием по дополнению до двух.

Стандартная библиотека также предоставляет ньютайп Wrapping<T>, который гарантирует, что все стандартные арифметические операции для T имеют семантику оборачивания.

См. RFC 560 для условий ошибок, обоснования и более подробной информации о переполнении целых чисел.

Логические ошибки

Безопасный код может налагать дополнительные логические ограничения, которые нельзя проверить ни во время компиляции, ни во время выполнения. Если программа нарушает такие ограничения, поведение может быть неспецифицированным, но не приведет к неопределенному поведению. Это может включать паники, некорректные результаты, аварийное завершение и незавершение. Поведение также может различаться между запусками, сборками или видами сборок.

Например, реализация как Hash, так и Eq требует, чтобы значения, считающиеся равными, имели равные хеши. Другой пример - структуры данных такие как BinaryHeap, BTreeMap, BTreeSet, HashMap и HashSet, которые описывают ограничения на модификацию их ключей, пока они находятся в структуре данных. Нарушение таких ограничений не считается небезопасным, однако программа считается ошибочной и ее поведение непредсказуемым.