#prog #rust #article
Can Rust prevent logic errors?
TL;DR: да, потому что в Rust есть для этого средства, которые отсутствуют в подавляющем большинстве мейнстримных ЯП. Автор, впрочем, сравнивает в основном с Ruby.
Предотвращаемые ошибки показаны с примерами на других ЯП.
Can Rust prevent logic errors?
TL;DR: да, потому что в Rust есть для этого средства, которые отсутствуют в подавляющем большинстве мейнстримных ЯП. Автор, впрочем, сравнивает в основном с Ruby.
Предотвращаемые ошибки показаны с примерами на других ЯП.
❤🔥3
#rust
Vitaly Reads: #3, August 2025
(thanks, разумеется, @bravit)
Vitaly Reads: #3, August 2025
I’ve just completed reading an amazingly well-written book called “Refactoring to Rust” by Lily Mara and Joel Holmes, published recently by Manning Publications. I’m pretty sure that the book was supposed to be called “Rewrite it to Rust,” but then someone realized that this is already a meme, so it’d be too much.
Yet, the goal is exactly that – to teach folks how to gradually introduce Rust components to their existing codebases written in C/C++, Java, Python, or JavaScript. Such a goal reflects the intended audience: developers in those languages with little or no knowledge of Rust. One interesting thing, though, is that even Rust professionals might find a lot of interesting details about Rust itself, especially if they are not experienced in such areas as FFI (Foreign Function Interface), Rust-Python interoperability, or WebAssembly – those are the key topics of the book.
(thanks, разумеется, @bravit)
🥰7👍4
#prog #rust #article
Fully Automated Releases for Rust Projects
Статья с очень конкретными инструкциями
Fully Automated Releases for Rust Projects
Статья с очень конкретными инструкциями
🔥4
#prog #rust #suckassstory
std::process::exit is not thread-safe in combination with C code calling exit
Древний дизайн из времён, когда многопоточности не существовало, вновь наносит удар! И да, проблемы те же, что и с
std::process::exit is not thread-safe in combination with C code calling exit
Древний дизайн из времён, когда многопоточности не существовало, вновь наносит удар! И да, проблемы те же, что и с
env::{set_var, remove_var}
.😁4
#prog #rust хайлайты:
Реализовали derive через macro_rules!-макросы. Учитывая, насколько часто код, генерируемый derive, весьма простой, это позволит сильно упростить их написание, а также избежать выделения отдельного крейта только под процедурный макрос и, разумеется, не компилировать макрос в отдельную программу, которая общается с компилятором по RPC.
Реализовали derive через macro_rules!-макросы. Учитывая, насколько часто код, генерируемый derive, весьма простой, это позволит сильно упростить их написание, а также избежать выделения отдельного крейта только под процедурный макрос и, разумеется, не компилировать макрос в отдельную программу, которая общается с компилятором по RPC.
GitHub
Implement declarative (`macro_rules!`) derive macros (RFC 3698) by joshtriplett · Pull Request #145208 · rust-lang/rust
This is a draft for review, and should not be merged yet.
This is layered atop #145153 , and has
only two additional commits atop that. The first handles parsing and provides a
test for various par...
This is layered atop #145153 , and has
only two additional commits atop that. The first handles parsing and provides a
test for various par...
❤5👍4🤯2🔥1
#prog #rust #itsec #article
hyper HTTP/2 (Didn't) MadeYouReset
Протокол HTTP/2 позволяет открыть несколько стримов поверх одного соединения, каждый из которых может быть отменён (reset) любой стороной в любой момент. В некоторых случаях это нужно сделать обязательно — например, когда одна из сторон присылает невалидные сообщения. Это сделало возможным уязвимость, названную MadeYouReset. Суть её в том, что злоумышленник инициирует соединение с максимально возможным числом стримов, а затем постоянно их сбрасывает путём отправки невалидных фреймов. Обработка всех этих запросов и следование протоколу отнимает ресурсы сервера, что делает возможным Denial of service.
Эта уязвимость очень схожа с уязвимостью Rapid Reset, но, как описано в статье от Cloudflare, она несколько более хитрая. Rapid Reset полагается на явную отмену стримов клиентом через посылку фрейма RST_STREAM. MadeYouReset же работает через посылку невалидных фреймов, заставляя сервер парсить запросы и отменять стримы уже с его стороны.
Многие реализации HTTP/2 на практике делали работу по обработке запроса даже после закрытия стрима. Простые меры предосторожности против Rapid Reset, отслеживающие только фреймы RST_STREAM от клиента, бесполезны против MadeYouReset.
h2 (Rust-библиотека для работы с протоколом HTTP/2) оказалась не подвержена этой уязвимости. Почему? На это есть несколько причин.
Во-первых, в h2 несколько лет назад добавили меру предосторожности против абьюза клиентами отмен стримов. Именно, h2 отслеживает, сколько раз фрейм от клиента привёл к отмене стрима со стороны клиента, и когда это число достигает настраиваемого порога, закрывает соединение целиком. Это уже хорошая защита, которая на практике успешно защищала от Rapid Reset, но она была не безупречна — для одного типа фреймов (WINDOW_UPDATE) на одном из путей исполнения это число не обновлялось (разумеется, это поправили).
Во-вторых, h2 — библиотека, а не фреймворк, и всегда передаёт вызывающему коду информацию об отмене стрима. Разумеется, от этого мало толку, если вызывающий код на это никак не реагирует.
И это подводит нас к третьей причине: контекст использования. На практике h2 использовалась совместно с hyper, Rust-библиотеке для HTTP, абстрагированной от конкретной версии протокола. В коде hyper для стримов ожидается исполнение двух футур: поставляющей новые фреймы из стрима и обрабатывающей запросы из этого стрима. При получении отмены стрима hyper отменяет футуру, обрабатывающую запрос.
Итого: даже без закрытия бага с WINDOW_UPDATE h2 не был подвержен MadeYouReset. Разумеется, это во многом заслуга продуманной архитектуры h2 и hyper. Но также это и заслуга того, как реализована асинхронность в Rust: с ключевым методом Future::poll, позволяющим достаточно просто дожидаться исполнения нескольких футур одновременно, и встроенная поддержка отмены футур просто через вызов drop. Добиться подобной защиты от MadeYouReset в языке с активными тасками и явной в коде отменой (как, например, в C# или в Go с context.Done) значительно сложнее.
hyper HTTP/2 (Didn't) MadeYouReset
Протокол HTTP/2 позволяет открыть несколько стримов поверх одного соединения, каждый из которых может быть отменён (reset) любой стороной в любой момент. В некоторых случаях это нужно сделать обязательно — например, когда одна из сторон присылает невалидные сообщения. Это сделало возможным уязвимость, названную MadeYouReset. Суть её в том, что злоумышленник инициирует соединение с максимально возможным числом стримов, а затем постоянно их сбрасывает путём отправки невалидных фреймов. Обработка всех этих запросов и следование протоколу отнимает ресурсы сервера, что делает возможным Denial of service.
Эта уязвимость очень схожа с уязвимостью Rapid Reset, но, как описано в статье от Cloudflare, она несколько более хитрая. Rapid Reset полагается на явную отмену стримов клиентом через посылку фрейма RST_STREAM. MadeYouReset же работает через посылку невалидных фреймов, заставляя сервер парсить запросы и отменять стримы уже с его стороны.
Многие реализации HTTP/2 на практике делали работу по обработке запроса даже после закрытия стрима. Простые меры предосторожности против Rapid Reset, отслеживающие только фреймы RST_STREAM от клиента, бесполезны против MadeYouReset.
h2 (Rust-библиотека для работы с протоколом HTTP/2) оказалась не подвержена этой уязвимости. Почему? На это есть несколько причин.
Во-первых, в h2 несколько лет назад добавили меру предосторожности против абьюза клиентами отмен стримов. Именно, h2 отслеживает, сколько раз фрейм от клиента привёл к отмене стрима со стороны клиента, и когда это число достигает настраиваемого порога, закрывает соединение целиком. Это уже хорошая защита, которая на практике успешно защищала от Rapid Reset, но она была не безупречна — для одного типа фреймов (WINDOW_UPDATE) на одном из путей исполнения это число не обновлялось (разумеется, это поправили).
Во-вторых, h2 — библиотека, а не фреймворк, и всегда передаёт вызывающему коду информацию об отмене стрима. Разумеется, от этого мало толку, если вызывающий код на это никак не реагирует.
И это подводит нас к третьей причине: контекст использования. На практике h2 использовалась совместно с hyper, Rust-библиотеке для HTTP, абстрагированной от конкретной версии протокола. В коде hyper для стримов ожидается исполнение двух футур: поставляющей новые фреймы из стрима и обрабатывающей запросы из этого стрима. При получении отмены стрима hyper отменяет футуру, обрабатывающую запрос.
Итого: даже без закрытия бага с WINDOW_UPDATE h2 не был подвержен MadeYouReset. Разумеется, это во многом заслуга продуманной архитектуры h2 и hyper. Но также это и заслуга того, как реализована асинхронность в Rust: с ключевым методом Future::poll, позволяющим достаточно просто дожидаться исполнения нескольких футур одновременно, и встроенная поддержка отмены футур просто через вызов drop. Добиться подобной защиты от MadeYouReset в языке с активными тасками и явной в коде отменой (как, например, в C# или в Go с context.Done) значительно сложнее.
seanmonstar
hyper HTTP/2 (Didn't) MadeYouReset
A new HTTP/2 attack vector was disclosed today called MadeYouReset. hyper’s h2 is negligably affected, weathering the attack well. But, we have provided patc...
❤11👍7🔥5
#prog #rust #article
Shortcomings of Procedural Macros
Или как в процедурный макрос, определённый на impl-блоке, прокинуть информацию о методах с реализацией по умолчанию из определения трейта.
Спойлер: всё в рамках языка, без IO между макросами, но выглядит всё равно как хак.
Shortcomings of Procedural Macros
Или как в процедурный макрос, определённый на impl-блоке, прокинуть информацию о методах с реализацией по умолчанию из определения трейта.
Спойлер: всё в рамках языка, без IO между макросами, но выглядит всё равно как хак.
cryptical.xyz
Shortcomings of Procedural Macros – Cryptical
and how to overcome them
🤔6❤1
#prog #rust
Faster linking times with 1.90.0 stable on Linux using the LLD linker
Faster linking times with 1.90.0 stable on Linux using the LLD linker
TL;DR: rustc will start using the LLD linker by default on the x86_64-unknown-linux-gnu
target starting with the next stable release (1.90.0, scheduled for 2025-09-18), which should significantly reduce linking times.
From our prior testing, we don't really expect issues to happen in practice. It is a drop-in replacement for the vast majority of cases, but lld is not bug-for-bug compatible with GNU ld.
In any case, using rust-lld can be disabled if any problem occurs: use the -C linker-features=-lld flag to revert to using the system's default linker.
❤🔥6🎉3🤩1
#prog #rust #serde #article
Be Careful Zero-Copying Strings with serde
TL;DR: из-за того, что строки во многих форматах передачи данных (JSON, например) требуют экранирования специальных символов, строки с подобными символами не могут быть десериализованы в
Be Careful Zero-Copying Strings with serde
TL;DR: из-за того, что строки во многих форматах передачи данных (JSON, например) требуют экранирования специальных символов, строки с подобными символами не могут быть десериализованы в
&str
(которые указывают на данные из входа). Для того, чтобы поддержать подобные строки, но по мере возможности все же не копировать данные, используйте Cow<str>
с атрибутом #[serde(borrow)]
на поле.💯8❤3👌2
#prog #rust
Rust compiler performance survey 2025 results
Помимо того, что вынесено в заголовок — немного о конкретных усилиях для уменьшения времени компиляции.
Rust compiler performance survey 2025 results
Помимо того, что вынесено в заголовок — немного о конкретных усилиях для уменьшения времени компиляции.
blog.rust-lang.org
Rust compiler performance survey 2025 results | Rust Blog
Empowering everyone to build reliable and efficient software.
👍1🤔1
#rust
crates.io phishing campaign
crates.io phishing campaign
We received multiple reports of a phishing campaign targeting crates.io users (from the rustfoundation.dev domain name), mentioning a compromise of our infrastructure and asking users to authenticate to limit damage to their crates.
These emails are malicious and come from a domain name not controlled by the Rust Foundation (nor the Rust Project), seemingly with the purpose of stealing your GitHub credentials.
<...>
Do not follow any links in these emails if you receive them, and mark them as phishing with your email provider.
🤯3🤔1
#prog #rust #itsec
crates.io: Malicious crates faster_log and async_println
crates.io: Malicious crates faster_log and async_println
The users in question were immediately disabled, and the crates in question were deleted from crates.io shortly after. We have retained copies of all logs associated with the users and the malicious crate files for further analysis.
The deletion was performed at 15:34 UTC on September 24, 2025.
#prog #rust #rustreleasenotes
Вышла версия Rust 1.90.0!.. Больше недели назад. В свою защиту могу сказать, что в этой версии заметных для большинства пользователей изменений в языке и нету.
Как всегда, тут только избранные части, всё остальное в детальных заметках о релизе.
▪️Как и было обещано, для таргета
▪️В качестве расширения к методам, добавленным в Rust 1.66.0, добавили методы
▪️
▪️Старый PR докатился до стейбла: в const-контексте наконец можно вызывать
▪️Реализацию
▪️Реализации
▪️Компилятор теперь не даёт скомпилировать код, который упоминает ABI, неподдерживаемый на целевой платформе.
Вышла версия Rust 1.90.0!.. Больше недели назад. В свою защиту могу сказать, что в этой версии заметных для большинства пользователей изменений в языке и нету.
Как всегда, тут только избранные части, всё остальное в детальных заметках о релизе.
▪️Как и было обещано, для таргета
x86_64-unknown-linux-gnu
теперь по умолчанию используется более быстрый линкер lld.▪️В качестве расширения к методам, добавленным в Rust 1.66.0, добавили методы
uX::*_sub_signed
(wrapping
, checked
, overflowing
и saturating
варианты) для корректного вычитания чисел с разной знаковостью.▪️
CString
, CStr
и Cow<CStr>
теперь можно сравнивать на равенство между собой. Нет, PartialOrd
между ними не реализован. Нет, я не знаю, почему.▪️Старый PR докатился до стейбла: в const-контексте наконец можно вызывать
reverse
на слайсах. Также теперь там можно вызывать на числах с плавающей точкой различные методы для округления и fract
для извлечения дробной части.▪️Реализацию
Default
для iter::Fuse
привели в соответствие с документацией: теперь default
создаёт Fuse
, оборачивающий значение по умолчанию внутреннего итератора, вместо создания всегда пустого итератора.▪️Реализации
io::Write
для TcpStream
и UnixStream
теперь на Linux пишут данные с флагом MSG_NOSIGNAL. Это означает, что запись в померший нижележащий сокет теперь возвращает EPIPE
— или, в терминах Rust, io::Error
, у которого kind()
возвращает ErrorKind::BrokenPipe. Данное изменение делает поведение консистентным с тем, как сокеты ведут себя в других местах в std.▪️Компилятор теперь не даёт скомпилировать код, который упоминает ABI, неподдерживаемый на целевой платформе.
👍4❤1
#prog #rust #article
From Rust to Reality: The Hidden Journey of fetch_max
From Rust to Reality: The Hidden Journey of fetch_max
Why would Rust providefetch_max
as a built-in intrinsic? Intrinsics usually exist to leverage specific hardware instructions. But x86-64 doesn't have anatomic max
instruction. So there had to be a CAS loop somewhere in the pipeline.
<...>
So I started digging. What I found was a fascinating journey through five distinct layers of compiler transformations, each one peeling back another level of abstraction, until I found exactly where that loop materialized. Let me share what I discovered.
❤3