Depository of News

Как устроена паника в Rust: раскрутка стека, panic = «abort» и что поменялось за два года

newsdepo.com · world

<img src="https://habrastorage.org/getpro/habr/upload_files/6fd/e73/18b/6fde7318bd5898bfb398d05af8bd1dd4.png" /><p>Привет, Хабр!</p><p>Откройте почти любую статью про FFI на Rust. С вероятностью девять из десяти там написано:<strong> «паника, вышедшая за границу с C, — это неопределённое поведение».</strong> Эту фразу повторяют пять лет, я и сам её цитировал, в том числе в одной из прошлых статей. Она перестала быть правдой почти два года назад: с Rust 1.81, вышедшего в сентябре 2024-го, такая паника гарантированно и предсказуемо завершает процесс.</p><p>Причём это не единственный протухший совет. Второй я поймал на себе буквально недавно. Есть присказка, живущая в статьях лет десять: поставь <code>panic = "abort"</code> — и бинарник похудеет процентов на десять. Написана она в релиз-нотах 1.10 за июль 2016 года, я повторил её в чужом пулреквесте, а потом сообразил, что ни разу не проверял. Собрал одну программу тремя способами, посмотрел в <code>size -A</code> и получил шесть десятых процента вместо десяти. Причём в сборке, где раскрутки быть не может по определению, преспокойно лежали одиннадцать килобайт таблиц, существующих исключительно ради раскрутки.</p><p>Но всё это финал истории, а начинается она с того, что паника — вовсе не «программа крякнулась». Это полноценный механизм исключений на той же машинерии, что и в C++. Раскрутка идёт не в один проход, а в два. Каждое исключение метится восемью байтами <code>b"MOZ\0RUST"</code>, доставшимися в наследство от Mozilla, где Rust когда-то жил. <code>catch_unwind</code> ловит не через personality routine, как принято думать, а через отдельный компиляторный интринсик. А ещё есть дыра, про которую почти не пишут, потому что вылезает она только при раскрутке между двумя независимо собранными копиями стандартной библиотеки — и защищает от неё канарейка, живущая прямо внутри исключения.</p> <a href="https://habr.com/ru/articles/1046970/?utm_source=habrahabr&amp;utm_medium=rss&amp;utm_campaign=1046970#habracut">Читать далее</a>

Read full article →