Rust is a memory-safe programming language that disallows undefined behavior. Its safety guarantees have been extensively examined by the community through empirical studies, which has led to its remarkable success. However, unsafe code remains a critical concern in Rust. By reviewing the safety design of Rust and analyzing real-world Rust projects, this paper establishes a systematic framework for understanding unsafe code and undefined behavior, and summarizes the soundness criteria for Rust code. It further derives actionable guidance for achieving sound encapsulation.
academic
Подход на основе трассировки для анализа безопасности кода
Rust — это язык программирования с гарантией безопасности памяти, запрещающий неопределённое поведение. Его гарантии безопасности подтверждены многочисленными эмпирическими исследованиями сообщества, что является причиной его значительного успеха. Однако код unsafe остаётся критической проблемой в Rust. В данной статье путём анализа дизайна безопасности Rust и реальных проектов на Rust устанавливается систематическая база для понимания кода unsafe и неопределённого поведения, обобщаются стандарты корректности кода Rust и предлагаются практические рекомендации по реализации корректной инкапсуляции.
Ограничения обещаний безопасности Rust: Хотя Rust обещает, что безопасный код не приведёт к неопределённому поведению, код unsafe может всё ещё представлять риски безопасности
Отсутствие систематической базы: Существующие исследования не содержат систематического теоретического анализа отношения между кодом unsafe и неопределённым поведением
Сложность проверки корректности инкапсуляции: Отсутствуют практические методы для проверки корректности функций и структур, содержащих код unsafe
Установление главной теоремы: Формальное доказательство отношения между неопределённым поведением и кодом unsafe, подтверждающее принцип "неопределённое поведение возникает только из кода unsafe и полностью определяется его ограничениями безопасности"
Предложение стандартов корректности: Установление критериев определения корректности для безопасных и небезопасных функций, структур и модулей
Разработка рекомендаций по инкапсуляции: Вывод практических принципов и следствий для реализации корректной инкапсуляции
Построение структуры аудита: Предложение систематического метода аудита на основе графа распространения небезопасности (UPG)
Главная теорема (Theorem 1): Для хорошо типизированной программы Rust P неопределённое поведение возникает только если P содержит код unsafe и нарушает соответствующие ограничения безопасности:
P ⊢ UB ⇒ (P ∋ UC) ∧ (P ⊬ SC_UC)
где UC обозначает код unsafe, а SC_UC обозначает ограничения безопасности кода unsafe.
Требования корректности структуры S = {C, F, M, d}:
Статические методы: Все конструкторы и статические методы должны удовлетворять принципам инкапсуляции функции
Динамические методы: Учитывая влияние деструктивных методов, обеспечить выполнение ограничений безопасности при всех комбинациях конструкторов и методов
Метод анализа на основе трассировки: Аналогично анализу потоков данных, рассматривает код unsafe как источник загрязнения, а выход функции как приёмник
Иерархическая корректность: Прогрессивный анализ от функций → структур → модулей → крейтов
Обработка деструктивных методов: Инновационный учёт влияния изменяемых методов на инварианты безопасности других методов
Граф распространения небезопасности: Предоставляет визуальный инструмент аудита
Rust Team. Soundness (of code / a library). Rust Unsafe Code Guidelines.
Zihao Rao, et al. Annotating and Auditing the Safety Properties of Unsafe Rust. arXiv preprint arXiv:2504.21312, 2025.
Общая оценка: Данная статья вносит важный теоретический вклад в анализ безопасности кода unsafe в Rust, устанавливая систематическую структуру анализа. Хотя в области экспериментальной проверки и реализации инструментов есть место для улучшений, её теоретическая ценность и практический потенциал заслуживают признания. Данная работа обеспечивает прочную теоретическую основу для исследований и практики безопасности Rust.