Ouroboros-Logger 0.3.1
Починка безопасности — ради неё выпуск и вышел
Обмазка C и C++ больше не читает за пределами объекта.
В 0.3.0 довод типа const char * печатался содержимым (%s в C,
std::string(s) в C++). Тип этого не обещает: функция
static int put_one(const char *p) { return (int)*p; }вызванная как put_one(&c) для одного знака на стеке — обычный правильный код.
Обмазанная копия читала за c до первого нуля где-то дальше в памяти.
Показано измерителем границ, а не рассуждением. Необмазанная программа чиста и
печатает 120; обмазанная в 0.3.0:
ERROR: AddressSanitizer: stack-buffer-overflow ... READ of size 2
#1 vsnprintf
#2 _ouro_enter ouroboros_runtime.h:654
[32, 33) 'c' <== Memory access at offset 33 overflows this variable
Это плохо дважды: инструмент обещает не менять поведение измеряемой программы —
а вносил в неё неопределённое поведение; и он ломал тех, кто гоняет свои проверки
под измерителем границ, который показывал бы на обмазку, а не на их ошибку.
Теперь любой указатель печатается адресом, и обе программы под измерителем границ
чисты.
Чего это стоило. Содержимое строк было самым полезным в записи на C, и его
больше нет. Безопасно вернуть нельзя: типа со значением «здесь точно строка с
нулём на конце» в C не существует, а ограничение длины не спасает. Как сделать
это необязательным поведением — записано в FEATURE_REQUESTS.md.
Что ещё вошло с 0.3.0
- C и C++ говорят с libclang через отдельный процесс. Разбором занят один
родной помощник, общий для обоих; кода, трогающего разборщик, было 127 строк из
458, стало 3 из 204. Поблажек по модулям вmypy --strictне осталось ни одной.
Заголовки llvm не нужны — помощник объявляет нужный кусок обычая вызовов сам, и
верность объявлений проверяется сборкой в обе стороны. - Покрытие с ветвями 94 → 99,51 %, проверок 580 → 742. Проверено не только
число: 15 нарочных порч в файлах со стопроцентным покрытием — все 15 пойманы. - Замеры по пяти языкам, снимаемые одной командой
scripts/measure/run.sh. - Пять проверок документации вместо двух: ссылки на строки исходника, ссылки
между страницами, числа состояния, слова со смешанными алфавитами и таблица
полей записи, печатаемая прогоном пяти языков.
Установка
brew install digitable-lol/tap/ouroboros
# или
uv tool install git+https://github.com/digitable-lol/ouroboros