#prog #rust #rustreleasenotes
(в силу непонятных причин я почему-то полностью пропустил этот релиз, который был аж 28 мая)
Вышла версия Rust 1.96.0! Как всегда, тут только избранные части, а всё целиком в детальных заметках о релизе.
▪️До стабильной версии дошли
▪️Стабилизировали макросы
Пример сообщения об ошибке:
⬇️
Как и другие
Как вы могли заметить, в коде есть явные импорты этого макроса. К сожалению, в прелюдию их не добавили, поскольку уже есть широко используемый сторонний крейт с этими макросами, и такое добавление создало бы конфликты имён в большом количестве кода.
▪️Теперь можно итерироваться по диапазонам из беззнаковых `NonZero` чисел.
▪️Определение "valid to read/write" для сырых указателей теперь явно исключает null. Некоторые функции, тем не менее, всё ещё позволяют пользоваться null-указателями для доступов нулевого размера, но теперь это исключения из общего правила.
(согласно CAD97 — члену команды операционной семантики — такое поведение было и раньше, просто теперь оно задокументировано)
▪️Манифесты для cargo теперь поддерживают назначение флагов для rustdoc в зависимости от cfg-предикатов.
▪️rustdoc теперь не вырезает <p>-теги из сообщений о устаревании (deprecation).
▪️rustdoc теперь разделяет функции на типе в боковой панели на ассоциированные функции (которые нельзя вызвать через точку) и методы. Полезно, но терминология, на мой взгляд, неудачная: методы тоже являются ассоциированными функциями.
▪️
▪️Приватные типы в RPITIT ("return position impl trait impl trait") теперь являются ошибкой компиляции.
(в силу непонятных причин я почему-то полностью пропустил этот релиз, который был аж 28 мая)
Вышла версия Rust 1.96.0! Как всегда, тут только избранные части, а всё целиком в детальных заметках о релизе.
▪️До стабильной версии дошли
Range, RangeFrom и RangeInclusive из core::range. В отличие от существующих типов диапазонов, эти типы реализуют IntoIterator, но не Iterator. Это позволяет им быть Copy и иметь публичные поля без подводных камней, присущих неявно копируемым итераторам. Как вы могли заметить, в этот список не входят RangeTo и RangeFull, но они и так не могли быть итераторами и потому реализовывали Copy. В следующей edition планируют переключить синтаксис диапазонов на создание этих новых типов. До этого переключение между типами облегчено за счёт реализаций From между новыми и старыми типами.▪️Стабилизировали макросы
assert_matches! и debug_assert_matches!, которые проверяют не на равенство, а на соответствие паттерну (и потому могут дать более внятное сообщение об ошибке, чем assert_eq!. Пример из блога:use core::assert_matches;
/// [Random Number](https://xkcd.com/221/)
fn get_random_number() -> u32 {
// chosen by a fair dice roll.
// guaranteed to be random.
4
}
fn main() {
assert_matches!(get_random_number(), 1..=6);
}
Пример сообщения об ошибке:
use core::assert_matches;
fn main() {
let x = ('a', None::<i32>);
assert_matches!(x, ('a' | 'b' | 'c', Some(42)));
}
⬇️
thread 'main' (31) panicked at src/main.rs:5:5:
assertion `left matches right` failed
left: ('a', None)
right: ('a' | 'b' | 'c', Some(42))
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Как и другие
assert*-макросы, туда можно добавить аргументы для дополнительного форматирования при панике.Как вы могли заметить, в коде есть явные импорты этого макроса. К сожалению, в прелюдию их не добавили, поскольку уже есть широко используемый сторонний крейт с этими макросами, и такое добавление создало бы конфликты имён в большом количестве кода.
▪️Теперь можно итерироваться по диапазонам из беззнаковых `NonZero` чисел.
▪️Определение "valid to read/write" для сырых указателей теперь явно исключает null. Некоторые функции, тем не менее, всё ещё позволяют пользоваться null-указателями для доступов нулевого размера, но теперь это исключения из общего правила.
(согласно CAD97 — члену команды операционной семантики — такое поведение было и раньше, просто теперь оно задокументировано)
▪️Манифесты для cargo теперь поддерживают назначение флагов для rustdoc в зависимости от cfg-предикатов.
▪️rustdoc теперь не вырезает <p>-теги из сообщений о устаревании (deprecation).
▪️rustdoc теперь разделяет функции на типе в боковой панели на ассоциированные функции (которые нельзя вызвать через точку) и методы. Полезно, но терминология, на мой взгляд, неудачная: методы тоже являются ассоциированными функциями.
▪️
repr(Int) меняет представление enum-ов, делая явный дискриминант всегда существующим... По крайне мере, в теории. Оказалось, что ранее для ненаселённого типа включались оптимизации раскладки, которые меняли размер таких типов в ноль, вопреки тому, что обещала документация. Теперь это пофиксили.▪️Приватные типы в RPITIT ("return position impl trait impl trait") теперь являются ошибкой компиляции.
blog.rust-lang.org
Announcing Rust 1.96.0 | Rust Blog
Empowering everyone to build reliable and efficient software.
❤5👍2
Блог*
#prog #article Building the Rust compiler with GCC О том, как (частично) забустрапить rustc через rustc_codegen_gcc и почему это далеко не простая задача. (от того же человека, который пилит кодген rustc под .NET)
#prog #rust... #c? #amazingopensource точно
FractalFir — который пилит кодген Rust под .NET — выложил crustc: компилятор Rust, транспилированный в 46 миллионов строк кода на C.
Обсуждение на r/rust
Обсуждение на hacker news
FractalFir — который пилит кодген Rust под .NET — выложил crustc: компилятор Rust, транспилированный в 46 миллионов строк кода на C.
Обсуждение на r/rust
Обсуждение на hacker news
❤7
#prog #rust #article
It's not me, it's the compiler!
TL;DR: чел писал парсер и обнаружил, что rustc неправильно компилирует код, в котором есть прямой каст из bool в u32 (а если семантически эквивалентный if, то нормально). Баг подтвердили, причиной была некорректная оптимизация на уровне MIR.
It's not me, it's the compiler!
TL;DR: чел писал парсер и обнаружил, что rustc неправильно компилирует код, в котором есть прямой каст из bool в u32 (а если семантически эквивалентный if, то нормально). Баг подтвердили, причиной была некорректная оптимизация на уровне MIR.
❤19😱2
#prog #rust
В новой версии Rust 1.97 (надо, кстати, написать про релиз) обнаружилась мискомпиляция, которая приводит к сегфолту (regression-from-stable-to-stable 😱). Судя по всему, проблема с кривой кодогенерацией была с версии 1.87. Корень проблемы, однако, кроется в баге в LLVM, где некорректная трансформация превращает нормальный код в код с безусловным UB. Ошибка произошла из-за неправильной обработки poison. Никита Попов уже открыл PR с фиксом.
Почему сегфолт появился только сейчас, если баг существовал так долго? Дело в том, что в случаях, когда баг проявляется, в машинном коде использовался mov из памяти по указателю с составным индексным выражением, и в этом выражении использовался тег enum-а (считай, дискриминант, но на уровне представления). Недавно в rustc завезли изменение, из-за которого компилятор стал предпочитать для None тег -1. Раньше выбирался ближайший из ниши. При использовании в машинном коде отрицательное число реинтепретировалось, как большое положительное, что приводило к out of bounds чтению и, ожидаемо, сегфолту. Из-за упомянутого бага LLVM чтение вне границ было и раньше, но из-за того, что используемый тег для вычисления адреса был близок к набору валидных значений, к проблемам на практике оно не приводило: доступ было в пределах страницы памяти.
В новой версии Rust 1.97 (надо, кстати, написать про релиз) обнаружилась мискомпиляция, которая приводит к сегфолту (regression-from-stable-to-stable 😱). Судя по всему, проблема с кривой кодогенерацией была с версии 1.87. Корень проблемы, однако, кроется в баге в LLVM, где некорректная трансформация превращает нормальный код в код с безусловным UB. Ошибка произошла из-за неправильной обработки poison. Никита Попов уже открыл PR с фиксом.
Почему сегфолт появился только сейчас, если баг существовал так долго? Дело в том, что в случаях, когда баг проявляется, в машинном коде использовался mov из памяти по указателю с составным индексным выражением, и в этом выражении использовался тег enum-а (считай, дискриминант, но на уровне представления). Недавно в rustc завезли изменение, из-за которого компилятор стал предпочитать для None тег -1. Раньше выбирался ближайший из ниши. При использовании в машинном коде отрицательное число реинтепретировалось, как большое положительное, что приводило к out of bounds чтению и, ожидаемо, сегфолту. Из-за упомянутого бага LLVM чтение вне границ было и раньше, но из-за того, что используемый тег для вычисления адреса был близок к набору валидных значений, к проблемам на практике оно не приводило: доступ было в пределах страницы памяти.
👍11🫡3👎2🤮2😢1💩1
Блог*
(надо, кстати, написать про релиз)
#prog #rust #rustreleasenotes
Вышла версия Rust 1.97.0! Как всегда, тут только части, а остальное там.
▪️Для манглинга символов теперь используется собственная версия манглинга v0. Изначально rustc использовал схему манглинга, описанную в Itanium ABI, но со временем эта схема была закостылена для поддержки Rust-специфичных фич и потому всё равно требовала специальной поддержки со стороны отладчиков.
Новая схема обладает рядом преимуществ. Среди них — в отличие от старой схемы, не теряется информация об обобщённых аргументах, и в символ не протекает хэш из компилятора, который за пределами самого компилятора не имеет смысла.
▪️cargo теперь может контролировать влияние предупреждений на компиляцию, в частности, останавливать компиляцию при их наличии. До этого соответствующую настройку нужно было прокидывать непосредственно до rustc.
▪️Стабилизировали несколько методов на примитивных числовых типах для битосовокупления: highest_one, isolate_highest_one, lowest_one, isolate_lowest_one и bit_width (этот только на беззнаковых). Эти же методы доступны и на
▪️Компилятор теперь предупреждает, когда тип выводится, как f32, если о нём известно только то, что он реализует From<{float}>. Сейчас тип выводится однозначно, но после добавления примитивного типа
▪️На Windows попытка обратиться к сокету после вызова shutdown теперь возвращает ошибку с io::ErrorKind::BrokenPipe.
Вышла версия Rust 1.97.0! Как всегда, тут только части, а остальное там.
▪️Для манглинга символов теперь используется собственная версия манглинга v0. Изначально rustc использовал схему манглинга, описанную в Itanium ABI, но со временем эта схема была закостылена для поддержки Rust-специфичных фич и потому всё равно требовала специальной поддержки со стороны отладчиков.
Новая схема обладает рядом преимуществ. Среди них — в отличие от старой схемы, не теряется информация об обобщённых аргументах, и в символ не протекает хэш из компилятора, который за пределами самого компилятора не имеет смысла.
▪️cargo теперь может контролировать влияние предупреждений на компиляцию, в частности, останавливать компиляцию при их наличии. До этого соответствующую настройку нужно было прокидывать непосредственно до rustc.
▪️Result<T, Uninhabited> и ControlFlow<Uninhabited, T> теперь триггерят линт must_use, если им помечен сам T.▪️Добавили новый линт, который предупреждает о неиспользуемых pub-определениях в бинарных крейтах (к сожалению, allow by default)▪️Добавили (точнее, стабилизировали) cfg(target_has_atomic_equal_alignment = N), который позволяет удостовериться, что примитивный численный тип указанной ширины и соответствующий Atomic*-тип имеют одинаковое выравнивание. Да, это не всегда так, особенно на 32-битных платформах.▪️Стабилизировали несколько методов на примитивных числовых типах для битосовокупления: highest_one, isolate_highest_one, lowest_one, isolate_lowest_one и bit_width (этот только на беззнаковых). Эти же методы доступны и на
NonZero.▪️Компилятор теперь предупреждает, когда тип выводится, как f32, если о нём известно только то, что он реализует From<{float}>. Сейчас тип выводится однозначно, но после добавления примитивного типа
f16 (да, на это есть планы) он уже перестанет таким быть.▪️На Windows попытка обратиться к сокету после вызова shutdown теперь возвращает ошибку с io::ErrorKind::BrokenPipe.
❤5
#rust
crates.io: development update
Из заметного: на crates.io теперь можно смотреть исходники, в том виде, в котором их скачивает cargo!
crates.io: development update
Из заметного: на crates.io теперь можно смотреть исходники, в том виде, в котором их скачивает cargo!
blog.rust-lang.org
crates.io: development update | Rust Blog
Empowering everyone to build reliable and efficient software.
🔥12👍1