Why are you all making restful services instead of, dunno, hard-working services or at least active ones?
👍13
#prog #rust #article
Semantic fuzzing of the Rust compiler and interpreter
Авторы сделали Rustlantis — фаззер, который генерирует программы на уровне MIR. Так как вывод программы предсказать заранее трудно, авторы применили подход differential testing: именно, они использовали несколько интерпретаторов и находили те программы, на которых они расходятся. Разумеется, подобный подход не имеет смысла для кода с UB, поэтому авторы специально написали генератор таким образом, чтобы избежать генерации UB.
В качестве верификаторов авторы использовали miri, компиляцию с помощью LLVM (с и без оптимизациями на уровне MIR) и Cranelift. Не смотря на крайне узкий охват пространства возможных программ, за 4,5 CPU-лет авторам удалось найти 13 новых багов.
Как видите, авторам не удалось найти баги, связанные с Cranelift, даже не смотря на то, что авторы ожидали противоположного. Авторы называют несколько возможных причин: cranelift намеренно не реализует много оптимизаций и он уже постоянно фаззится (аллокатор регистров — ещё и через symbolic execution).
*
Проектом заинтересовалась Rust foundation, так что есть шанс, что Rustlantis будет жить и развиваться дальше, а не помрёт, как очередная академическая штуковина.
*
Один из выявленных фаззером багов был спровоцирован, судя по фиксу, тем, что для одного из типов данных сравнение выполнялось неправильно: для него не была определена операция сравнения, но был определён неявный оператор каста в другой тип, для которого операция сравнения была, из-за чего сравнение начального типа учитывало лишь часть существенной информации.
Semantic fuzzing of the Rust compiler and interpreter
Авторы сделали Rustlantis — фаззер, который генерирует программы на уровне MIR. Так как вывод программы предсказать заранее трудно, авторы применили подход differential testing: именно, они использовали несколько интерпретаторов и находили те программы, на которых они расходятся. Разумеется, подобный подход не имеет смысла для кода с UB, поэтому авторы специально написали генератор таким образом, чтобы избежать генерации UB.
В качестве верификаторов авторы использовали miri, компиляцию с помощью LLVM (с и без оптимизациями на уровне MIR) и Cranelift. Не смотря на крайне узкий охват пространства возможных программ, за 4,5 CPU-лет авторам удалось найти 13 новых багов.
┌─────────┬──────────────┬─────┐
│ │Miscompilation│Crash│
├─────────┼──────────────┼─────┤
│rustc │ 3 │ 2 │
├─────────┼──────────────┼─────┤
│LLVM │ 6 │ 2 │
├─────────┼──────────────┼─────┤
│cranelift│ 0 │ 0 │
└─────────┴──────────────┴─────┘
*Как видите, авторам не удалось найти баги, связанные с Cranelift, даже не смотря на то, что авторы ожидали противоположного. Авторы называют несколько возможных причин: cranelift намеренно не реализует много оптимизаций и он уже постоянно фаззится (аллокатор регистров — ещё и через symbolic execution).
*
Проектом заинтересовалась Rust foundation, так что есть шанс, что Rustlantis будет жить и развиваться дальше, а не помрёт, как очередная академическая штуковина.
*
Один из выявленных фаззером багов был спровоцирован, судя по фиксу, тем, что для одного из типов данных сравнение выполнялось неправильно: для него не была определена операция сравнения, но был определён неявный оператор каста в другой тип, для которого операция сравнения была, из-за чего сравнение начального типа учитывало лишь часть существенной информации.
🔥14
Forwarded from Офигительные идеи🦄
А пооомните несколько лет назад ходило фото платья которые одни видели чёрно-синим, другие - жёлто-белым и в упор не понимали, как можно иначе?
Так вот. Я наткнулся на рисунок, который позволяет это ПОНЯТЬ, УВИДЕТЬ. ААААААААААА.
Так вот. Я наткнулся на рисунок, который позволяет это ПОНЯТЬ, УВИДЕТЬ. ААААААААААА.
🤯16👍3🤡2❤1
#prog #parsing #article
В Just write a parser (примечание к небольшому набору уроков по реализации парсера) автор выступает против глубокого изучения подходов к парсингу в курсах по обучению компиляторостроения и за то, чтобы забить на "академические" подходы и делать рекурсивный спуск руками. В качестве аргументов он приводит:
* Рекурсивный спуск очень хорошо даёт понять, как работает парсер, в отличие от генераторов парсеров.
* Это практичный навык: парсеры реальных компиляторов написаны вручную.
* Это не так уж и сложно.
В статье Why We Need to Know LR and Recursive Descent Parsing Techniques Laurence Tratt соглашается с первым тезисом (не перегружать курс по компиляторам подходами к парсингу), но оспаривает второй.
Именно, он указывает на LR-грамматики: такие грамматики точно являются однозначными, а то, является ли грамматика LR, можно проверить автоматически. Рекурсивный спуск же не даёт ясно понять, какова реализуемая парсером грамматика. В частности, реализуемая парсером грамматика может быть неоднозначной. Более того, то, что самописный рекурсивный спуск сам по себе вполне детерминирован, означает, что парсер таки разрешает неоднозначности грамматики, причём зачастую неочевидным способом.
Автор проводит параллель между валидатором грамматики и тайпчекером: прохождение проверки означает гарантию отсутствия определённых проблем (неоднозначностей грамматики и ошибок несовпадения типов соответственно). Более того, как он отмечает:
> If writing a grammar in LR style is hard for you as the language author, it will almost certainly be hard for users to understand!
Разумеется, автор признаёт, что не для всех языков возможно написать LR-грамматику в принципе, но он отмечает, что попытка написать такую грамматику может как минимум подсказать, где в реализации парсера могут крыться баги из-за неоднозначности.
Разумеется, это не всё, что есть в статье, так что советую прочитать целиком.
В Just write a parser (примечание к небольшому набору уроков по реализации парсера) автор выступает против глубокого изучения подходов к парсингу в курсах по обучению компиляторостроения и за то, чтобы забить на "академические" подходы и делать рекурсивный спуск руками. В качестве аргументов он приводит:
* Рекурсивный спуск очень хорошо даёт понять, как работает парсер, в отличие от генераторов парсеров.
* Это практичный навык: парсеры реальных компиляторов написаны вручную.
* Это не так уж и сложно.
В статье Why We Need to Know LR and Recursive Descent Parsing Techniques Laurence Tratt соглашается с первым тезисом (не перегружать курс по компиляторам подходами к парсингу), но оспаривает второй.
Именно, он указывает на LR-грамматики: такие грамматики точно являются однозначными, а то, является ли грамматика LR, можно проверить автоматически. Рекурсивный спуск же не даёт ясно понять, какова реализуемая парсером грамматика. В частности, реализуемая парсером грамматика может быть неоднозначной. Более того, то, что самописный рекурсивный спуск сам по себе вполне детерминирован, означает, что парсер таки разрешает неоднозначности грамматики, причём зачастую неочевидным способом.
Автор проводит параллель между валидатором грамматики и тайпчекером: прохождение проверки означает гарантию отсутствия определённых проблем (неоднозначностей грамматики и ошибок несовпадения типов соответственно). Более того, как он отмечает:
> If writing a grammar in LR style is hard for you as the language author, it will almost certainly be hard for users to understand!
Разумеется, автор признаёт, что не для всех языков возможно написать LR-грамматику в принципе, но он отмечает, что попытка написать такую грамматику может как минимум подсказать, где в реализации парсера могут крыться баги из-за неоднозначности.
Разумеется, это не всё, что есть в статье, так что советую прочитать целиком.
tiarkrompf.github.io
Tiark's Notebook
Tiark Rompf is an Associate Professor at Purdue University. Notes and blog posts on programming, research, CS, software systems.
👍11❤1🔥1
#prog #article
Debugging A Failing Hotkey
<...> So, yes, I’d just spent 30 minutes debugging a literally stuck key on my keyboard.
Debugging A Failing Hotkey
<...> So, yes, I’d just spent 30 minutes debugging a literally stuck key on my keyboard.
🔥16😁1
Forwarded from Лентач
Чинуши сменили желто-синий герб московского района Коптево
Глава Коптева Ольга Глаголева заявила «Подъёму», что прежний символ, который был утверждён почти 20 лет назад, не был зарегистрирован в Геральдическом совете.
Сам герб обновили в ноябре. По решению чинуш с левой части щита убрали фигуру солнца, добавив кресты. Почему понадобилось его менять именно сейчас, и с чем связано решение изменить цветовую гамму символов района не говорится.
Глава Коптева Ольга Глаголева заявила «Подъёму», что прежний символ, который был утверждён почти 20 лет назад, не был зарегистрирован в Геральдическом совете.
Сам герб обновили в ноябре. По решению чинуш с левой части щита убрали фигуру солнца, добавив кресты. Почему понадобилось его менять именно сейчас, и с чем связано решение изменить цветовую гамму символов района не говорится.
🤡29😁5👍2
#prog #article
Putting the I back in IDE: Towards a Github Explorer
Статья о том, как происходит процесс разработки и ревью кода в Jane street — значительно более интегрированный процесс, чем с комбинацией git и GitHub/Gitlab. Серьёзно, я хочу, чтобы у меня так на работе было.
Imagine a system for editing and reviewing code where:
* Every branch of every repo gets its own sandboxed directory. Your revision history in each branch, including uncommitted stuff, is persisted, as are build artifacts. When you switch contexts, each project is just as you left it.
* Within your editor, you can pull up a global view of all your branches, your outstanding pull requests, and the pull requests you’re assigned to review. It’s one keystroke to view the summary for a pull, and one more to start editing any of its files right there under your cursor.
* Code review happens entirely within the editor. You’re fed a series of diffs: one keystroke to approve, one keystroke to start editing. Dive in, make your changes, leave comments for the author, push, and move on.
We’ve actually developed this workflow at Jane Street, and it’s been used daily by hundreds of engineers for about two years now.
<...>
The trouble is that it’s pretty coupled to our somewhat uncommon toolchain: <...>
The goal of this post, then, is just to show off what the result looks like – to show you what kind of workflow is possible – in the hope that it inspires similar tools in other ecosystems. The truth is that after writing code at work this way for a while, you start to wish that you had something similar at home.
Putting the I back in IDE: Towards a Github Explorer
Статья о том, как происходит процесс разработки и ревью кода в Jane street — значительно более интегрированный процесс, чем с комбинацией git и GitHub/Gitlab. Серьёзно, я хочу, чтобы у меня так на работе было.
Imagine a system for editing and reviewing code where:
* Every branch of every repo gets its own sandboxed directory. Your revision history in each branch, including uncommitted stuff, is persisted, as are build artifacts. When you switch contexts, each project is just as you left it.
* Within your editor, you can pull up a global view of all your branches, your outstanding pull requests, and the pull requests you’re assigned to review. It’s one keystroke to view the summary for a pull, and one more to start editing any of its files right there under your cursor.
* Code review happens entirely within the editor. You’re fed a series of diffs: one keystroke to approve, one keystroke to start editing. Dive in, make your changes, leave comments for the author, push, and move on.
We’ve actually developed this workflow at Jane Street, and it’s been used daily by hundreds of engineers for about two years now.
<...>
The trouble is that it’s pretty coupled to our somewhat uncommon toolchain: <...>
The goal of this post, then, is just to show off what the result looks like – to show you what kind of workflow is possible – in the hope that it inspires similar tools in other ecosystems. The truth is that after writing code at work this way for a while, you start to wish that you had something similar at home.
👍11