#prog #c #rust #article
"Just Use Rust": A Best-Case Historical Study of Open Source Vulnerabilities in C (PDF)
"Just Use Rust": A Best-Case Historical Study of Open Source Vulnerabilities in C (PDF)
We identified 68 prominent open source projects with C code, collected their vulnerability history data, and used their CWE designations to explore a best-case speculation on how many vulnerabilities might have been prevented with Rust. We estimate that 58.2% of historical vulnerabilities in our selection of open source C projects would have been virtually impossible in Rust.
😢17😁13🤡7👍5🔥1🤔1
#prog #article
Syntax highlighting is a waste of an information channel
Syntax highlighting is a waste of an information channel
Color carries a huge amount of information. Color draws our attention. Color distinguishes things. And we just use it to distinguish syntax.
Nothing wrong with distinguishing syntax. It's the "just" that bothers me.
<...>
I've listed some examples of what we could do with this. If this is something that already exists I included a link.
We can use different colors to mark how nested a set of parenthesis are.
<...>
Highlight different levels of nesting.
<...>
Highlight identifiers imported from a different file.
<...>
Highlight functions that raise errors not caught in their body.
<...>
Highlight functions that were directly called in the bodies of tests that failed in the last test run.
😢20👍11🤔2
#prog #article
Why SSA?
Содержит кусочки теории графов.
Why SSA?
If you’ve read anything about compilers in the last two decades or so, you have almost certainly heard of SSA compilers, a popular architecture featured in many optimizing compilers<...>
SSA is actually very simple once you forget everything you think your programs are actually doing. We will develop the concept of SSA form, a simple SSA IR, prove facts about it, and design some optimizations on it.
Содержит кусочки теории графов.
😢19👍4
#game #article
Несправедливо забыли Райдена из Metal gear rising: revengeance.
dtf.ru/games/4106323-top-10-samyh-muzhestvennyh-yagodic-v-igrah
Несправедливо забыли Райдена из Metal gear rising: revengeance.
dtf.ru/games/4106323-top-10-samyh-muzhestvennyh-yagodic-v-igrah
DTF
Топ-10 самых мужественных, брутальных и упругих ягодиц в играх — лонг, написанный человеком — Игры на DTF
Топ самых мужественных ягодиц в играх, Питер Паркер, Солид Снейк, Веном, Крис Редфилд, Данте, Зангиев, Найтвинг и другие персонажи
😢15❤2🔥1💯1
#prog #js #typescript #article
The Code Review That Changed Everything
TL;DR: в отличие от прочих абстракций,
(thanks @al_tch)
The Code Review That Changed Everything
TL;DR: в отличие от прочих абстракций,
enum в Typescript приводит к генерации нетрививального рантайм-кода, который не вычищается tree shaker-ами, а в случае численных enum ещё и не даёт type safety.(thanks @al_tch)
DEV Community
The Code Review That Changed Everything
Three months ago, I submitted what I thought was a perfectly reasonable pull request. I had created a...
😢16🤣2🤔1
#prog #csharp #article
Performance Improvements in .NET 10
Сентябрьская статья об оптимизациях в .NET. Как пишет автор, ускорение кода, как правило, достигается не за счёт одного большого изменения, а за счёт множества маленьких — и весь текст статьи это прекрасно иллюстрирует.
В статье множество примеров того, как одно изменение в JIT позволяет применить другие, уже имеющиеся оптимизации, чтобы достичь улучшения, недоступного при применении оптимизаций по отдельности.
Вместе с тем статья несколько расстраивает тем, что ясно показывает, какие усилия приходится тратить разработчикам JIT, чтобы ускорить C#. Многие эти оптимизации были бы избыточны, если бы язык был бы более выразительным или если бы использовались более высокоуровневые (и удобные!) API. Думаю, напишу как-то об этом.
Performance Improvements in .NET 10
Сентябрьская статья об оптимизациях в .NET. Как пишет автор, ускорение кода, как правило, достигается не за счёт одного большого изменения, а за счёт множества маленьких — и весь текст статьи это прекрасно иллюстрирует.
В статье множество примеров того, как одно изменение в JIT позволяет применить другие, уже имеющиеся оптимизации, чтобы достичь улучшения, недоступного при применении оптимизаций по отдельности.
Вместе с тем статья несколько расстраивает тем, что ясно показывает, какие усилия приходится тратить разработчикам JIT, чтобы ускорить C#. Многие эти оптимизации были бы избыточны, если бы язык был бы более выразительным или если бы использовались более высокоуровневые (и удобные!) API. Думаю, напишу как-то об этом.
Microsoft News
Performance Improvements in .NET 10
Take a tour through hundreds of performance improvements in .NET 10.
😢17👍3😁1🤔1
#prog #article (и #rust, но многое в статье от Rust не зависит)
SocketAddrV6 is not roundtrip serializable
SocketAddrV6 is not roundtrip serializable
😱5💩1
#prog #rust #article
Rust in Android: move fast and fix things
Rust in Android: move fast and fix things
The 2025 data continues to validate the approach, with memory safety vulnerabilities falling below 20% of total vulnerabilities for the first time.
We adopted Rust for its security and are seeing a 1000x reduction in memory safety vulnerability density compared to Android’s C and C++ code. But the biggest surprise was Rust's impact on software delivery. With Rust changes having a 4x lower rollback rate and spending 25% less time in code review, the safer path is now also the faster one.
We'll analyze a near-miss memory safety bug in unsafe Rust: how it happened, how it was mitigated, and steps we're taking to prevent recurrence. It’s also a good chance to answer the question “if Rust can have memory safety issues, why bother at all?”
👍5
Блог*
Как ни странно, больше всего проблем принёс сам факт инкремента версии...
#prog #article
Ваши тесты упали по причине JavaScript
TL;DR: в коде для UI-тестирования был
Ваши тесты упали по причине JavaScript
TL;DR: в коде для UI-тестирования был
if по версии VS Code, который сравнивал версию (заданную строкой) с литералом "1.44.0", и лексикографическое сравнение строк перестало быть корректным в данном случае, когда минорная версия VS Code перевалила за сотню и стала умещаться в три символа, а не два.🤩13❤2
#prog #go #article
The Green Tea Garbage Collector
Статья о дизайне нового сборщика мусора для Go, который идейно является всё тем же mark and sweep, но сканирует память страницами вместо того, чтобы отслеживать в очереди каждую индивидуальную аллокацию.
Разумеется, выигрыш по производительности сильно зависит от формы графа объектов (и в некоторых случаях может быть хуже предыдущего), но на практике даже сканирование страниц памяти по 2 процента за раз уже даёт выигрыш.
The Green Tea Garbage Collector
Статья о дизайне нового сборщика мусора для Go, который идейно является всё тем же mark and sweep, но сканирует память страницами вместо того, чтобы отслеживать в очереди каждую индивидуальную аллокацию.
Разумеется, выигрыш по производительности сильно зависит от формы графа объектов (и в некоторых случаях может быть хуже предыдущего), но на практике даже сканирование страниц памяти по 2 процента за раз уже даёт выигрыш.
go.dev
The Green Tea Garbage Collector - The Go Programming Language
Go 1.25 includes a new experimental garbage collector, Green Tea.
👍8🤡3
#prog #article #amazingopensource
zizmor — статический анализатор для Github Actions, рождённый из-за фрустрации автора, вызванной тем, насколько легко использовать Github Actions небезопасно. Инструмент намеренно нацелен на то, чтобы иметь высокий signal to noise ratio по умолчанию.
В статье Introducing zizmor: now you can have beautiful clean workflows автор рассказывает о том, что это за инструмент и мотивации для его создания, а также некоторые детали реализации (написан на Rust, BTW).
В более технической статье Fun with finite state transducers автор рассказывает о том, как снизил на порядок количество данных, включаемых в инструмент. Эти данные используются для идентификации того, в каких контекстах YAML-файлов, настраивающих Github Actions, включение внешних данных небезопасно.
Если вы сомневаетесь, насколько этот инструмент нужен, то в статье zizmor would have caught the Ultralytics workflow vulnerability автор рассказывает, как zizmor мог бы предотвратить инцидент, который привёл к публикации как минимум двух вредоносных версий Python-библиотеки для машинного обучения и, предположительно, к компроментации репозитория целиком.
zizmor — статический анализатор для Github Actions, рождённый из-за фрустрации автора, вызванной тем, насколько легко использовать Github Actions небезопасно. Инструмент намеренно нацелен на то, чтобы иметь высокий signal to noise ratio по умолчанию.
В статье Introducing zizmor: now you can have beautiful clean workflows автор рассказывает о том, что это за инструмент и мотивации для его создания, а также некоторые детали реализации (написан на Rust, BTW).
В более технической статье Fun with finite state transducers автор рассказывает о том, как снизил на порядок количество данных, включаемых в инструмент. Эти данные используются для идентификации того, в каких контекстах YAML-файлов, настраивающих Github Actions, включение внешних данных небезопасно.
Если вы сомневаетесь, насколько этот инструмент нужен, то в статье zizmor would have caught the Ultralytics workflow vulnerability автор рассказывает, как zizmor мог бы предотвратить инцидент, который привёл к публикации как минимум двух вредоносных версий Python-библиотеки для машинного обучения и, предположительно, к компроментации репозитория целиком.
👍4🔥1
#prog #c #article #abnormalprogramming
Серия из трёх (на текущий момент) статей о странностях C
Weekend projects: getting silly with C
Getting silly with C, part (void*)2
Getting silly with C, part ~(~1<<1)
Наверное, мои самый любимые примеры кода из статей — это многострочный комментарий:
и абьюз type punning-а на сигнатуре
Серия из трёх (на текущий момент) статей о странностях C
Weekend projects: getting silly with C
Getting silly with C, part (void*)2
Getting silly with C, part ~(~1<<1)
Наверное, мои самый любимые примеры кода из статей — это многострочный комментарий:
#include <stdio.h>
int main() {
puts("Hello world");
asm("/*");
/* Nested comment */
for (int i = 0; i < 10; i++) puts("I LIKE PANCAKES!");
asm("*/");
puts("Goodbye world");
}
и абьюз type punning-а на сигнатуре
main для доставания "Главного ответа о вселенной, смысле жизни и всего такого" из воздуха:#include <stdio.h>
int main(int i) {
do do do do "baby shark!";
while (++i % 2);
while (i == 2);
while (i % 3);
while (i % 7);
printf("The answer is %d.\n", i);
}
😁12👍2🤯2🍌1
#prog #article
Afternoon project: JPEG DCT text lossifizer
Чел сделал штуку (веб-приложение), которая применяет к тексту процесс, аналогичный сжатию с потерями в JPEG: разбирает текст как семпл на частоты, огрубляет их и собирает обратно.
Пара моментов:
В JPEG квантизация в основном огрубляет (и отбрасывает) высокие частоты. В случае же с текстом это приводило к слишком большой деградации, поэтому программа сначала отбрасывает низкие частоты.
Первоначальная реализация использовала ASCII-коды напрямую, но комментатор предложил другую кодировку, в которой символы со схожим написанием/звучанием имели близкие коды, и это положительно сказалось на читаемости сжатого текста даже с весьма большим огрублением.
Afternoon project: JPEG DCT text lossifizer
Чел сделал штуку (веб-приложение), которая применяет к тексту процесс, аналогичный сжатию с потерями в JPEG: разбирает текст как семпл на частоты, огрубляет их и собирает обратно.
Пара моментов:
В JPEG квантизация в основном огрубляет (и отбрасывает) высокие частоты. В случае же с текстом это приводило к слишком большой деградации, поэтому программа сначала отбрасывает низкие частоты.
Первоначальная реализация использовала ASCII-коды напрямую, но комментатор предложил другую кодировку, в которой символы со схожим написанием/звучанием имели близкие коды, и это положительно сказалось на читаемости сжатого текста даже с весьма большим огрублением.
🤯11❤4🔥2
#prog #rust #article
In defense of lock poisoning in Rust
In defense of lock poisoning in Rust
<...> I keep coming back to how unbounded the downside of an undetected panic is, and how easy it is to get wedged in this state. Mutexes and poisoning have value separate from each other, but I don’t think they are as independent as they seem at first. My understanding from writing Rust code over many years is that almost all uses of mutexes benefit from poisoning, and almost all instances of poisoning one needs to care about are with mutex-guarded data.
#prog #amazingopensource #article (и даже в какой-то мере #algo)
Stacktower.io (репозиторий) — инструмент для создания визуализаций зависимостей в духе известного комикса xkcd + история о его создании, с инкрементальным улучшением, начиная с брутфорса. История хорошо демонстрирует, насколько хорошо помогает знать prior art в computer science.
Stacktower.io (репозиторий) — инструмент для создания визуализаций зависимостей в духе известного комикса xkcd + история о его создании, с инкрементальным улучшением, начиная с брутфорса. История хорошо демонстрирует, насколько хорошо помогает знать prior art в computer science.
👍16🌚4❤🔥2❤1
#prog #go #article #suckassstory
В стандартной библиотеке Go есть тип
Поле
Так как в Go нет констант (кроме чисел и строк),
Элемент синтаксиса
Какая по итогу ситуация? Во множестве реально используемых программ на Go есть код, который трогает глобальную переменную (и, так как это Go, без синхронизации), полагается на неявное обещание другого кода эту глобальную переменную не трогать и платят за проверки типов при касте, не смотря на то, что тип так-то известен статически. В теории тот факт, что
Очевидным выходом из этой ситуации является добавить функцию, которая будет возвращать значение
В стандартной библиотеке Go есть тип
http.Client — HTTP-клиент. Одно из полей этого типа — Transport. Это поле хранит значение, которое занимается обработкой единичных запросов. Разумеется, для поля Transport есть значение по умолчанию — DefaultTransport. Но есть одна загвоздка.Поле
Transport — и, соответственно, DefaultTransport — имеют тип RoundTripper. Это интерфейс с единственным методом:RoundTrip(*Request) (*Response, error)
DefaultTransport при этом на самом деле является значением типа Transport, у которого бОльшая часть полей является конфигурацией. На практике часто требуется скорректировать конфигурацию по умолчанию под нужды приложения (например, поменять таймауты). Но как это сделать?Так как в Go нет констант (кроме чисел и строк),
DefaultTransport является глобальной переменной пакета http. Соответственно, чтобы не поменять глобальную конфигурацию для всего, что использует http.Client (включая, возможно, код в зависимостях), нужно сначала сделать копию этой конфигурации. Более того, так как DefaultTransport имеет тип интерфейса RoundTripper, сначала нужно привести его к конкретному типу Transport. В итоге на практике во многих проектах на Go есть код наподобие этого:t := http.DefaultTransport.(*http.Transport).Clone()
// Change properties
t.TLSHandshakeTimeout = time.Second
t.DisableKeepAlives = true
Элемент синтаксиса
.(*http.Transport) является кастом интерфейса к конкретному типу, и так как синтаксически это не форма каста, которая возвращает два значения, это "небезопасный" каст, который паникует, если тип отличается от указанного.Какая по итогу ситуация? Во множестве реально используемых программ на Go есть код, который трогает глобальную переменную (и, так как это Go, без синхронизации), полагается на неявное обещание другого кода эту глобальную переменную не трогать и платят за проверки типов при касте, не смотря на то, что тип так-то известен статически. В теории тот факт, что
DefaultTransport является интерфейсом, позволяет поменять реализацию в будущем. На практике из-за существующего кода этого никогда не произойдёт, потому что сломает кучу работающего кода. Поменять тип DefaultTransport также нельзя, потому что это будет ломающим обратную совместимость изменение.Очевидным выходом из этой ситуации является добавить функцию, которая будет возвращать значение
DefaultTransport, как конкретный тип Transport. Соответствующее предложение поступило в мае 2020 года, однако воз и ныне там.pkg.go.dev
http package - net/http - Go Packages
Package http provides HTTP client and server implementations.
👍14😁9
#prog #article
On the purported benefits of effect systems
On the purported benefits of effect systems
Don’t get me wrong, I think effect systems are cool because of the ability to define custom control flow operations in libraries.
However, the wide variety of purported benefits do not seem to stand up to close scrutiny.
Typesanitizer
On the purported benefits of effect systems
A close examination on the supposed benefits of effect systems, framed as a conversation between two programming language designers.
👎3👍2
#prog #article
Advent of compiler optimizations — сборник декабрьских статей, по одной в день (в обратном хронологическом порядке), демонстрирующих на отдельных небольших примерах различные оптимизации компиляторов. Написано Мэттом Годболтом (да-да, тот самый, который godbolt.org).
Advent of compiler optimizations — сборник декабрьских статей, по одной в день (в обратном хронологическом порядке), демонстрирующих на отдельных небольших примерах различные оптимизации компиляторов. Написано Мэттом Годболтом (да-да, тот самый, который godbolt.org).
🔥7❤2
#prog #rust #c #article
Eurydice: a Rust to C compiler (yes)
Сделано для интеграции кода на Rust в существующие проекты на C без того, чтобы требовать наличие двух параллельных реализаций.
Присутствует чуть-чуть джеркования:
Eurydice: a Rust to C compiler (yes)
Eurydice is a compiler from Rust to C that aims to produce readable C code.
Сделано для интеграции кода на Rust в существующие проекты на C без того, чтобы требовать наличие двух параллельных реализаций.
Присутствует чуть-чуть джеркования:
Having a backwards-compat scenario where Rust can be compiled to C serves several purposes.
<...>
3. It allows for a census of problematic scenarios. By making the Rust version the default (and putting the fallback C behind a--write-us-an-emailflag), there is finally a way to enumerate those mythical users who cannot switch to Rust just yet.
❤4❤🔥2