Валідація
Поточний базовий рівень
Plan 11 step 1, 2026-10-03, коміт b1a471f, Windows x64: clang-cl 23.1.2,
LLVM SDK 23.1.2 (/MT, _ITERATOR_DEBUG_LEVEL=0), Lizard 1.24.0, clang-tidy
22.1.8, прив'язка OTP 21776803ecd1 з еталонним OTP 29.1.1 / ERTS 17.1.
| Перевірка | Результат |
|---|---|
| Свіжий комбінований Debug CTest | 125/125, нуль пропусків (729 с послідовно; 85 с з -j 16) |
CTest у швидкому режимі (debug-fast) | 122 тести, близько 60 с |
check-quality | Пройдено; Lizard CCN 10, clang-tidy для 258 робочих одиниць трансляції |
| Опційні тести аудиту OTP | 14/14 |
regenerate.py --corpus all --check | 19/19 корпусів відтворюються |
| Об'єктні файли O0/O2 для інших платформ | Перевірено 7 цілей (Linux x86/x64/ARM/AArch64, Windows x86/x64, Apple Silicon) |
Запуск перевірки
З командного рядка розробника 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 + dependents
cmake --build build/debug --target check-quality-all # whole tree
CLAUSE_TEST_MODE=fastзапускає еталонні корпуси на O0 з позиційним драйвером плюс проєктний драйвер на O2 з вимкненою спеціалізацією, запускає мутації один раз і пропускає тестиfull_only. Повний режим (за замовчуванням) запускає всі комбінації драйверів і політик.check-quality,make formatіmake-format.batохоплюють файли, змінені відHEAD, а також невідстежувані файли;cmake/quality_scope.pyдодає одиниці трансляції, які включають змінений заголовок. Зміни в.clang-tidy,cmake/або робочому CMake вибирають усе.- Тестові програми не містять налагоджувальної інформації (без PDB); для
перезбирання під налагоджувач слід конфігурувати з
-DCLAUSE_TEST_DEBUG_INFO=ON. Вкладені нативні споживачі компонуються з runtime батьківської збірки черезClauseRuntimeTargets.cmakeзамість повторної компіляції; лишеruntime_linkзбирає runtime окремо. - Пороги та придушення попереджень ніколи не підвищуються, щоб пройти перевірку.
Фікстури та походження
- Звичайні збірки й тести не потребують ні OTP, ні його вихідного коду. Еталони (goldens) було згенеровано один раз з OTP і закомічено з хешами; перевірки хешів виконуються перед використанням будь-якої фікстури.
- Дев'ятнадцять корпусів зразків/guards містять 67,748 нативних очікуваних значень/помилок і 106 рядків семантичного приймання. Кожен нативний корпус запускає позиційний і проєктний драйвери на O0/O2 з увімкненою/вимкненою спеціалізацією, з локальними та віддаленими викликами.
- Закомічені вхідні файли Erlang написано локально
(
tests/fixtures/patternmatch/fragments/, препроцесорніsemantic/headers/). Аудит 2026-10-03 видалив усі скопійовані файли OTP; порівняння вікнами з 60 токенів із 4,150 файлами OTP на Erlang і 1,190 файлами C/C++ не знайшло жодних збігів, крім згенерованого кортежу цілих чисел.fixture_sourcesзабезпечує ізоляцію. - Шість фікстур цільових програм (
tests/fixtures/programs/, plan 11 step 2) містять еталони stdout/коду завершення з OTP і сьогоднішні діагностики компіляції;programs_compileперевіряє їх без OTP, аtests/compiler/programs/regenerate.py --checkвідтворює їх під OTP (карта фікстур). - Еталони друку термів (
tests/fixtures/printing/, plan 11 step 4) містять текст OTP~wіerlang:display/1для 9,542 значень, а також stdout OTP для скомпільованих викликів display;tests/compiler/printing/regenerate.py --checkвідтворює їх (нотатки до фікстур). - Еталонні випадки виконуваних файлів (
tests/fixtures/executables/, plan 11 step 8) — це каталоги з вихідним кодом плюс одинgolden.jsonзі stdout/кодом завершення OTP і написаним вручну шаблоном stderr;tests/compiler/executables/run.pyкомпонує й запускає кожен із них у матриці політик/драйверів (CTestexecutables_<case>), аregenerate.py --checkвідтворює їх під OTP (нотатки до випадків). - Перегенерація та живі аудити запускаються явно:
-DCLAUSE_OTP_AUDITS=ONіtests/compiler/patternmatch/regenerate.py(інструкції). Ніщо не оновлює еталони чи прив'язку мовчки.
Дизайн тестів
Поведінка тестується через справжній CLI, згенеровані об'єктні файли, скомпоновані нативні споживачі та еталони OTP. Цільові модульні тести залишаються лише там, де вихідний код не може досягти потрібного стану, і для кожного його призначення вказано в самому тесті:
- Впроваджені бюджети та збої виділення пам'яті/вводу-виводу (
project_limits,project_creation_failure,codegen_limits,codegen_write_failure,runtime_lifecycle_failure, точки впровадження збоїв у згенерованих викликах). - Приватне володіння, недійсні/застарілі дескриптори та інваріанти відкату в синтаксичному аналізаторі, семантичному графі типів і бекенді.
- Валідація сирих слів і межі термів 32/64 біти (
runtime_immediate,runtime_term_tag,abi_integers). - Збої приймачів діагностики та знімок стабільних ідентифікаторів можливостей.
Випадки, що залежать від можливостей файлової системи (посилання, псевдоніми регістру), повідомляють про пропуски окремих випадків; вони ніколи не підміняють проходження цілого тесту.
Стан платформ і санітайзерів
- Нативне виконання згенерованого коду: лише Windows x64.
- Linux, Apple Silicon і нативне 32-бітне виконання: очікується (об'єктні файли лише перевіряються).
- ASan, UBSan і LeakSanitizer для компілятора/фронтенду: очікується.
Попередньо зібраний LLVM SDK для Windows конфліктує з інструментованим кодом
(
annotate_string0 проти 1; раніше також дубльовані символи алокаторів rpmalloc/ASan). Жодну перевірку не вимкнено, щоб обійти це. - ASan лише для runtime проходить на Windows з Release-пробами,
/EHsc /fsanitize=address,/MT, бібліотекою імпорту ASan від Clang і статичним runtime-перехідником (thunk), а також із DLL ASan уPATH. - Історичні запуски на macOS arm64 (2026-09-19/20) пройшли повні збірки Debug, C++26, ASan+UBSan, лише компілятора та лише runtime для етапів синтаксичного аналізатора та проєктів; вони передують бекенду.
Історія
Стиснуто з колишніх записів для окремих кроків (оригінали в історії 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 | 74/75 | — | Базовий рівень 78/93; переповнення стека в parser_hardening пізніше виправлено стеком 8 MiB |
| 2026-09-28 | Відновлення перевірки на Windows | 75 | усі | Lizard + clang-tidy без зауважень |
| 2026-09-29 | Віха компілятора, кроки 1–46 | 103 | 182 | Лише компілятор 80, лише runtime 16, runtime ASan 16 |
| 2026-10-01 | PG1 семантична матриця та докази | 104 | — | Хеші вихідного коду зафіксовано |
| 2026-10-01 | PG2 канал збоїв | 108 | — | ABI rev 2 |
| 2026-10-01 | PG3 атоми | 109 | 189 | ABI rev 3 |
| 2026-10-01 | PG4 зв'язування з областю видимості | 111 | 191 | 26 випадків допустимості |
| 2026-10-02 | PG5 семантика зразків | 113 | 196 | 92 модулі допустимості |
| 2026-10-02 | PG6 зіставлення безпосередніх значень | 114 | 199 | 34 виклики |
| 2026-10-02 | PG7 guards для безпосередніх значень | 119 | 205 | 1,689 викликів |
| 2026-10-02 | PG8 потік керування guards | 120 | 207 | 2,075 викликів |
| 2026-10-02 | PG9 упорядковані клаузи | 121 | 208 | 1,020 викликів |
| 2026-10-02 | PG10 зіставлення в тілі | 122 | 209 | 1,666 викликів |
| 2026-10-02 | PG11 стабільна купа та корені | 123 | 213 | ABI rev 4 |
| 2026-10-02 | PG12 кортежі/списки/рядки | 125 | 221 | 4,801 виклик |
| 2026-10-02 | PG13 цілі числа довільної точності | 127 | 231 | 16,065 викликів |
| 2026-10-02 | PG14 числа з рухомою комою | 129 | 238 | 14,436 викликів |
| 2026-10-02 | PG15 maps | 131 | 244 | 8,010 викликів |
| 2026-10-02 | PG15a еталони без OTP | 118 | 244 | 14 корпусів, 49,959 значень; аудити опційні |
| 2026-10-02 | PG16 bitstrings | 120 | 253 | 8,826 викликів |
| 2026-10-03 | PG17 records на кортежах | 121 | 257 | 1,025 результатів, 29 семантичних випадків |
| 2026-10-03 | PG18 каталог guards | 122 | 257 | 81 рядок, 5,033 результати |
| 2026-10-03 | PG19 факти зв'язування | 123 | 258 | 822 результати, 976 перевірок домінування |
| 2026-10-03 | PG20 завершення | 124 | 258 | 19 корпусів, 67,634 значення, 1,969 засіяних результатів |
| 2026-10-03 | Аудит джерел OTP | 125 | 258 | Скопійовані файли OTP замінено локальними фрагментами |
| 2026-10-03 | Plan 11 step 1, базовий рівень | 125 | 258 | Див. поточний базовий рівень |
| 2026-10-03 | Plan 11 step 2, фікстури програм | 126 | 258 | Шість еталонів OTP; швидкий режим 123 тести; повний -j 16 83 с |
| 2026-10-03 | Plan 11 step 4, друк термів | 128 швидких | 265 | 9,542 еталони ~w/display; 154 скомпільовані виклики display в усіх політиках; clang-tidy запущено з одним завданням (паралельні запуски аварійно завершували інструмент на незмінених одиницях) |
| 2026-10-04 | Plan 11 step 8, засіб запуску виконуваних файлів (phase B закрито) | 138 (135 швидких) | 272 | Випадки demo, exits у восьми комбінаціях політик/драйверів; повний -j 16 235 с |
| 2026-10-04 | Plan 11 step 8I, класична купа (phase C закрито) | 144 (140 швидких) | 276 | Повний -j 16 370 с: 143/144, codegen_dependency перевищив тайм-аут 120 с під навантаженням і пройшов окремо за 29 с; Lizard-all 0 попереджень; tidy-all пройшов з одним завданням після тихого виходу інструмента з двома завданнями |
| 2026-10-04 | Plan 11 step 9, case і begin | 146 (142 швидких) | 114 змінених | Швидкий 142/142; зачеплені тести 7/7 у повному режимі; Lizard 0 попереджень; tidy пройшов з одним завданням після тихого виходу з двома завданнями |
| 2026-10-05 | Plan 11 step 10, if | 147 (143 швидких) | 114 змінених | Швидкий 143/143; зачеплені тести 8/8 у повному режимі; Lizard 0 попереджень; tidy пройшов |
| 2026-10-05 | Plan 11 step 11, генерування винятків у коді | 148 (144 швидких) | 124 змінених | Швидкий 144/144; зачеплені тести 22/22 у повному режимі; Lizard 0 попереджень; tidy пройшов |
| 2026-10-05 | Plan 11 step 12, catch Expr | 149 (145 швидких) | 277 | Швидкий 145/145; зачеплені тести 25/25 у повному режимі; Lizard 0 попереджень; tidy пройшов |
| 2026-10-05 | Plan 11 step 13, try ... of ... catch | 150 (146 швидких) | 189 змінених | Швидкий 146/146; Lizard 0 попереджень; tidy пройшов |
| 2026-10-05 | Plan 11 step 14, try ... after | 153 (149 швидких) | 2 змінених | Швидкий 149/149; Lizard 0 попереджень; tidy пройшов |
| 2026-10-05 | Plan 11 step 15, трасування стека та raise/3 | 154 (150 швидких) | 129 змінених | Швидкий 150/150; Lizard 0 попереджень; tidy пройшов |
| 2026-10-05 | Plan 11 step 16, maybe (phase D закрито) | 155 (151 швидкий) | 277 | Швидкий 151/151; повний -j 16 155/155 за 259 с; Lizard-all 0 попереджень; tidy-all пройшов |
| 2026-10-05 | Plan 11 step 18, рекурсивні графи викликів | 156 (152 швидких) | 91 змінена | Швидкий 152/152; зачеплені тести 13/13 у повному режимі; Lizard 0 попереджень; tidy пройшов |
| 2026-10-05 | Plan 11 step 19, явні фрейми та хвостові виклики | 157 (153 швидких) | 278 | Швидкий і повний CTest проходять (з випадком step 20: 154/154, 158/158); конфігурація clang-cl; Lizard 0 попереджень; tidy пройшов |
| 2026-10-05 | Plan 11 step 20, глибока рекурсія в тілі та бюджет стека | 158 (154 швидких) | 278 | Швидкий 154/154; повний 158/158; Lizard 0 попереджень; tidy пройшов |
| 2026-10-06 | Plan 11 step 21, спискові comprehensions | 159 (155 швидких) | змінені | Швидкий 155/155; зачеплені тести в повному режимі; Lizard 0 попереджень; tidy пройшов |
| 2026-10-06 | Plan 11 step 22, binary та map comprehensions (phase E закрито) | 160 (156 швидких) | усі | Швидкий 156/156; повний -j 12 160/160 за 275 с; Lizard-all 0 попереджень; tidy-all пройшов після виправлення чотирьох зауважень у новому коді |
| 2026-10-06 | Plan 11 step 23, перелік коренів, SafePoint, живі регістри | 160 (156 швидких) | 50 змінених | Швидкий 156/156; Lizard 0 попереджень; tidy пройшов |
| 2026-10-06 | Plan 11 step 26, збирання зі згенерованого коду | 161 (157 швидких) | 63 змінені | Швидкий 157/157; повний -j 12 161/161 за 107 с; Lizard 0 попереджень; tidy пройшов |
| 2026-10-06 | Plan 11 step 27, вичерпання купи після збирання | 162 (158 швидких) | 50 змінених | Швидкий 158/158; повний -j 12 162/162 за 108 с; Lizard 0 попереджень; tidy пройшов |
| 2026-10-06 | Plan 11 step 27, виправлення: без типових обмежень пам'яті | 162 (158 швидких) | 50 змінених | Повний -j 12 158/162 за 120 с, 4 codegen_failure_* виправлено очікуванням out_of_memory, потім 10/10 зачеплених; Lizard 0 попереджень; tidy пройшов |
| 2026-10-06 | Plan 11 step 27, доповнення: без обмежень на binary чи кількість процесів, --max-atoms | 164 (160 швидких) | 281 | Швидкий 160/160; повний -j 12 164/164 за 105 с; Lizard 0 попереджень; tidy-all пройшов |
| 2026-10-06 | Plan 11 step 28, копіювання графів між купами, спільні буфери поза купою | 166 (162 швидких) | 71 змінена | Швидкий 162/162; повний -j 12 166/166 за 130 с; Lizard 0 попереджень; tidy пройшов |
| 2026-10-07 | Plan 11 step 29, оновлення records | 167 (163 швидких) | 38 змінених | Швидкий 163/163; Lizard 0 попереджень; tidy пройшов; корпус records відтворюється під OTP |
| 2026-10-07 | Plan 11 step 30, record_info/2 | 168 (164 швидких) | 42 змінені | Швидкий 164/164; повний -j 12 168/168 за 119 с; Lizard 0 попереджень; tidy пройшов |
| 2026-10-07 | Plan 11 step 31B, комірки native records і CLAUSE_record_v1 (ABI 6) | 169 (165 швидких) | 283 змінені | Швидкий 165/165; повний -j 12 169/169 за 122 с; Lizard 0 попереджень; tidy пройшов після двох виправлень |
| 2026-10-07 | Plan 11 step 31C, локальні native records | 170 (166 швидких) | 285 змінених | Швидкий 166/166; повний -j 12 170/170 за 146 с; Lizard і tidy пройшли після виправлень складності |
| 2026-10-07 | Plan 11 step 31D, кваліфіковані та імпортовані native records | 171 (167 швидких) | 124 змінені | Швидкий 167/167; повний -j 12 171/171 за 129 с; Lizard 0 попереджень; tidy пройшов після трьох виправлень |
| 2026-10-07 | Plan 11 step 31E, анонімні native records (step 31 закрито) | 172 (168 швидких) | 33 змінені | Швидкий 168/168; повний -j 12 172/172 за 124 с; Lizard 0 попереджень; tidy пройшов після одного виправлення |
| 2026-10-07 | Plan 11 step 32, функціональні значення fun F/A, fun M:F/A (ABI 7) | 173 (169 швидких) | 289 змінених | Швидкий 169/169; повний -j 12 173/173 за 122 с; Lizard і tidy пройшли після виправлень складності |
| 2026-10-07 | Plan 11 step 33, замикання із захопленими змінними | 175 (171 швидкий) | 134 змінені | Швидкий 171/171; повний -j 12 175/175 за 126 с; Lizard і tidy пройшли після виправлень складності |
| 2026-10-07 | Plan 11 step 34, іменовані funs | 176 (172 швидких) | 132 змінені | Швидкий 172/172; повний -j 12 176/176 за 152 с; Lizard 0 попереджень; tidy пройшов |
| 2026-10-07 | Plan 11 step 35, динамічні виклики M:F(Args), apply/2,3, fun M:F/A під час виконання (ABI 8) | 177 (173 швидких) | 290 (змінено конфігурацію аналізатора) | Швидкий 173/173; повний -j 12 177/177 за 142 с; Lizard 0 попереджень і tidy пройшов після одного виправлення складності та трьох виправлень tidy |
| 2026-10-06 | Plan 11 step 27E, обмеження великих цілих чисел ERTS, error:system_limit | 165 (161 швидкий) | 157 змінених | Швидкий 161/161; повний -j 12 165/165 за 130 с; Lizard 0 попереджень; tidy пройшов; 21 еталон виконуваних файлів відтворюється під OTP |
| 2026-10-06 | Plan 11 step 27D, без обмежень на розмір map чи роботу з ключами | 164 (160 швидких) | 13 змінених | Швидкий 160/160; повний -j 12 164/164 за 115 с; після виправлення tidy у bit_order 35 зачеплених тестів проходять; Lizard 0 попереджень; tidy пройшов |
| 2026-10-06 | Plan 11 step 27C, обмеження арності кортежу 16,777,215 | 164 (160 швидких) | 51 змінена | Швидкий 160/160; повний -j 12 164/164 за 121 с; Lizard 0 попереджень; tidy пройшов |
| 2026-10-06 | Plan 11 step 27B, без обмежень на довжину списку чи роботу порівняння | 164 (160 швидких) | 4 змінені | Швидкий 160/160; повний -j 12 164/164 за 125 с; Lizard 0 попереджень; tidy пройшов |
| 2026-10-06 | Plan 11 step 27A, загальне обмеження пам'яті runtime і --max-heap/stack/memory | 164 (160 швидких) | 49 змінених | Швидкий 160/160; повний -j 12 164/164 за 118 с; після виправлення tidy у ProcessStack::grow 42 зачеплені тести проходять; Lizard 0 попереджень; tidy пройшов |
PG = крок плану зразків/guards (архівовано в .agents/00-finished.md).
Clause