Skip to content

QLISP v2.7.7 — part-time HLO: программа владеет своими артефактами

Choose a tag to compare

@FQingLars FQingLars released this 02 Oct 06:03
· 4 commits to main since this release

QLISP 2.7.7 — Release Notes

Тег: v2.7.7 · Платформы: Linux x86_64, Windows x86_64
Бинарники — сборка CI, коммит 3ae37e1 ветки main компиляторного репозитория (CI run 36772578415, зелёный). Состав: qlisp, qlisp-lsp, qvalent.

Файл Платформа Состав
qlisp-linux-x86_64 Linux x86_64 REPL/интерпретатор + JIT
qlisp-lsp-linux-x86_64 Linux x86_64 Language Server
qvalent-linux-x86_64 Linux x86_64 пакетный менеджер
qlisp-windows-x86_64.zip Windows x86_64 qlisp.exe, qlisp-lsp.exe, qvalent.exe

SHA256SUMS — контрольные суммы всех файлов.

Что нового — part-time HLO: программа владеет своими артефактами (FIXED)

Тестер (долгие компилирующие сессии): «утечка за вызов» — каждый HLO-COMPILE клонировал константы графа в бессмертный stable (даже при cache-hit), оставлял introspection-клон без владельца и никогда не освобождал W^X-страницу (ASan: 1120/752/1872 Б на тест, все из HloGraph::clone_into).

Причина: одноразовые артефакты компиляции жили в stable без владельца и без события смерти.

  • HloProgram владеет артефактами: storage-scope с sealed-константами (seal_graph_constants), introspection-клон графа, W^X-страница (page_free).
  • Якорь смерти = track_dtor в scratch на эпохе компиляции: программа умирает на первом restore, пересекающем эпоху (итерация объемлющего while или граница формы) — как любой scratch-объект.
  • Явное сохранение = привязка имени: clone_to в stable (defvar/setq через promote) помечает payload rooted — программа бессмертна до переписи. Спец-паттерн (setq *x* (HLO-COMPILE ...)) и defvar — явная просьба о бессмертии, всё прочее умирает само.
  • Кэш стенсила — non-owning дедупликация: drop стирает запись перед освобождением, мёртвая программа не возвращается из кэша; rooted-программы дедуплицируются между собой.
  • GRAPH-FROM-DATA: константы загруженного графа тоже seal-ятся в storage программы — закрыт кросс-форменный UAF.

Production-check (RSS): discard-loop ×20: 22548 → 3088 КБ (остаток — разовая high-water, наклон нулевой). distinct-loop ×20: 20632 → 20 КБ (идеально плоско). Корпус зелёный; ASan: утечки clone_into исчезли (memory_soak/arena_stress: 0).