Clause
← Уся документація

Англійський оригінал змінився після перекладу, тож частина тексту може бути застарілою. Читати англійською

Перекладено з англійського оригіналу · 1e3a39c8-dirty · 2026-10-26

Валідація

Поточний базовий рівень

Останні записані перевірки на хості розробки Windows x64 (clang-cl і LLVM SDK 23.1.2, /MT, _ITERATOR_DEBUG_LEVEL=0); наступні кроки записують свої в .agents/00-finished.md:

ПеревіркаРезультат
Свіжий комбінований Debug CTest (2026-10-14)299/300 пройдено; збій — відома межа розміру IR у codegen_measurements; codegen_resource_cli вимкнено
check-quality-all (той самий запуск)Без зауважень; Lizard CCN 10
Опційні тести аудиту OTP (2026-10-14, прив'язка d199a49a01a2, еталонний OTP 29.1.1)17/17
regenerate.py --corpus all --check (те саме)19/19 корпусів відтворюються

Запуск перевірки

З командного рядка розробника Visual Studio x64 з C:\Program Files\LLVM\bin у PATH (автоматичний вибір SDK повторно використовує thirdparty/):

cmake --preset debug --fresh -DBUILD_TESTING=ON -G Ninja -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl
cmake --build build/debug
ctest --preset debug-fast                  # during development
ctest --preset debug -j 16                 # full mode, at feature completion
cmake --build build/debug --target check-quality      # changed files, one unit per header
cmake --build build/debug --target check-quality-all  # whole tree

Linux

Та сама перевірка працює в Linux із зафіксованим LLVM 23.1.2 Linux SDK як компілятором хоста (CC/CXX з його bin/), системною libstdc++, Ninja і CMake 3.28 або новішим. Boost 1.90 і toml++ 3.4.0 беруться зі встановлених пакетів або розпаковуються в thirdparty/ (boost_1_90_0/, tomlplusplus-3.4.0/); лише у Windows вони завантажуються. ld.lld з архіву релізу компонується з ICU 70 (Ubuntu 22.04), а його lldb — з Python 3.14; на хостах без них linking_lto потребує ICU 70 у LD_LIBRARY_PATH, а linking_debugger використовує GDB.

cmake --preset debug --fresh -G Ninja -DBUILD_TESTING=ON
cmake --build build/debug
ctest --preset debug -j 16

check-quality (Lizard, clang-tidy) запускається лише на хості розробки під Windows; інші хости збирають і запускають тести (одного разу перевірка пройшла без зауважень у Linux, див. історію).

Інші цілі

32-бітні цілі й цілі ARM перевіряються без компілятора, зібраного для них (для цих хостів немає LLVM SDK):

Фікстури та походження

Дизайн тестів

Поведінка тестується через справжній CLI, згенеровані об'єктні файли, скомпоновані нативні споживачі та еталони OTP. Цільові модульні тести залишаються лише там, де вихідний код не може досягти потрібного стану, і для кожного його призначення вказано в самому тесті:

Випадки, що залежать від можливостей файлової системи (посилання, псевдоніми регістру), повідомляють про пропуски окремих випадків; вони ніколи не підміняють проходження цілого тесту.

Стан платформ і санітайзерів

Бенчмарки

Ручне порівняння продуктивності з Erlang/OTP. Воно ніколи не входить до CTest, перевірки комітів чи check-quality, і лише йому потрібен Erlang/OTP на хості; результати — це свідчення для конкретного хоста, а не результати перевірки.

make-benchmark.bat                         # Windows; set JOBS=N to cap parallel builds
make-benchmark.bat --repeat 9 --only bench_gc,bench_msg
make-benchmark.bat --cpus all                 # unpinned set; default --cpus performance
make benchmark BENCH_ARGS="--baseline HEAD~5"   # other hosts

Історія

Стиснуто з колишніх записів для окремих кроків (оригінали в історії Git до коміту 2777c98). Якщо не зазначено інше: Windows x64, LLVM 23.1.2, прив'язка 21776803ecd1, еталонний OTP 29.1.1 / ERTS 17.1. Кількості тестів — це повні проходження CTest з нулем пропусків.

ДатаВіхаТестиОдиниці якостіПримітки
2026-09-19Синтаксичний аналізатор, фаза VI (macOS arm64, OTP 29.1 751f87b7, еталон 29.0.5)46усі344/344 продукцій засвідчено; корпус із 10 файлів
2026-09-20Проєкти (macOS arm64)64усіDebug, лише компілятор, ASan+UBSan
2026-09-28Міграція тестів на робочі процеси CLI; відновлення перевірки на Windows75усіПереповнення стека в parser_hardening виправлено стеком 8 MiB; Lizard + clang-tidy без зауважень
2026-09-29Віха компілятора, кроки 1–46103182Лише компілятор 80, лише runtime 16, runtime ASan 16
2026-10-01 – 10-03План зразків/guards PG1–PG20104–131189–258Ревізії ABI 2–4; PG15a зробив еталони незалежними від OTP (аудити опційні, 131 → 118 тестів); закрито на 19 корпусах, 67,634 значеннях, 1,969 засіяних результатах
2026-10-03Аудит джерел OTP125258Скопійовані файли OTP замінено локальними фрагментами; порівняння вікнами з 60 токенів із 4,150 файлами OTP на Erlang і 1,190 файлами C/C++ не знайшло збігів, крім згенерованого кортежу цілих чисел
2026-10-03Базовий рівень plan 11 step 1 (коміт b1a471f, прив'язка 21776803ecd1, Lizard 1.24.0, clang-tidy 22.1.8)125 (122 швидких)258Повний 729 с послідовно, 85 с з -j 16; аудити 14/14; корпуси 19/19; інші об'єктні файли O0/O2 перевірено для 7 цілей
2026-10-03Steps 2, 4: фікстури програм, друк термів126–128265Шість еталонів програм OTP; 9,542 еталони ~w/display
2026-10-04Steps 8, 8I: засіб запуску виконуваних файлів, класична купа (phases B, C закрито)138–144272–276Повний -j 16 235–370 с
2026-10-04 – 10-05Steps 9–20: case, if, генерування винятків, catch, try, трасування стека, maybe (phase D закрито), рекурсія, фрейми та хвостові виклики146–158277–278Швидкі й зачеплені тести повного режиму на кожному кроці; повний -j 16 155/155 за 259 с на phase D
2026-10-06Steps 21–28: comprehensions (phase E закрито), корені та збирання, обмеження пам'яті й термів (27A–27E), копіювання графів159–166278–281Повний -j 12 105–275 с; step 27 прибрав типові обмеження пам'яті
2026-10-07Steps 29–35: records, native records (ABI 6), funs (ABI 7), замикання, іменовані funs, динамічні виклики (ABI 8)167–177283–290Повний -j 12 119–152 с
2026-10-09Step 63 Linux x86-64 (WSL2 Ubuntu 25.04, glibc 2.41, LLVM 23.1.2 SDK clang, libstdc++ 14, GDB 16.2)235338Повний CTest 235/235 за 161 с; Lizard і clang-tidy без зауважень у Linux (7 звітів аналізатора в заголовках Boost проігноровано); перевірка Windows 235/235 з перевіреними заголовками
2026-10-09Step 64, 32-бітні: Windows x86 (WoW64, clang-cl) і Linux i386 (chroot Debian 13, clang 19)42 + 65 еталонів—Тести runtime/ABI 42/42 нативно на обох; еталони cross.py 65/65 на обох (запуски integer_limit лише для 64 біт пропущено)
2026-10-09Step 65, Linux arm64 і armhf (sysroot Debian 13, qemu-user 9.2)42 + 65 еталонів—Тести runtime/ABI 42/42 на кожній; еталони 64/65 на кожній (port_spawn enoent: прогалина posix_spawn у qemu), обмеження запуску 900 с
2026-10-10Step 67, ASan + UBSan + LeakSanitizer (Linux x86-64)235—Жодного звіту санітайзера; чотири тести з упровадженою відмовою хоста поза межами ASan; CLAUSE_TEST_TIMEOUT_SCALE=10
2026-10-10Step 68, ThreadSanitizer (Linux x86-64)233—Виправлено одну інверсію порядку блокувань (Executor::clear); далі жодного звіту в повному CTest і 15 тестах паралельності x5
2026-10-10Steps 65A–65C: behaviours, module_info/0,1, імпорти234–236 швидких342–344Еталони lint і виконуваних файлів відтворюються під OTP 29.1.1
2026-10-11Steps 73A–73G, parse transforms242/243 швидких—Відомий збій codegen_resource_cli, згодом вимкнений
2026-10-12Steps 62D1–62E, каталог збірки та кеші263/264усіПовний CTest, відомий збій codegen_resource_cli; check-quality-all без зауважень
2026-10-13Steps 58U–58W, кеш виведення типів278/279усіПовний CTest, відомий збій codegen_measurements; check-quality-all без зауважень
2026-10-14Step 41S, prim_eval і повторний запуск luerl (H3 закрито)299/300усіДив. поточний базовий рівень
2026-10-17Plan 20 OPTM.2 (однослівний Term, persistent terms на місці та звільнення їхньої пам’яті) і OPTM.3 (неперевірювані методи доступу)330/332усіПовний CTest: відома помилка codegen_measurements, а library_freshness (хостова OTP) досі очікує тіла заглушок not_implemented, замінені в b0e62a38; check-quality-all без зауважень
2026-10-19Plan 21 LIB10F ThreadSanitizer (Linux x86-64): еталони ETS і digraph, runtime_concurrency10—Жодного звіту; ets_portions на одному робочому потоці виявив звільнення під час видалення у двох порціях; виправлено обліком звільненого об’єкта як обійденого

PG = крок плану зразків/guards; записи кроків plan 11 архівовано в .agents/00-finished.md.