22 октября 2026 года Anthropic вместе с компанией Theorem показала, что Claude может формально доказывать свойства безопасности уже скомпилированных программ. Главный результат: для 239 точек входа в 123 open-source библиотеках доказано, что программа не падает ни на одном входе меньше 64 МБ. Разбираем, как это устроено, что именно гарантирует такое доказательство и почему это меняет отношение к тестам, контрактам и инвариантам в коде.
библиотек из OSS-Fuzz
123
239 доказанных точек входа
граница входа
64 МБ
параметр, его можно поднять
строк доказательств на Rocq
~180 млн
около 600 тыс. на типичное
токенов у Opus 5.5
−40%
против Opus 5 на тех же задачах
Что именно доказали
Формальная верификация — это математическое доказательство того, что программа удовлетворяет спецификации на всех допустимых входах, а не на тех, которые успели проверить. Проблема всегда была в цене: доказательства писали эксперты, и длились такие проекты годами. Anthropic и Theorem проверили, может ли эту работу делать модель.
Взяли библиотеки из OSS-Fuzz — проекта Google, где популярные open-source библиотеки круглосуточно гоняются фаззерами. У каждой там уже есть точки входа для фазз-тестов. Их скомпилировали в статические бинарники под RISC-V с musl libc; медианный размер — около 18 тысяч машинных инструкций. Для каждой точки входа сформулировали теорему: программа не падает на любом входе меньше 64 МБ при любом смоделированном ответе Linux и любой раскладке памяти. «Падение» означает ошибку памяти по меркам AddressSanitizer или сработавший assert.
Доказательство пишет Claude, а проверяет его ядро Rocq — системы доказательств, которая раньше называлась Coq. Это ключевая деталь: модели не нужно верить на слово. Если в доказательстве есть ошибка, Rocq его просто не примет, как бы убедительно оно ни выглядело. За несколько недель так набралось около 180 миллионов строк доказательств на Rocq.
Поправка к популярным пересказам: Rocq, а не Verus
В русскоязычных пересказах исследования встречается утверждение, что «в основном использовался Verus для Rust». Это не так. Verus — верификатор для исходного кода на Rust, и машинный код он проверять не умеет. Главный результат про 123 библиотеки получен на RISC-V с доказательствами на Rocq.
Verus в работе тоже есть, но в отдельном примере: Claude написал интерпретатор Python на Rust и с помощью Verus доказал, что тот следует семантике CPython из академической статьи. На 1,7 миллиона случайных программ его поведение совпало с CPython в 99,95% тестов. x86 появляется в другом примере: Claude напрямую доказал, что скомпилированная под x86 реализация zlib из ядра Linux соответствует стандарту RFC 1950. Для этого он сам построил формальную семантику x86 и тщательно её протестировал.
| Эксперимент | Что проверяли | Инструмент | Итог |
|---|---|---|---|
| 123 библиотеки OSS-Fuzz | бинарники RISC-V, нет падений на входах < 64 МБ | Rocq | 239 точек входа доказаны, сотни багов |
| zlib в ядре Linux | бинарник x86 против RFC 1950 | Rocq, семантика x86 от Claude | только мелкие неэксплуатируемые баги |
| Интерпретатор Python на Rust | соответствие семантике CPython | Verus | 99,95% совпадений на 1,7 млн программ |
Почему проверяют машинный код, а не исходник
Доказательство про исходный код на C опирается на допущения: что компилятор собрал ровно то, что написано, и что неопределённое поведение языка проявится предсказуемо. Доказательство про бинарник этих допущений не требует. Оно говорит о тех инструкциях, которые процессор действительно выполнит. Ошибка компилятора или неожиданная оптимизация в таком доказательстве уже учтены.
Цена такого подхода — объём. Машинный код намного длиннее исходника, и доказательство про него тоже длинное: типичное занимает около 600 тысяч строк Rocq. Человек такое писать не стал бы. Модель может — и именно поэтому подход стал реальным только сейчас.
Что нашли по дороге
Попытки доказать спецификации выявили сотни багов. Если доказательство не сходится, причиной часто оказывается настоящая ошибка в коде. Тогда Claude исправлял её, спецификацию строили заново по исправленному коду, и доказательство продолжалось. Среди находок — переполнение счётчика вниз, чтение и запись за границами буфера, повторное открытие уязвимости CVE-2026-56132 в libexpat на глубоко вложенном входе и логическая ошибка, при которой ограничение на загрузку файлов срабатывало не всегда. Один баг пролежал в коде больше десяти лет.
Часть этих багов фаззеры почти не находят. Для одних нужен вход размером около 20 или 64 МБ, для других — больше 2 ГБ памяти или определённая последовательность вызовов. Это и есть главное отличие доказательства от тестирования: тест проверяет примеры, а доказательство — всё множество входов в заданных пределах. В отдельном опыте с читалкой PDF за неделю нашли столько уязвимостей, сколько обычно сообщают за год.
Отдельный риск — подмена задачи. Claude мог бы сделать любую теорему доказуемой, переписав программу так, чтобы она тривиально никогда не падала. Чтобы этого не случилось, любые патчи штрафовались, за доказательство того, какие входы патч меняет и как их мало, давали дополнительные баллы, а все исправления логировались и проверялись. Это тот же класс проблем, что и в разборах alignment: модель оптимизирует формальный критерий, и обвязка должна следить, чтобы она не обошла его в букве.
Почему раньше это было почти недоступно
Классический пример цены — микроядро seL4, первое ядро ОС с полным машинно проверенным доказательством корректности (2009). Само ядро — около 8 700 строк C и 600 строк ассемблера — написали примерно за 2,2 человеко-года. Доказательство заняло около 200 тысяч строк в Isabelle и порядка 20 человеко-лет вместе с инструментами и исследованиями, из них около 11 — на доказательство самого seL4. Anthropic в своей публикации округляет это до «два года на ядро и двадцать на доказательство».
Поворот предсказывали. В декабре 2025 года Мартин Клеппман, автор книги «Высоконагруженные приложения», написал, что ИИ сделает формальную верификацию массовой. Его довод: главный барьер — цена доказательства, а у доказательства есть уникальное свойство: проверяющая программа отбрасывает правдоподобные, но ошибочные рассуждения. Значит, работу можно отдать модели, которая иногда ошибается, а доверять проверяющему. Публикация Anthropic — первое крупное подтверждение этого прогноза на реальном коде.
Доказательства дешевеют вместе с моделями
Пока это дорого: одно доказательство может стоить сотни миллионов токенов. Но динамика понятна. На бенчмарке из 36 задач на коде OSS-Fuzz Claude Opus 5.5 доказывает половину задач, тратя примерно на 40% меньше токенов, чем Opus 5. Когда несколько агентов работают с общим хранилищем доказательств и переиспользуют леммы друг друга, им нужно на 17% меньше токенов, а два доказательства в одиночку агенты не осилили вовсе.
Что гарантирует «формально проверено»
Авторы прямо пишут: «формально проверено» не значит «без багов». Доказательство верно ровно настолько, насколько верны слои, на которые оно опирается. Нужно доверять формулировке теоремы, семантике RISC-V и процесса Linux, которую построила Theorem, ядру Rocq, а под ним — компилятору OCaml, операционной системе и железу. Если реальная машина делает то, чего нет в модели, доказательство об этом промолчит.
Есть и границы самого утверждения. Доказательства касаются однопоточных статических бинарников RISC-V с musl, а большинство людей запускает эти библиотеки на x86 или ARM с glibc и динамической линковкой. AddressSanitizer ловит не все ошибки памяти. Доказаны конкретные точки входа, а не вся библиотека. Вызывающий код, который использует библиотеку неправильно, всё ещё может испортить память — чтобы закрыть этот пробел, нужны обязательства для каждой функции, то есть предусловия.
Контракты и инварианты: от тестов к доказательствам
Самый интересный вывод для обычного разработчика касается не RISC-V, а того, как писать код. Ещё в 1992 году Бертран Мейер описал контрактное программирование (Design by Contract): у функции есть предусловия — что должен гарантировать вызывающий, постусловия — что гарантирует сама функция, и инварианты — что остаётся истинным всё время. Мейер встроил контракты в язык Eiffel. Позже появились Dafny, где верификатор проверяет код прямо во время набора, и Verus для Rust.
Контракт — это и есть спецификация, которую можно доказывать. Когда инварианты записаны явно и формально, задача модели меняется: вместо «проверь, что код правильный» она получает чёткое утверждение, которое можно доказать или опровергнуть, а проверяющая программа подтвердит результат. Чем формальнее контракт, тем ближе рассуждение модели к настоящему доказательству. Вот так выглядит контракт в Verus:
use vstd::prelude::*;
verus! {
// Contract: what the caller may rely on, checked for every input
fn max(a: u64, b: u64) -> (r: u64)
ensures
r >= a,
r >= b,
r == a || r == b,
{
if a >= b { a } else { b }
}
} // verus!Здесь три строки ensures — постусловия. Verus доказывает их для всех возможных пар a и b, а не для десятка примеров из теста. Если по ошибке написать a <= b вместо a >= b, функция начнёт возвращать меньшее число, проверка не пройдёт и покажет, какое условие нарушено.
Важная оговорка к популярному тезису «теперь код не тестируют, а доказывают». Сама Anthropic так не утверждает. Точки входа взяты из фазз-тестов, «падение» определено через AddressSanitizer, а собственную семантику x86 модель тщательно тестировала. Рассуждение модели об инвариантах без проверяющей программы — это не доказательство, а правдоподобная аргументация, которая может ошибаться. Сила подхода именно в связке: модель пишет, машина проверяет. Тесты при этом остаются нужны, потому что спецификация сама может быть неверной.
- Записывайте предусловия и постусловия явно — сначала хотя бы как assert, а для критичного кода — на языке верификатора.
- Держите инварианты структур данных и циклов в коде, а не в голове: «длина не превышает ёмкости», «список отсортирован», «баланс не отрицателен».
- Делайте функции маленькими и с узким контрактом: короткое доказательство модель найдёт быстрее и дешевле.
- Избегайте разделяемого изменяемого состояния там, где хотите гарантий: на многопоточный код сегодняшние доказательства не распространяются.
- Не позволяйте модели менять спецификацию ради того, чтобы доказательство сошлось. Изменения контракта проверяет человек.
Что можно попробовать уже сейчас
Theorem открыла сервис oss-verify: для подходящих open-source проектов он бесплатен, требует статических бинарников riscv64 и доказывает отсутствие падений на любом входе до 64 МиБ. Прогон может занять несколько дней. Доказательства из публикации, семантика RISC-V и процесса Linux и навык для Claude, который помогает добавить свой проект, выложены на GitHub. Для собственного кода порог входа ниже, чем кажется: Verus и Dafny работают локально, а писать контракты и доказательства к ним можно вместе с Claude Opus 5.5 через API Kumo.
Частые вопросы
- Значит ли это, что 123 библиотеки теперь без багов?
- Нет. Доказано отсутствие падений для 239 конкретных точек входа на входах меньше 64 МБ, для однопоточных статических сборок RISC-V с musl и в рамках смоделированного поведения Linux. Доказательства относятся к исправленным версиям кода. Логические ошибки, которые не приводят к падению, и ошибки за пределами этих допущений не исключены.
- Каким инструментом пользовались — Verus или Rocq?
- Основной результат получен в Rocq на машинном коде RISC-V. Verus, верификатор для Rust, использовали в отдельном примере с интерпретатором Python. x86 — в примере с zlib из ядра Linux.
- Почему доказательству модели можно доверять, если модели ошибаются?
- Потому что доверие лежит не на модели, а на ядре проверки Rocq. Модель может ошибиться сколько угодно раз, но неверное доказательство ядро не примет. Доверять приходится формулировке теоремы, семантике машины и самому проверяющему.
- Тесты больше не нужны?
- Нужны. Спецификация может быть неполной или неверной, допущения о среде могут не совпадать с реальностью, а доказательства пока покрывают узкий класс свойств. Сама Anthropic опиралась на фазз-тесты как на точки входа и тестировала семантику, которую строила модель.
- Сколько это стоит?
- Долларовых цифр в публикации нет. Известно, что одно доказательство может занимать сотни миллионов токенов, а вся работа заняла несколько недель. Цена падает: Opus 5.5 тратит примерно на 40% меньше токенов, чем Opus 5, на тех же задачах.
Источники
- Anthropic и Theorem: LLM делают формальную верификацию возможной в гораздо большем масштабе, 22.10.2026
- Theorem: сервис oss-verify
- Доказательства из публикации на GitHub
- Семантика RISC-V и процесса Linux на Rocq
- Klein и др., seL4: Formal Verification of an OS Kernel, SOSP 2009
- Мартин Клеппман: ИИ сделает формальную верификацию массовой, 08.12.2025
- Verus — верификатор для Rust
- Бертран Мейер: Applying Design by Contract, IEEE Computer, 1992
- Dafny — язык с встроенной верификацией