Блог*
#prog #article BTW PVS-Studio развивают версию своего анализатора для #go, и хотя для широкой публики анализатор ещё не доступен (в апреле будет бета-версия), он уже находит множество ошибок, которые не находит go vet. Все найденные ошибки при этом на Go…
#prog
Собственно, с сегодняшнего дня можно попросить доступ к ранним версиям анализаторов для Go и JavaScript/Typescript
Собственно, с сегодняшнего дня можно попросить доступ к ранним версиям анализаторов для Go и JavaScript/Typescript
PVS-Studio
Доступ к ранним версиям PVS-Studio
Мы рады сообщить, что команда PVS-Studio открывает программу раннего доступа для новых продуктов. Вы можете выбрать интересующее направление, одними из первых протестировать новые возможности и повлиять на дальнейшее развитие продукта.
❤7🤡1
#prog #cpp #article
On push_back_unchecked: Performance with FromIterator and Collect
TL;DR: в другом посте предлагали добавить в вектор операцию
On push_back_unchecked: Performance with FromIterator and Collect
TL;DR: в другом посте предлагали добавить в вектор операцию
push_back_unchecked, которая не проверяет ёмкость перед записью (и, соответственно, на полном векторе даёт UB). Замеры показали, что это даёт ускорение по сравнению с push_back в цикле. Автор же этой статьи сделал API FromIterator (взятый из std Rust) для своей библиотеки контейнеров и показал, что для таких юзкейсов можно добиться сопоставимого ускорения по сравнению с std::vector без возможности вляпаться в UB.An Update on Writing Memory Safety Bugs
On push_back_unchecked: Performance with FromIterator and Collect
Encapsulating Undefined Behaviour in the C++ Standard Library for Performance with Safety
🔥8❤1
#prog #rust #rustlib #article
Surelock
Работает и на no_std, полагается на lock_api для абстрагирования от реализации взаимной блокировки.
Surelock
Deadlocks are a solved problem in theory — we’ve known how to prevent them since 1971. The challenge is making that prevention ergonomic enough that people actually use it. Surelock is my attempt at that: lean into Rust’s type system to make the correct thing the easy thing, and make the wrong thing a compiler error.
Работает и на no_std, полагается на lock_api для абстрагирования от реализации взаимной блокировки.
👍6
#prog #article
ntoh*/hton* is a bad API
ntoh*/hton* is a bad API
But my point is not to bash C.
My point is that this API quirk fundamentally changes how people think about endianness, making them commit mistakes they wouldn’t make otherwise. Many people think integers have an intrinsic endianness, or prefer textual formats to seemingly avoid dealing with endianness, and I have held all these convictions myself at some point.
It’s not that people are stupid. It’s borderline impossible to make the same mistakes if you treat endianness as a parameter of a serialization format. But C doesn’t want you to think about it this way, and so you never realize you were lied to until you get a reason to think hard about it.
🔥7👍5👏1🤡1
#prog #article
AArch64 Bitmask Immediates
AArch64 (aka 64-битный ARM) — это архитектура с постоянным числом бит на кодировку инструкции (в противовес, скажем, x64). Это означает, что хотя архитектура и оперирует 64-битными числами, инструкции не могут использовать полноразмерные 64-битные литералы — они банально не влезают. К примеру, инструкции mov*, помещающие значение в регистр, могут принимать литералом только 16-битное число.
Подобные ограничения действуют и для инструкций, использующих побитовые логические операции. Однако там используется особый формат кодировки значений — т. н. bitmask immediate, который эксплуатирует тот факт, что на практике битовые маски, как правило, не произвольные числа, а имеют определённую структуру, и позволяет закодировать широкий набор битовых масок в всего 13 битах. Эта статья рассказывает, как устроена эта кодировка, и приводит код на Rust для того, чтобы переводить битовые маски в эту кодировку.
AArch64 Bitmask Immediates
AArch64 (aka 64-битный ARM) — это архитектура с постоянным числом бит на кодировку инструкции (в противовес, скажем, x64). Это означает, что хотя архитектура и оперирует 64-битными числами, инструкции не могут использовать полноразмерные 64-битные литералы — они банально не влезают. К примеру, инструкции mov*, помещающие значение в регистр, могут принимать литералом только 16-битное число.
Подобные ограничения действуют и для инструкций, использующих побитовые логические операции. Однако там используется особый формат кодировки значений — т. н. bitmask immediate, который эксплуатирует тот факт, что на практике битовые маски, как правило, не произвольные числа, а имеют определённую структуру, и позволяет закодировать широкий набор битовых масок в всего 13 битах. Эта статья рассказывает, как устроена эта кодировка, и приводит код на Rust для того, чтобы переводить битовые маски в эту кодировку.
👍3
#prog #rust #rustreleasenotes
Вышла версия Rust 1.95.0! Как всегда, тут только выдержки, всё остальное в детальных заметках о релизе.
▪️
▪️Частично примыкающее изменение: компилятор больше не выдаёт предупреждение на безусловные паттерны в
Эта идиома позволяет привязать значение и что-то сделать/проверить с ним и при этом не пустить имя в окружающую область видимости.
▪️Добавили новый макрос cfg_select!, который позволяет сделать подобие
Технически этот макрос не даёт новых возможностей, но без него нужные атрибуты
▪️Навряд ли кого-то коснётся, но:
▪️Поддержку части платформ подняли до Tier 2 — в основном встраиваемые ARM-платформы от Apple (и их симуляторные версии).
▪️Стабилизированы несколько API, в частности:
🔸Конверсии по ссылке из
🔸Аналогичные конверсии по ссылке между массивами в
🔸Модуль core::range, в котором собираются диапазоны, планируемые на замену текущим. Пока что стабилизированы только RangeInclusive и его итератор. В отличие от текущих диапазонов, новый тип не служит одновременно итератором и потому реализует
🔸Функция core::hint::cold_path для пометки пути исполнения, который не предполагается, что будет часто исполняться. Этакая замена
▪️rustdoc теперь предпочитает стабильные определения нестабильным при сортировке результатов поиска.
Вышла версия Rust 1.95.0! Как всегда, тут только выдержки, всё остальное в детальных заметках о релизе.
▪️
if-гуарды на ветках match теперь могут использовать if let:match value {
Some(x) if let Ok(y) = compute(x) => {
// Both `x` and `y` are available here
println!("{}, {}", x, y);
}
_ => {}
}▪️Частично примыкающее изменение: компилятор больше не выдаёт предупреждение на безусловные паттерны в
if let. Автор изменения мотивирует это распространением кода навроде такого:fn main() {
if let x = funx() && x < usize::MAX {
// use x
}
}Эта идиома позволяет привязать значение и что-то сделать/проверить с ним и при этом не пустить имя в окружающую область видимости.
▪️Добавили новый макрос cfg_select!, который позволяет сделать подобие
match, но для cfg-предикатов:cfg_select! {
unix => {
fn foo() { /* unix specific functionality */ }
}
target_pointer_width = "32" => {
fn foo() { /* non-unix, 32-bit functionality */ }
}
_ => {
fn foo() { /* fallback implementation */ }
}
}
let is_windows_str = cfg_select! {
windows => "windows",
_ => "not windows",
};Технически этот макрос не даёт новых возможностей, но без него нужные атрибуты
#[cfg] нужно выписывать самостоятельно, дублируя дословно все предикаты. Ровно по этой причине стал распространён и используется cfg-if — собственно, объявление в блоге напрямую на него и ссылается.▪️Навряд ли кого-то коснётся, но:
match по enum теперь всегда ведёт себя так, как будто он читает дискриминант. Это кажется странным, но объясняется #[non_exhaustive]. Без этого изменения то, есть ли в некотором unsafe-коде UB или нет, зависело от того, определён ли enum в текущем крейте или в другом. Также match теперь читает дискриминант, даже если только одна ветка населена — без этого изменения поведение различалось в обобщённом коде и в ручной мономорфизации.▪️Поддержку части платформ подняли до Tier 2 — в основном встраиваемые ARM-платформы от Apple (и их симуляторные версии).
▪️Стабилизированы несколько API, в частности:
🔸Конверсии по ссылке из
MaybeUninit-массивов в массивы и слайсы из MaybeUninit, а также конверсии по значению между ними🔸Аналогичные конверсии по ссылке между массивами в
Cell и массивами из Cell🔸Модуль core::range, в котором собираются диапазоны, планируемые на замену текущим. Пока что стабилизированы только RangeInclusive и его итератор. В отличие от текущих диапазонов, новый тип не служит одновременно итератором и потому реализует
Copy (при Copy-индексах, разумеется) и занимает меньше места: ему не нужно хранить состояние для отслеживания поведения на последней итерации, только два индекса.🔸Функция core::hint::cold_path для пометки пути исполнения, который не предполагается, что будет часто исполняться. Этакая замена
likely/unlikely.▪️rustdoc теперь предпочитает стабильные определения нестабильным при сортировке результатов поиска.
🎉9❤2🔥1🥰1
#prog #article
Exceptions in Cranelift and Wasmtime
И немного о том, почему добавить поддержку исключений в уже существующий WASM-рантайм оказалось не самой тривиальной задачей
Exceptions in Cranelift and Wasmtime
И немного о том, почему добавить поддержку исключений в уже существующий WASM-рантайм оказалось не самой тривиальной задачей
👍6🥰1😭1
Блог*
#prog #article Four Kinds of Optimisation (перевод) TL;DR: 1. Использование более хорошего алгоритма 2. Использование более хорошей структуры данных 3. Использование более низкоуровневой системы 4. Принятие менее точного решения Разумеется, по каждому…
#prog #article
The Fifth Kind of Optimisation
The Fifth Kind of Optimisation
A little while back I wrote about what I considered to be the four main kinds of optimisation:
<...>
However, none of this excuses the fact that I missed off a technique that, even when I wrote that post, I use frequently:
5. Use parallelisation.
Parallelism has long held promise but for a long time we couldn’t rely on hardware or programming languages when it came to parallel programming. I hope I’ve explained explain why I – and, I think, many other programmers – have consequently been afraid of exploiting parallelisation.
Nearly all those problems are now in the past and – finally! – we are starting to see somewhat widespread use of software that exploits the parallelisation potential of our hardware.
👍3🥰1😁1
#prog #itsec #rust #article
Bugs Rust Won't Catch
Bugs Rust Won't Catch
In April 2026, Canonical disclosed 44 CVEs in uutils, the Rust reimplementation of GNU coreutils that ships by default since 25.10. Most of them came out of an external audit commissioned ahead of the 26.04 LTS.
I read through the list and thought there’s a lot to learn from it.
What’s notable is that all of these bugs landed in a production Rust codebase, written by people who knew what they were doing, and none of them were caught by the borrow checker, clippy lints, or cargo audit.
<...>
If you write systems code in Rust, this is the most concentrated look at where Rust’s safety ends that you’ll likely find anywhere right now.
❤4🥰2🍌1
#prog
Source (вот вам и идея для PR в дебаггеры)
GDB pretty printing w/ Python is really powerful, but also it's ridiculously high friction compared to Microsoft's .natvis.
Completely aside from any syntactic whatever, you can't (safely) load any ol' Python script in a project's repo, but you can safely load up associated .natvis files, which makes Microsoft's solution vastly superior for library users.
And there's really no reason that GDB and LLDB can't just implement .natvis support out of the box. (Yes, I know there are Python libraries that add a subset of .natvis support to GDB, but that doesn't solve the "out of the box" part at all.) Or hell, if they really hate Microsoft (who doesn't?) then implement their own declarative debug visualizer format.
(This post brought to you by me using Clang 22 for _Defer via mingw and now having to write *ing Python to make my pure C project comfortably debuggable.)
Source (вот вам и идея для PR в дебаггеры)
👍2🤔1
Блог*
Люндук думает, что это эвфемизм, лол
От героя поста (cts)
#prog #article #abnormalprogramming #typescript
That's a Lot of Fish: PlaidCTF 2020
Статья про реверс-инжиниринг вот этого:
#prog #article #abnormalprogramming #typescript
That's a Lot of Fish: PlaidCTF 2020
Статья про реверс-инжиниринг вот этого:
🤷3🥰2🤯2👍1
Dolboeb-driven Development
https://www.youtube.com/watch?v=4XCkeN0XuqA
#prog #article #retroit #abnormalprogramming
Porting Mac OS X to the Nintendo Wii
Porting Mac OS X to the Nintendo Wii
Since its launch in 2007, the Wii has seen several operating systems ported to it: Linux, NetBSD, and most-recently, Windows NT. Today, Mac OS X joins that list.
In this post, I’ll share how I ported the first version of Mac OS X, 10.0 Cheetah, to the Nintendo Wii. If you’re not an operating systems expert or low-level engineer, you’re in good company; this project was all about learning and navigating countless “unknown unknowns”. Join me as we explore the Wii’s hardware, bootloader development, kernel patching, and writing drivers - and give the PowerPC versions of Mac OS X a new life on the Nintendo Wii.
🥰1🤯1
#prog #rust #cpp #article
How (and why) we rewrote our production C++ frontend infrastructure in Rust
"Фронтенд" в данном случае означает прокси-сервер, если что.
How (and why) we rewrote our production C++ frontend infrastructure in Rust
"Фронтенд" в данном случае означает прокси-сервер, если что.
“Should we convert our _ code to Rust?” is a question that comes up a lot. And a lot of the time the right answer is a pretty firm, “No.” So I thought it might be beneficial (and hopefully interesting) to walk through a case where the code involved was incredibly you-cannot-fuck-this-up business-critical and when we asked that question about it, we came back with a yes. Here’s what it was, how we got to that answer, and what we did about it.
The bottom line is that C++ has caused more than a few situations where we wanted to do something or add a feature and it’s just like… that’s a cool idea, but it’s just not worth the uphill battle against the language. And it was to the point where any change carries the risk of unforeseen consequences.
👍1🥰1😁1
Блог*
#prog #rust #amazingopensource Typst is a new markup-based typesetting system that is designed to be as powerful as LaTeX while being much easier to learn and use. Typst has: * Built-in markup for the most common formatting tasks * Flexible functions…
#prog #amazingopensource
Tylax is a high-performance tool written in Rust that converts mathematical formulas, tables, full documents, and TikZ graphics between LaTeX and Typst formats. It focuses on static analysis to preserve the document structure for manual editing and adjustment.
Tylax is a high-performance tool written in Rust that converts mathematical formulas, tables, full documents, and TikZ graphics between LaTeX and Typst formats. It focuses on static analysis to preserve the document structure for manual editing and adjustment.
🔥8🥰1👏1😁1🤔1