🦀 Rust совет
На прошлой неделе мы показывали, как встраивать статические данные в код с помощью
Сегодня - маленький, но очень полезный трюк.
⚙️ Запуск Cargo с конкретной версией toolchain
Иногда нужно проверить, будет ли ваш проект работать на следующей версии Rust (которая скоро станет stable).
Для этого не нужно менять глобальную версию Rust.
Достаточно просто указать toolchain прямо в команде:
Можно использовать и другие версии:
💡 Это удобно для:
• тестирования совместимости с будущими релизами Rust
• проверки nightly-фич
• CI-пайплайнов
• отлова будущих breaking changes
Маленький трюк, но экономит часы дебага.
#rust #rustlang
На прошлой неделе мы показывали, как встраивать статические данные в код с помощью
include_str!.Сегодня - маленький, но очень полезный трюк.
⚙️ Запуск Cargo с конкретной версией toolchain
Иногда нужно проверить, будет ли ваш проект работать на следующей версии Rust (которая скоро станет stable).
Для этого не нужно менять глобальную версию Rust.
Достаточно просто указать toolchain прямо в команде:
cargo +beta test
Можно использовать и другие версии:
cargo +nightly build
cargo +stable check
💡 Это удобно для:
• тестирования совместимости с будущими релизами Rust
• проверки nightly-фич
• CI-пайплайнов
• отлова будущих breaking changes
Маленький трюк, но экономит часы дебага.
#rust #rustlang
🤗16❤10🥰3🍓1👀1
🦀 Google затащили Rust туда, где его реально ждали - прямо в cellular baseband у Pixel 10.
Не в приложение, не в системный сервис и даже не в очередную утилиту, а в прошивку модема. Это уже совсем другой уровень.
Первым шагом заменили DNS-парсер, который раньше был написан на C и регулярно оставался источником memory-safety проблем. Теперь там Rust на базе hickory-proto: bare-metal, no_std, FFI к существующим C-аллокаторам - все по-взрослому.
И самое важное тут даже не сам DNS-парсер. Главное, что Google уже протащили Rust в build system baseband. А значит, это не разовая демонстрация, а начало нормальной поэтапной миграции.
Вот так и выглядит реальное внедрение Rust в критическую инфраструктуру: без громких лозунгов, но с максимальной пользой. Сначала один опасный компонент, потом еще один, а дальше язык постепенно заходит в самые уязвимые части системы.
Rust все чаще идет не в новые игрушечные проекты, а в старые и сложные куски железа, где цена ошибки слишком высокая.
security.googleblog.com/2026/04/bringing-rust-to-pixel-baseband.html
#Rust #RustLang #MemorySafety #EmbeddedSystems #Android
Не в приложение, не в системный сервис и даже не в очередную утилиту, а в прошивку модема. Это уже совсем другой уровень.
Первым шагом заменили DNS-парсер, который раньше был написан на C и регулярно оставался источником memory-safety проблем. Теперь там Rust на базе hickory-proto: bare-metal, no_std, FFI к существующим C-аллокаторам - все по-взрослому.
И самое важное тут даже не сам DNS-парсер. Главное, что Google уже протащили Rust в build system baseband. А значит, это не разовая демонстрация, а начало нормальной поэтапной миграции.
Вот так и выглядит реальное внедрение Rust в критическую инфраструктуру: без громких лозунгов, но с максимальной пользой. Сначала один опасный компонент, потом еще один, а дальше язык постепенно заходит в самые уязвимые части системы.
Rust все чаще идет не в новые игрушечные проекты, а в старые и сложные куски железа, где цена ошибки слишком высокая.
security.googleblog.com/2026/04/bringing-rust-to-pixel-baseband.html
#Rust #RustLang #MemorySafety #EmbeddedSystems #Android
🔥56❤19👍14💊3🥰2👏2🥱2😍1💯1
MaybeUninit для ручной сборки структур без лишнего drop
Когда значение собирается по частям в unsafe-коде, FFI, парсере или аллокаторе, главная проблема не в самой инициализации. Главная проблема - что делать, если ошибка произошла посередине.
Например, одно поле структуры уже создано, а второе еще нет. В этот момент нельзя дропать всю структуру целиком: для Rust она еще не является полностью готовым объектом.
Правильный подход - явно помнить, какие поля уже инициализированы, и очищать только их. Для этого используют MaybeUninit, ptr::write, drop_in_place и, когда значение уже полностью готово, assume_init_drop.
MaybeUninit нужен не “чтобы обмануть Rust”, а чтобы аккуратно управлять жизненным циклом там, где компилятор уже не может сделать это за тебя.
Для таких случаев есть MaybeUninit:
use std::mem::MaybeUninit;
struct Buffer {
data: Vec<u8>,
meta: String,
}
let mut value = MaybeUninit::<Buffer>::uninit();
unsafe {
let ptr = value.as_mut_ptr();
std::ptr::addr_of_mut!((*ptr).data).write(vec![1, 2, 3]);
// Если дальше случилась ошибка,
// дропаем только уже инициализированное поле
std::ptr::addr_of_mut!((*ptr).data).drop_in_place();
// А всю Buffer не трогаем:
// meta еще не была создана
}
Более удобный вариант для полностью инициализированного MaybeUninit<T>:
let mut value = MaybeUninit::new(String::from("hello"));
unsafe {
value.assume_init_drop();
}
MaybeUninit<T> используют не просто для создания значения “без инициализации”. Он нужен, когда ты сам управляешь моментом, в который память становится настоящим T, и сам отвечаешь за корректный drop.
Если структура собирается по частям, компилятор уже не всегда может понять, какие поля реально созданы. Поэтому unsafe-логику лучше держать внутри маленькой функции или типа, а наружу отдавать обычный safe API. Так риск ошибок остается локальным и проверяемым.
#rust #rustlang #programming #unsafeRust
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10🔥4🥰3🥴2👍1🤗1