В качестве примера ошибок в ядре, которые удалось бы избежать при использовании Rust, упомянута ошибка в подсистеме Bluetooth, остававшаяся незамеченной 15 лет, и проблема в гипервизоре Xen. В первом случае разработчик выполнил разыменование указателя без проверки, а во втором забыл снять блокировку в коде обработки ошибок.
По словам Грега, большинство ошибок в ядре вызваны подобными мелочами, которые со временем накапливаются и всплывают как уязвимости. В Rust многие из подобных проблемы предотвращаются компилятором, например, Rust-абстракции для блокировок в ядре допускают получение доступа к внутренним указателям структур только после захвата соответствующей блокировки, которая снимается автоматически. Без захвата блокировки получить доступ к указателям структур на Rust не получится.
Грег считает, что подобные возможности Rust недопустили бы появления 60% ошибок, выявляемых в ядре, а выполняемые компилятором проверки избавили бы сопровождающих от траты времени на обсуждение с авторами корректности обработки ошибок и обоснованности выставления блокировок в нужном месте. Более того, внедрение поддержки Rust уже оказало благотворное влияние и на Си код в ядре, благодаря приведению в порядок Си-кода и интерфейсов, а также заимствованию некоторых приёмов разработки (например, были реализованы блокировки с ограниченной областью видимости).
Благодаря системе типов, гарантирующей соблюдение заданных правил, и применению систем непрерывной интеграции, проверяющих код на этапе сборки, при рецензировании изменений на Rust сопровождающие могут сосредоточиться на проверке логики работы, а не отслеживании манипуляций с ресурсами. Применение Rust также позволяет более внимательно относится к данным, поступающим от оборудования или из внешних систем. Подобное достигается благодаря явному разграничению заслуживающих и не заслуживающих доверия данных на уровне системы типов — разработчику достаточно выполнить анализ при переходе из недоверительного в доверительное состояние.
Последнее время команда, отвечающая за безопасность в ядре, публикует каждый день примерно 13 отчётов об уязвимостях, что на фоне прошлой динамики выявления уязвимостей воспринимается как какое-то безумие (для примера за вчерашний день было опубликовано 277 отчётов об уязвимостях в ядре). По мнению Грега, использование Rust является одним из реальных способов добиться снижения числа ошибок в ядре, вызванных традиционными оплошностями при обработке ошибок и управлении ресурсами. В ядре поддержка Rust уже вышла за рамки эксперимента и в конце прошлого года была признана штатной возможностью ядра.
Источник: http://www.opennet.ru/opennews/art.shtml?num=65549
