Skip to content

Ouroboros-Logger 0.3.1

Choose a tag to compare

@the-homeless-god the-homeless-god released this 29 Aug 10:34
· 106 commits to main since this release

Починка безопасности — ради неё выпуск и вышел

Обмазка 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