LINUX.ORG.RU

Rust 1.96.0

 


0

5

Опубликован релиз Rust 1.96.0 — очередной стабильной версии языка программирования Rust. Обновление вышло 28 мая 2026 года; установить его можно стандартной командой rustup update stable. Главными изменениями стали новые типы диапазонов в core::range, стабилизация макросов для проверки соответствия шаблонам, ужесточение поведения WebAssembly-сборок и исправления двух уязвимостей в Cargo.

Основные изменения

  • Новые типы диапазонов core::range::Range*. В стандартной библиотеке стабилизированы новые варианты диапазонов: core::range::Range, RangeFrom, RangeInclusive и связанные с ними итераторы. В отличие от старых типов из core::ops, новые диапазоны не реализуют Iterator напрямую, а преобразуются в итератор через IntoIterator. Благодаря этому такие диапазоны могут быть Copy, что удобно, например, при хранении диапазона как поля структуры. Синтаксис вроде 0..1 пока создаёт старые типы диапазонов, но в будущей редакции языка его планируют перевести на новые типы.

  • Добавлены assert_matches! и debug_assert_matches!. Новые макросы позволяют проверять, что значение соответствует заданному шаблону. По смыслу это похоже на assert!(matches!(...)), но при ошибке выводится Debug-представление значения, что упрощает диагностику. В prelude макросы не добавили, чтобы не конфликтовать с популярными сторонними crate’ами, поэтому их нужно импортировать явно из core или std.

  • Изменено поведение WebAssembly-целей. Rust больше не передаёт линкеру --allow-undefined для WebAssembly-сборок. Теперь неопределённые символы при линковке считаются ошибкой, а не превращаются автоматически в импорты из модуля "env". Это должно раньше выявлять ошибки сборки и неправильные имена символов. Старое поведение при необходимости можно вернуть через RUSTFLAGS=-Clink-arg=--allow-undefined или явно указать импортируемый wasm-модуль через #[link(wasm_import_module = "env")].

  • Cargo получил исправления безопасности. В Rust 1.96.0 закрыты две уязвимости, затрагивающие пользователей сторонних registry. CVE-2026-5223 связана с обработкой symlink внутри tar-архивов crate: вредоносный пакет из стороннего registry мог перезаписать кэш другого пакета из того же registry. Начиная с Rust 1.96.0 Cargo отвергает crate-архивы с symlink. CVE-2026-5222 связана с нормализацией URL sparse registry и в редких условиях могла привести к отправке Cargo-токена на вредоносный registry. Пользователи crates.io, по заявлению команды Rust, этими проблемами не затронуты.

  • Изменения в языке. В релиз вошли несколько точечных исправлений и расширений: разрешена передача expr-метапеременных макросов в cfg, скорректировано приведение never-type в выражениях-кортежах, исправлены редкие случаи неверных подсказок вывода типов для аргументов функций, добавлена поддержка векторных регистров s390x в inline assembly, а также снова разрешено использовать константы типа ManuallyDrop как шаблоны — это исправляет регрессию, появившуюся в Rust 1.94.0.

  • Изменения в компиляторе и платформах. Для Linux-целей на LoongArch включена поддержка link relaxation — оптимизации линковки, позволяющей упростить некоторые переходы и обращения после размещения кода. Для riscv64gc-unknown-fuchsia обновлена базовая конфигурация до профиля RVA22 с поддержкой векторных расширений.

  • Обновления стандартной библиотеки. Добавлена поддержка итерации по диапазонам NonZero-целых чисел. Также исправлена отложенная обработка адресов хоста в SGX через ToSocketAddr, а в документации и внутренних контрактах уточнено определение памяти, «допустимой для чтения/записи»: нулевой указатель исключён из общего определения, а исключения указываются отдельно для конкретных методов.

  • Стабилизированные API. Среди стабилизированных интерфейсов — assert_matches!, debug_assert_matches!, реализации From<T> для AssertUnwindSafe<T>, LazyCell<T, F> и LazyLock<T, F>, а также новые типы и итераторы диапазонов из core::range, включая Range, RangeFrom, RangeToInclusive и их итераторы.

  • Cargo: изменения для зависимостей и документации. Теперь зависимость может одновременно указывать Git-репозиторий и альтернативный registry: локально будет использоваться Git-версия, а при публикации — версия из registry, аналогично поведению с crates.io. Также добавлена поддержка target.'cfg(..)'.rustdocflags в конфигурации Cargo.

  • Rustdoc стал аккуратнее обрабатывать документацию. Заметки о deprecated API теперь рендерятся как обычная документация, без прежней специальной обработки через white-space: pre-wrap. Кроме того, rustdoc больше не выдаёт lint missing_doc_code_examples для элементов внутри impl, а в боковой панели документации методы и ассоциированные функции разделяются отдельно.

  • Возможные несовместимости. В релизе есть несколько изменений, которые могут проявиться на нетипичном коде: исправлена раскладка некоторых #[repr(Int)] enum в крайних случаях, запрещены некоторые бесполезные unsize-приведения в Pin<Foo>, WebAssembly-сборки теперь падают при неопределённых символах, случайно стабилизированный атрибут #![reexport_test_harness_main] снова закрыт feature gate’ом, удалён параметр -Csoft-float, а минимальная версия внешнего LLVM повышена до 21. Для AVR изменён тип c_double на f32, поскольку на этих целях C double по умолчанию является 32-битным.

>>> Источник

★★★★★

Проверено: cetjs2 ()
Ответ на: комментарий от Lusine

Пока он один. А когда ещё пара тройка студентов, то Раст поможет расслабиться и сфокусироваться на логике, и не искать банальные глупые ошибки: передал не туда указатель, записал что-то после free, забыл про free, забыл про mutex и т.п. Раст уже останавливает студента от лютейшего говнокодинга. За счёт mut, send, sync и др. позволяет больше выражать требований в сигнатуре/коде. Студенты читать комментарии и документацию не умеют.

galanthus
()
Ответ на: комментарий от LightDiver

Язык сертифицированный для критических аппликух не должен отключать проверки на переполнение. Это как пистолет, где нельзя отключить предохранитель.

Lusine
()
Ответ на: комментарий от Lusine

Слушай, мне вот даже интересно стало - а для чего нужен пистолет, где нельзя отключить предохранитель? Гвозди забивать?

LightDiver ★★★★★
()
Ответ на: комментарий от galanthus

Он не один, он на производстве. И студентов с растом туда не возьмут, там серьезные люди делают серьезные вещи, а не изучают новомодные языки и тащат их в прод.

Lusine
()
Ответ на: комментарий от Lusine

Ладно, возьмем тахограф и глонасс на самосвале, их отключить нельзя не вмешиваясь блок управления. Так и в коде - отключил проверку, выпускай специальный документ зачем и как ты это сделал. И хрен тебе его согласуют.

Lusine
()
Ответ на: комментарий от Lusine

Ну.. это да, я тоже знаю как управлять госудраством правильно.

Но представь, существуют на уровне железа вещи, которые алгоритмически недоказуемы. Невозможно из правильно обернуть и сделать проверки. Если ты просто запретишь работу с такими структурами, твой язык станет бесполезен. Он не будет работать на этом железе.

Это необходимый баланс между безопасностью и работоспособностью.

LightDiver ★★★★★
()
Ответ на: комментарий от yvv1

пригодности языка Rust для разработки прошивок

Дал бы уж ссылку на статью

Ковыряю сейчас stm-ку и решил изучить embassy. Очень прикольной вещью оказалась - асинхронность и многозадачность из коробки и без всяких OS. Впрочем OS на embassy - Ariel OS, что в статье упоминается, на моё железо не лезет уж очень она большая для него.

WatchCat ★★★★★
()
Последнее исправление: WatchCat (всего исправлений: 1)
Ответ на: комментарий от LightDiver

А что это за железо, в котором транзисторы могут переключаться недетерминировано? Это неисправное железо.

Lusine
()
Ответ на: комментарий от Lusine
fn mystery(x: &[i32], n: usize) {
    // Вычисляем n-е число Фибоначчи... или не вычисляем?
    let idx = if terminates(&n) {  // кто напишет terminates()?
        fib(n) % x.len()
    } else {
        0 // бесконечный цикл?
    };
    
    let a = &mut x[..idx];
    let b = &mut x[idx..];  // пересекутся? узнаем после останова вселенной
}

Предположим, мы написали функцию terminates, которая всегда правильно отвечает, завершится ли программа:

fn terminates(program: &str, input: &str) -> bool { ... }

Теперь напишем новую программу paradox, которая использует terminates и делает наоборот:

fn paradox(program: &str) {
    if terminates(program, program) {
        // Если программа завершится зцикливаемся намеренно
        loop {} 
    } else {
        // Если не завершится завершаемся
        return; 
    }
}

Что будет, если запустить paradox(«paradox»)?

LightDiver ★★★★★
()
Ответ на: комментарий от Lusine

Все верно, есть три уровня ограничений:

Алгоритмический уровень (чистая математика)

Уровень архитектуры фон Неймана (жфелезо)

Уровень внешнего мира (ОС + устройства)

Память это едный плоский массив байтов

Адрес:    0x00    0x01   0x02  0x03    0x04   0x05
Данные:  [ 23 ] [ 127 ] [ 0 ] [ 255 ] [ 42 ] [ 13 ]
                                 
    &число_а                &число_b (через три байта)

С точки зрения процессора, вот этот байт по адресу 0x00 он кто?

Число? Начало строки? Код операции? Часть указателя? Вообще мусор?

Железо не рзличает типы. Для процессора нет разницы мжеду i32 и &T. Это просто биты. Поэтому на уровне железа возможны операции, бессмысленные с точки зрения типов:

// unsafe позволяет переинтерпретировать биты
let x: f32 = 3.14;
let raw: u32 = unsafe { std::mem::transmute(x) };
// Железу всё равно, что это было float - теперь это целое

Защита раст запрещает трансмут для произвольных типов, потому что типовая система существует только в компиляторе, а не в кремнии.

Даже в ассемблерах уже нет типов - это абстракция.

И вот, третий уровень - ось, устройства:

Программа не одна во вселенной. Собственно это и не программа вовсе - это простонародное. На деле они - подпрограммы.

Пример ДМА: Ты говоришь сетевухе: «пиши пакеты в этот буфер». Процессор продолжает работать. Сетевая карта в любой момент пишет в твою память, обходя процессор и любые проверки раст.

// Защита думает, что &buf никто не трогает это ж его фундаментальная аксиома!
let buf: &mut [u8] = ...;

А в это время железо сетевой карты через ДМА: пишет данные прямо в buf, обходя процессор

Без unsafe ты даже не сможешь корректно работать с таким буфером

Ну и вот зачем тебе такой язык? Ну убрал ты отключение защит. Чтобы что? Что дальше?

И ты учти - это то, как вижу я. Я сам не программист и могу ошибаться или недопонимать. Лучше спросить профессионалов - они объяснят точнее.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от Lusine

Слушай, поищи курсы по си. По чистому си. На степике или ютубчике. Там тебе подробнее объяснят современную архитектуру компов (она не менялась уже ооочень давно), почему она такая, ее особенности. Почему вообще возник си. Что такое память и остальное. Не будем флудить тут.

После понимания что такое железо, можно переходить к расту уже.

Да что я несу. Никогда она не менялась кажись. Как в 40х предложена была, так и осталась. Чисто физически на уровне железа пытаются делать надстройки разные, слои, но все это железо продолжает притворяться все той же машиной фон Неймана. Для языка разницы нету.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от LightDiver

Лучше спросить профессионалов

Твои профессионалы типа @hibou такую хрень понапишут, что у серьезных людей уши завянут. Типа с указателем нельзя отпределить другие отношения кроме равно.

Lusine
()
Ответ на: комментарий от Lusine

«Специалист подобен флюсу, полнота его одностороння»

Они и есть те самые «серьезные люди» - занятые в своей области плотно и не отвлекающиеся по сторонам. Зато в своей узкой области они прекрасны. Могут быть полными идиотами во всех остальных.

А вот я дилетант широкого профиля. Я хреново могу сразу все. Но именно что без глубокого понимания каждой области.

И работодателям нужен именно узкий специалист. Ты никогда не замечал, что когда углубляешься в область в какой то момент как будто что то перещелкивает в мозгах и ты начинаешь внезапно понимать то, что раньше от тебя ускользало? Причем совсем с другой точки зрения. Ты начинаешь видеть область совсем иначе.

Вот я работаю с новичками иногда. И доходит до просьбы объяснить им что то. И тут ты понимаешь всю пропасть между вами. Чтобы объяснить, он должен пройти определенный путь в месяца опыта. Потому что иначе и он не поймет и твое объяснение затянется на часы и дни. И проще сказать: «Так нельзя». Конечно же так было можно. Но иначе и с нюансами.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 4)
Ответ на: комментарий от LightDiver

Да что я несу. Никогда она не менялась кажись. Как в 40х предложена была, так и осталась

Про NUMA, гарвардскую архитектуру, транспьютеры, CRAY и тд. в школе уже не рассказывают?

Lusine
()
Ответ на: комментарий от Lusine

NUMA, гарвардскую архитектуру, транспьютеры, CRAY

В школе нам вообще ничего не рассказывали. У нас не было учителя информатики большее время. Это были 90е.

Но все вот что ты описал - для раста выглядит, как старая добрая машина фон Неймана. Какая ему то разница, а? Ну почти всегда, в 99.9% случаев.

Аппаратные отличия (NUMA, гарвард) либо эмулируются, либо требуют осознанного погружения в unsafe с платформенно-специфичными знаниями. Именно поэтому unsafe это точка, где модель абстракции зканчивается и начинается реальность конкретного железа.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от LightDiver

Они и есть те самые «серьезные люди» - занятые в своей области плотно и не отвлекающиеся по сторонам.

Знаем таких. Херачат код на С не приходя в сознание. 15 лет на железе не вынимая. Эти не будут ковыряя в носу глубокомысленно обсуждать «указатель в С сущность, а не адрес, мальчик, стандарты иди почитай».

Lusine
()
Ответ на: комментарий от Lusine

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

LightDiver ★★★★★
()
Ответ на: комментарий от Lusine

так и есть. нейроредактор edit переписанный микрослопом на руст даже файлы сохранять не хотел нормально пока не внесли нейропатчи. поддерживать код на русте еще сложнее, чем на сях. причем си любой понимает, а руст кажется специально сделали, чтоб он был илитненьким.

bernd ★★★★★
()
Ответ на: комментарий от drfaust

Если я вписал «-std=c99», то буду уверен, что оно скомпилится и в 2010м году и в 2030м. А тут?

А тут сраная Карга. Растоманы считаю, что Cargo.toml и Cargo.lock это ответы на все вопросы.

Camel ★★★★★
()
Ответ на: комментарий от Lusine

Про NUMA, гарвардскую архитектуру, транспьютеры, CRAY и тд. в школе уже не рассказывают?

А разве когда-то рассказывали??..

Somebody ★★★★
()
Ответ на: комментарий от LightDiver

И зачем нужны снятия безопасности и прочее прочее

Снятие безопасности всегда плохо кончается, вот всегда. Умные люди говорят, что ТБ и устав написаны кровью жертв.

Lusine
()
Ответ на: комментарий от Lusine

То есть ты предлагаешь не работать на современном железе - создать свое. Не работать с существующими ОС, софтом - писать только свой. Придумать свою математику без парадоксов.

Это тоже выход. Как сделаешь, ты скинь линк, я заценю.

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

Подумай почему в уставе караульной службы категорически запрещено на посту отправлять естественные надобности?

Lusine
()
Ответ на: комментарий от Lusine

Любые аналогии ложны. (на самом деле нет)

Просто разреши примеры выше - как бы ты решил и все. Математика, железо, софт. Я могу решить те проблемы, да. Но это будут костыли. Да и то только частчно. Полностью обойти нельзя.

Ты что предлагаешь? Не пользоваться языком? Не пользоваться железом? Не пользоваться софтом? Или придумать свою математику?

Если говорить твоей аналогией, ты предлагаешь не использовать военныеы части, где солдаты умеют срать. Не использовтаь солдат, которые умеют срать.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от Lusine

Для снижения рисков. Не для полного их исчезновения, а для баланса.

Ты всегда можешь придумать более строгие правила и проверки, которые физически не позвлят нарушить. Знаешь что тогда будет? Работа ВЧ станет невозможна.

LightDiver ★★★★★
()
Ответ на: комментарий от Lusine

Про CRAY точно рассказывали в теме про суперкомьютеры.

Ну, в моё время точно не рассказывали ни о чём. ;))

У младшего сына на информатике - тоже, по-моему, не...

Somebody ★★★★
()
Ответ на: комментарий от LightDiver

Каких рисков? Ну пописал на посту, что такого страшного, что для этого целый пункт в устав нужно вводить и каждый раз его повторять при инструктаже? Говорю же, ты мал и глуп, и многих вещей даже не можешь себе представить.

Lusine
()
Ответ на: комментарий от Lusine

А это уже решают те, кто составляют правила безопасности. Вот у них и спрашивай каких рисков.

Как только кончились аргументы, ты перешел на личности. Я понял. Беседа завершена.

LightDiver ★★★★★
()
Ответ на: комментарий от Lusine

Ну пописал на посту, что такого страшного

Ничего страшного. В лучшем случае, мог «огрести» от своих физически. Что полезно, а не «страшно»... :))

В более худшем, мог стать «200» и, как следствие, и те, кого он на этом посту охранял - тоже... А так - а, ничего страшного...

что для этого целый пункт в устав нужно вводить и каждый раз его повторять при инструктаже?

Там всё давным давно уже есть. И да, каждый раз повторять.

Говорю же, ты мал и глуп, и многих вещей даже не можешь себе представить.

Самокритика?.. ;))

Somebody ★★★★
()
Ответ на: комментарий от LightDiver

А если ты дозрел до уровня написания модуля, то такие тупые вопросы уже не задаешь.

Lusine
()
Ответ на: комментарий от Lusine

Повезло с учителем. В мои школьные годы ещё не существовало информатики :))

А младший сын сам с детства учился, по имевшимся у меня книгам, и знал как бы не больше школьных учителей...

Somebody ★★★★
()
Ответ на: комментарий от Somebody

Под вышкой, с которой он писал, была колючка с 1700в и про это иногда забывали. Я же говорю, каждый пункт в написан кровью.

Lusine
()
Ответ на: комментарий от Somebody

У нас были даже пни третьи с вин95 «подаренные» школе губернатором чтоли. Изредка бывал учитель. Мы даже кое что рисовали в пэинте. На этом почти все.

Проблема была как в доступе к информации - ее негде было взять, так и в доступе к тому, кто хоть как то объяснил бы базовое. Вот всего два этих фактора если есть, уже можно работать.

Заметь - сейчас у новичков абсолютно имбовый чит есть, объединяющий оба эти фактора в одном - ИИшка. Которая и найдет инфу и подскажет.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от Somebody

Это командиры рассказывали. Решит такой @LightDiver на посту покурить, тоже отдельная строчка в уставе, а по молодости и глупости забудет, что он ГСМ охраняет.

Lusine
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.