#prog #article
GSoC 2025: Usability Improvements for the Undefined Behavior Sanitizer
clang поддерживает несколько санитайзеров, в том числе UBSan для отловки неопределённого поведения (с оговорками). Запускать их при этом можно в двух разных режимах. Первый — с добавлением рантайма, который при детектировании UB перед завершением работы программы печатает, что конкретно пошло не так. Второй вариант — без рантайма, в котором при детектировании UB просто исполняется trap-инструкция процессора.
Второй вариант больше годится для случаев, когда важны оверхед на производительность и размер компилированного кода (в embedded, например). Проблема в том, что UX у такого решения ужасный: получай аварийное завершение программы, а что именно пошло не так — гадай сам. И даже дебаггер в этих случаях не особо помогает, потому что он максимум укажет на инструкцию рядом с trap и на соответствующую строку исходного кода, но не более.
Anthony Tran задался целью исправить этот недостаток. С этой целью он модифицировал кодогенерацию так, чтобы к trap-инструкции прицеплялась отладочная информация, в которую уже включалось человекочитаемое сообщение об ошибке. Этот подход хорош тем, что сразу же подхватывается существующими отладчиками. Разумеется, дополнительная отладочная информация требует места, но оверхед на размер кода на практике пренебрежимо мал.
Не обошлось без костылей из-за ограниченности DWARF:
GSoC 2025: Usability Improvements for the Undefined Behavior Sanitizer
clang поддерживает несколько санитайзеров, в том числе UBSan для отловки неопределённого поведения (с оговорками). Запускать их при этом можно в двух разных режимах. Первый — с добавлением рантайма, который при детектировании UB перед завершением работы программы печатает, что конкретно пошло не так. Второй вариант — без рантайма, в котором при детектировании UB просто исполняется trap-инструкция процессора.
Второй вариант больше годится для случаев, когда важны оверхед на производительность и размер компилированного кода (в embedded, например). Проблема в том, что UX у такого решения ужасный: получай аварийное завершение программы, а что именно пошло не так — гадай сам. И даже дебаггер в этих случаях не особо помогает, потому что он максимум укажет на инструкцию рядом с trap и на соответствующую строку исходного кода, но не более.
Anthony Tran задался целью исправить этот недостаток. С этой целью он модифицировал кодогенерацию так, чтобы к trap-инструкции прицеплялась отладочная информация, в которую уже включалось человекочитаемое сообщение об ошибке. Этот подход хорош тем, что сразу же подхватывается существующими отладчиками. Разумеется, дополнительная отладочная информация требует места, но оверхед на размер кода на практике пренебрежимо мал.
Не обошлось без костылей из-за ограниченности DWARF:
To accomplish this, we needed to find a place to “stuff” the string in the DWARF DIE tree. Using aDW_TAG_subprogramwas deemed the most straightforward and space-efficient location. This means we create a syntheticDISubprogramwhich is not a real function in the compiled program; it exists only in the debug info as a container.
<...>
When a trap is hit in the debugger, the debugger retrieves this string from the debug info and shows it as the reason for trapping.
The LLVM Project Blog
GSoC 2025: Usability Improvements for the Undefined Behavior Sanitizer
Introduction My name is Anthony and I had the pleasure of working on improving the Undefined Behavior Sanitizer this Google Summer of Code 2025. My mentors were Dan Liew and Michael Buch.
👍7
Forwarded from меньше чем три <3
Use non-human-readable ids (for example objectGuid) instead of things like SAM account name or email address for data that you expect to live longer that a single day - names tend to change even if this was not originally planned by the spec.
#software_work_tips
#software_work_tips
💯8🤔2
Блог*
#prog #rust #article Four challenges cargo-semver-checks has yet to tackle
Почти все до сих пор не решены :/ Ну, хотя бы по cross crate analysis и type checking подвижки есть
Кем бы вы предпочли работать?
Anonymous Poll
42%
Дизайнер автомобилей
58%
Дизайнер игрушечных автомобилей
🤡13🫡3😁1
#prog #rust #article
What does it take to ship Rust in safety-critical?
Статья про очень конкретные препятствия к использованию Rust в safety-critical системах.
Это именно препятствия, а не блоки — в этих областях Rust уже используется в проде.
What does it take to ship Rust in safety-critical?
Статья про очень конкретные препятствия к использованию Rust в safety-critical системах.
Это именно препятствия, а не блоки — в этих областях Rust уже используется в проде.
blog.rust-lang.org
What does it take to ship Rust in safety-critical? | Rust Blog
Empowering everyone to build reliable and efficient software.
🤔2
Forwarded from ✨[LLC] food and ass✨
Оказывается если закрывать как можно быстрее срочные задачи - это не значит что ты сможешь сделать в спокойном темпе не срочные но нужные, тебе просто дадут новых срочных задач от коллег 🥵
Please open Telegram to view this post
VIEW IN TELEGRAM
🫡19😢7💯1
#prog #rust #article
Офигенно!
Rust's standard library on the GPU
Офигенно!
Rust's standard library on the GPU
GPU code can now use Rust's standard library. We share the implementation approach and what this unlocks for GPU programming.
This works because of our customhostcallframework. A hostcall is analogous to a syscall. A hostcall is a structured request from GPU code to the host CPU to perform something it cannot execute itself. You can think of it like a remote procedure call from the GPU to the host to achieve syscall-like functionality.
To end users, Rust's std APIs appear unchanged and act as one would expect.
❤11👍7
Блог*
#video Рекурсивный Bad apple (крайне не советую смотреть, если вы страдаете эпилепсией)
#video
Bad apple, но каждый кадр меняется от предыдущего на два прямоугольника.
(есть вариант со сменой одного прямоугольника за кадр, но он выглядит хуже)
Bad apple, но каждый кадр меняется от предыдущего на два прямоугольника.
(есть вариант со сменой одного прямоугольника за кадр, но он выглядит хуже)
YouTube
Bad Apple!!, but only 2 new rectangles per frame
The 60 fps version of https://youtu.be/V9KJpbzNvKw (so 2 rectangles per frame of the original video), which looks somewhat better.
OG vid: https://www.nicovideo.jp/watch/sm8628149, https://youtu.be/FtutLA63Cp8
OG vid: https://www.nicovideo.jp/watch/sm8628149, https://youtu.be/FtutLA63Cp8
👍3🤔1💩1
#лингво #video
Девять минут нытья по поводу того, какая китайская система письменности логичная и одновременно нет
youtu.be/cYcO3G8Gxu8
Девять минут нытья по поводу того, какая китайская система письменности логичная и одновременно нет
youtu.be/cYcO3G8Gxu8
YouTube
The basics of how Chinese writing works
Get ready to learn Chinese buddy.
Notes/Corrections
--If there's any corrections that need to be made, I'll put them here.
Notes/Corrections
--If there's any corrections that need to be made, I'll put them here.
❤4
"Cloud-native" is a catch-all term for widely adopted shitty technology, such as Go and YAML
💯13🌚3👍1
#prog #c #article
You (probably) don’t need to learn C
You (probably) don’t need to learn C
I’m all for learning C if it will be useful for the job at hand, but you can write lots of great software without knowing C. [выделение моё]
A few people repeated the idea that C teaches you how code “really” executes. But C is an abstract model of a computer, and modern CPUs do all kinds of things that C doesn’t show you or explain. Pipelining, cache misses, branch prediction, speculative execution, multiple cores, even virtual memory are all completely invisible to C programs.
C is an abstraction of how a computer works, and chip makers work hard to implement that abstraction, but they do it on top of much more complicated machinery.
Nedbatchelder
You (probably) don’t need to learn C
I’m tired of this: “You have to learn C so you can understand how a computer really works.”
❤5💩3👍2😁1
Блог*
В этом случае достаточно поменять тип поля irrelevant на UnconditionallyEqual<String> — и можно будет использовать стандартный #[derive(PartialEq)] для достижения требуемого функционала.
#prog #rust
Кое-что я при написании этого поста упустил. Именно, к хэшированию предъявляется логичное требование: если два значения равны, то их хэши также равны.
Кое-что я при написании этого поста упустил. Именно, к хэшированию предъявляется логичное требование: если два значения равны, то их хэши также равны.
UnconditionallyEqual в том виде, как я написал, не реализовывает Hash, поэтому #[derive(Hash)] работать не будет. Тем не менее, заставлять программиста вручную писать реализацию Hash из-за наличия одного такого поля — не лучший UX. Поэтому стоит написать реализацию Hash для UnconditionallyEqual. Из-за изложенного выше требования и того факта, что UnconditionallyEqual не влияет на операцию равенства, корректной реализацией будет noop:impl<T> Hash for UnconditionallyEqual<T> {
fn hash<H: Hasher>(&self, _state: &mut H) {}
}🍌2
#math #article
Hobby’s algorithm for aesthetic Bézier splines
Разновидность сплайнов для "гладкой" интерполяции точек, которая быстро работает (пропорционально числу точек) и зачастую даёт эстетически приятные результаты. Из недостатков: передвижение опорных точек меняет форму всей кривой, и малое передвижение опорной точки может привести к радикальной смене формы кривой в районе этой точки.
В самом начале есть интерактивная демонстрация.
Hobby’s algorithm for aesthetic Bézier splines
Разновидность сплайнов для "гладкой" интерполяции точек, которая быстро работает (пропорционально числу точек) и зачастую даёт эстетически приятные результаты. Из недостатков: передвижение опорных точек меняет форму всей кривой, и малое передвижение опорной точки может привести к радикальной смене формы кривой в районе этой точки.
В самом начале есть интерактивная демонстрация.
🤔1
#prog #rust
Одна из клёвых вещей, которые есть в #zig — это синтаксис для многострочных строковых литералов:
Большим преимуществом этого синтаксиса является тот факт, что он позволяет с лёгкостью сделать отступ для литерала целиком и при этом не добавлять этот отступ в сам литерал, а также требует минимального экранирования (всё до перевода строки — содержимое строки). Аналогичный код в, скажем, Rust, требует такой неприятной вещи:
и поддержки со стороны компилятора для того, чтобы экранирование перевода строки убирало не только сам перевод строки, но и предшествующие пробельные символы. Обратите внимание на то, что мне также пришлось экранировать кавычки и
Именно по этой причине есть аж два RFC (раз, два), которые добавляют новые виды строковых литералов для подобных целей (включения многострочного кода на другом языке). Тем не менее, в обсуждении второго один человек заметил (и тут дела приобретают #abnormalprogramming оборот), что имитировать многострочные литералы из Zig в Rust в некоторой мере можно уже сейчас. Именно, doc-комментарии уже на этапе лексирования заменяются на
Одна из клёвых вещей, которые есть в #zig — это синтаксис для многострочных строковых литералов:
const hello_world_in_c =
\\#include <stdio.h>
\\
\\int main(int argc, char **argv) {
\\ printf("hello world\n");
\\ return 0;
\\}
;
Большим преимуществом этого синтаксиса является тот факт, что он позволяет с лёгкостью сделать отступ для литерала целиком и при этом не добавлять этот отступ в сам литерал, а также требует минимального экранирования (всё до перевода строки — содержимое строки). Аналогичный код в, скажем, Rust, требует такой неприятной вещи:
let hello_world_in_c = "\
#include <stdio.h>\
\n\
\nint main(int argc, char **argv) {\
\n printf(\"hello world\\n\");\
\n return 0;\
\n}";
и поддержки со стороны компилятора для того, чтобы экранирование перевода строки убирало не только сам перевод строки, но и предшествующие пробельные символы. Обратите внимание на то, что мне также пришлось экранировать кавычки и
\n в коде. Сырые строковые литералы позволяют убрать экранирование, но не лишние отступы:let hello_world_in_c = r#"#include <stdio.h>
int main(int argc, char **argv) {
printf("hello world\n");
return 0;
}"#;
Именно по этой причине есть аж два RFC (раз, два), которые добавляют новые виды строковых литералов для подобных целей (включения многострочного кода на другом языке). Тем не менее, в обсуждении второго один человек заметил (и тут дела приобретают #abnormalprogramming оборот), что имитировать многострочные литералы из Zig в Rust в некоторой мере можно уже сейчас. Именно, doc-комментарии уже на этапе лексирования заменяются на
#[doc]-атрибуты, а потому можно макросом извлечь эти литералы из атрибутов и сконкатенировать:macro_rules! text {
(#[doc=$first_line:literal] $(#[doc=$lines:literal])*) => {
concat!($first_line, $("\n", $lines),*)
};
}
let hello_world_in_c = text! {
///#include <stdio.h>
///
///int main(int argc, char **argv) {
/// printf("hello world\n");
/// return 0;
///}
};GitHub
Propose code string literals by Diggsey · Pull Request #3450 · rust-lang/rfcs
Add a new syntax for multi-line string literals designed to contain code and play nicely with rustfmt.
Rendered
Rendered
🥴17🤔2❤1
Forwarded from Технологический Болт Генона
Я тут с оказией фаззил один из npm-модулей, который парсит YAML и узнал, что в YAML есть конструкция в виде трёх точек -
... doc-end Explicit marker for the end of a document.
https://github.com/eemeli/yaml/blob/main/docs/07_parsing_yaml.md#lexsource-string-string
И реально в спеке такое есть (было бы удивительно, если бы не было, конечно 🌝)
Three dots ( “...”) indicate the end of a document without starting a new one, for use in communication channels.
https://yaml.org/spec/1.2.2/
Я просмотрел и написал какое-то бесчисленное количество YAML-файлов и не видел ни в одном из них этой конструкции.
...... doc-end Explicit marker for the end of a document.
https://github.com/eemeli/yaml/blob/main/docs/07_parsing_yaml.md#lexsource-string-string
И реально в спеке такое есть (было бы удивительно, если бы не было, конечно 🌝)
Three dots ( “...”) indicate the end of a document without starting a new one, for use in communication channels.
https://yaml.org/spec/1.2.2/
---
time: 20:03:20
player: Sammy Sosa
action: strike (miss)
...
---
time: 20:03:47
player: Sammy Sosa
action: grand slam
...
Я просмотрел и написал какое-то бесчисленное количество YAML-файлов и не видел ни в одном из них этой конструкции.
🤷2👍1🤔1