T27.AI

Блог

90 тестов существовали, но были недостижимы

2026-09-07 · 6 мин чтения

[измерено в смерженном PR #778] Поддерево Zig codegen стало импортируемым, и стали достижимы 90 ранее скрытых тестов; в отчёте проверки число шагов выросло со 155 до 157, а число тестов — с 2 832 до 2 939.

Гравюрный триптих к статье: 90 тестов существовали, но были недостижимы
Три панели, слева направо

Подписи на изображении — на английском.

  1. THE TEST ROOTNinety tests became reachable.
  2. THE FAILURESTwo hidden failures surfaced.
  3. THE LIMIT66 identifier errors remain.
Открыть полный триптих в исходном размере
#Zig#Compiler#Testing#Reproducibility

[измерено в смерженном PR #778] Поддерево Zig codegen стало импортируемым, и стали достижимы 90 тестов, которые уже существовали, но не входили в исполняемое дерево. В отчёте проверки число шагов выросло со 155 до 157, а число тестов — с 2 832 до 2 939.

Интересен не размер диффа, а различие между гейтом, который может разобрать файл, и test root, который действительно может его запустить. Несколько ошибок Sema не давали импортировать дерево, хотя ast-check и общий format-gate продолжали считать файлы чистыми.

Скрытым гейтом оказался пропущенный default поля

[отчёт проверки] В десяти местах .test_cases = .{} не хватало поля capacity после изменения ArrayListUnmanaged в Zig 0.16. Ещё в двенадцати литералах Behavior.owner не было значения по умолчанию. Это ошибки формы на этапе компиляции, не падения во время исполнения; именно они оставляли дерево codegen вне тестового графа.

После исправления объявлений src/vibeec/zig_codegen.zig стал test root. Смерженный PR сообщает о 157/157 шагах сборки и 2 939 тестах против 155/155 и 2 832 до того, как дерево стало достижимым.

Достижимость показала два разных отказа

Второй отказ важен тем, что разделяет дефект реализации и дефект ожидания. Реализация уже сохраняла вложенную структуру списков; ожидание просто не успевало дойти до проверки, которая могла бы показать ошибку.

История с сигнатурой оказалась уже

[измерено в смерженном PR] Развёртка покрыла 558 комбинаций: 62 префикса имён behaviours и 9 фраз then. Emitter во всех случаях записал pub fn <name>() !void. Код inference вызывается из body_emitter и tests_gen, но не участвует в записи заголовка сгенерированной функции.

Это объясняет прежний отказ без заявления о незавершённом ремонте. Теперь два теста фиксируют границу: сигнатура, обещающая значение, должна в будущем иметь возвращающее тело, а текущий emitter всё ещё выдаёт !void. Подключение выведенных return types к заголовкам остаётся отдельной правкой.

Один класс ошибок оказался проблемой области видимости

[отчёт проверки] Перепись undeclared-identifier снизилась со 151 ошибки в 36 файлах до 66 ошибок; общее число ошибок упало с 354 до 272, а число отвергнутых файлов — со 100 до 94. Основной класс возник после миграции ArrayList на Zig 0.16: вызовы получили allocator-аргументы, но allocator не был связан во внешней функции.

Безопасная правка была структурной: подняться к внешней функции и использовать self.allocator, только если у функции есть self binding. Текстовая эвристика по той же строке пропускала вызовы внутри методов и могла изменить настоящий локальный allocator. Оставшиеся 66 ошибок относятся к другому классу; их оставили для чтения, а не включили в это исправление.

Что установлено, а что нет

Смерженный PR устанавливает достижимый test root для Zig codegen, две ранее скрытые ошибки тестов, которые были исправлены или зафиксированы, и более узкую классификацию оставшихся ошибок компилятора. Это результат программного репозитория.

Чего это не решает

Пруфы

Поработаем вместе

Хотите так же проверить собственный дизайн?

Я аудирую RTL и строю независимые побитово точные модели, затем провожу результат через синтез и, когда это полезно, проверяю на плате Artix-7. Первый модуль проверки — бесплатно.