研究速報 Anthropic 研究 · 2026 年 10 月 22 日發表 · 與初創公司 Theorem 合作 · 約 3 分鐘讀完

Claude 寫數學證明,
證明程式唔會死機

以前要證明一段程式「點都唔會死機」,專家要花好多年。今次 Claude 幾星期內做咗 123 個程式庫。

TL;DR 先睇結論

Anthropic 將現有嘅隨機測試,改寫成一條數學命題。再叫 Claude 寫出證明。證明由獨立檢查器 Rocq 逐行驗算,呃唔到人。

結果係 239 個測試入口、123 個開源程式庫,被證明喺任何 64 MB 以下嘅輸入都唔會死機。寫證明途中,Claude 仲捉到幾隻潛伏多年、隨機測試一直撞唔到嘅蟲。

但記住最重要一句:「形式化驗證」唔等於「冇蟲」。證明只覆蓋一個好窄嘅範圍,下文會講清楚。

⏱ 60 秒圖解摘要(撳開)▼
1舊方法:亂試不停餵隨機資料畀程式。撞到死機就係搵到蟲。撞唔到,唔代表冇蟲。
2新方法:出題將測試改寫成命題——「任何 64 MB 以下嘅輸入都唔會死機」。
3Claude 做證明Claude 寫一份數學證明。一份通常有成 60 萬行。
4Rocq 改卷檢查器逐行驗算。錯一行,成份唔合格。冇得靠估。

一句講晒:由「試極都試唔晒」,變成「用數學一次過證明晒」——但只限證明寫明嗰個範圍。

1

舊方法:不停亂試,撞到算好彩

業界一直靠一種測試方法,叫 fuzzing。可以譯做「隨機亂入測試」。

做法好直接。程式開一個入口。測試引擎不停製造隨機資料,塞入去。

邊一份資料令程式死機,嗰份就係證據。證明程式有一隻蟲。

呢個方法好有用。Google 嘅 OSS-Fuzz 計劃就係咁捉蟲,行咗好多年。

但佢有一個死穴。輸入嘅可能性係無限嘅。你試一萬次、一億次,都只係試咗其中一小撮。

所以邏輯係咁:撞到死機,證明有蟲。撞唔到,只係證明你未撞到。

自己試下:點解亂試會漏咗隻蟲?

下面條軌係「輸入大細」由 0 到 64 MB。有一隻蟲,要大約 20 MB 嘅罕見輸入先觸發到。而一般 fuzzing 工具,餵嘅輸入通常細過 1 MB。

🐛 蟲喺 20 MB 處
0 MB輸入大細64 MB
已試次數:0 撞到死機:0 次 掂到隻蟲:未

撳下面粒掣,開始亂試。

試幾多次都好,隨機輸入集中喺左邊細輸入區。20 MB 嗰隻蟲,永遠冇人掂過。呢隻蟲唔係假設——係今次研究真係搵到嘅,下文會講。

2

新方法:將測試變成數學題

Anthropic 冇掉棄舊測試。佢哋將舊測試「翻譯」成一條數學命題。

原本嘅 fuzz 測試問:「隨機試,會唔會死機?」新命題問嘅係另一回事:

「對於任何一個細過 64 MB 嘅輸入,呢個程式都唔會死機。」

「任何一個」係關鍵。證明咗呢句,意思係所有輸入一次過搞掂。唔使再逐個試。

成個流程係咁:

🎲① 現成 fuzz 測試

程式庫本身已有嘅測試入口,唔使重新發明「咩叫啱」。

➜
📐② 變成數學命題

程式編譯成 RISC-V 指令,再寫成一條要證明嘅命題。

➜
🤖③ Claude 寫證明

Claude 針對機器指令逐行推理,寫出成份證明。

➜
✔️④ Rocq 逐行驗算

獨立檢查器 Rocq 改卷。證明啱唔啱,唔係 Claude 自己講,要過到檢查器。

點解以前冇人咁做?因為證明大得驚人。證明通常比原程式大好多倍,又要極專門嘅人手。

經典例子係 seL4 作業系統核心。人手寫個核心用咗 2 人年。驗證佢,用咗 20 人年。

而家唔同咗。寫證明呢種「量大、目標清晰」嘅苦工,正正係 AI 最擅長嗰種工。

3

成果:幾星期,123 個程式庫

成個過程只係幾星期。Claude 先修補途中搵到嘅蟲,再完成證明。

239
個測試入口被證明唔會死機
123
個開源程式庫(來自 Google OSS-Fuzz)
1.8 億行
證明合共嘅 Rocq 程式碼行數
60 萬行
典型一份證明嘅長度
18,000 行
被覆蓋程式嘅中位數長度(以 RISC-V 指令計)
64 MB
證明覆蓋嘅輸入上限:以下全部包晒

1.8 億行證明,冇人會逐行睇。亦唔需要。因為 Rocq 檢查器會驗算每一行。

人要睇嘅,只係最後嗰部分——「到底要信啲乜」。呢點去到第 5 節會講。

4

寫證明途中,順手捉到陳年蟲

證明寫唔通,通常即係程式真係有蟲。Claude 就自己修補埋,再繼續證明。

有幾隻蟲特別值得講。佢哋有個共通點:fuzzing 行咗幾年、試過以兆計次,都冇撞到。

蟲一 · 罕見大輸入

解壓縮計數器出錯

一個解壓縮程式入面,有個計數器會「減過龍」。結果係寫入越界記憶體。

但觸發條件極刁鑽:要大約 20 MB 輸入,仲要係一種罕見排版。隨機測試餵嘅通常細過 1 MB,所以永遠撞唔到。

蟲二 · 已知漏洞編號

libexpat 嘅 CVE-2026-56132

XML 解析庫 libexpat 有一隻已編號嘅漏洞。觸發佢要輸入巢狀得好深。

Claude 喺證明過程中重新發現咗佢。呢類「要好深、好特定結構」嘅輸入,正係隨機亂試最弱嘅地方。

額外證明一 · 規格符合

Linux 核心 zlib 符合 RFC 1950

Claude 先將 RFC 1950 技術文件寫成正式規格。再證明 Linux 核心入面嘅 zlib 實作,真正跟足份規格。

呢次證明唔止「唔死機」,而係「行為正確」。

額外證明二 · 行為一致

Rust 版 Python 直譯器

Claude 用 Rust 寫咗一個 Python 直譯器,再證明佢跟 CPython 嘅語義。

實測跑咗超過 170 萬個隨機 Python 程式。有 99.95% 行為同 CPython 完全一致。剩低嘅係已知嘅邊角情況。

換句話講,就算最後證明唔成,「嘗試證明」本身已經係一部強力捉蟲機。

5

最重要嘅提醒:證明唔等於冇蟲

呢一點係 Anthropic 自己寫明嘅。唔係外界挑剔。

⚠️ 「形式化驗證」≠「冇蟲」

證明只保證一件事:喺證明寫明嘅條件底下,程式唔會死機。條件以外,證明咩都冇講。

而今次嘅條件,同你日常用嘅環境,有一段距離:

證明入面嘅世界

單線程運行。靜態連結(用 musl libc)。RISC-V 處理器。固定記憶體上限。Linux 進程模型。

現實世界

大多數人用 x86 或 ARM 處理器。動態連結 glibc。多線程好常見。環境複雜得多。

仲有兩點要留意。第一,唔係每個測試入口都證明咗,證明唔到嘅只係公開咗命題,未有結論。第二,就算入口全部證明晒,都唔等於成個程式庫每個角落都覆蓋到。

咁到底要信啲乜?Anthropic 話,成件事最終只需要信任四樣嘢:

  • RISC-V 模型對處理器行為嘅數學描述,要同真晶片一致
  • Linux 進程模型對系統行為嘅數學描述,要同真系統一致
  • 命題本身證明嗰句說話,要真係你關心嗰句
  • Rocq 檢查器改卷嗰個工具,自己唔可以出錯

好處係:要檢查嘅範圍,由「成個程式庫每一行」縮到呢四樣。而且無論證明幾多個程式,呢四樣都唔會變大。

6

業界點睇

反應普遍正面。大家留意到一個轉變:

樽頸由「寫證明好難」,
變成「檢查只係運算」。 寫證明要天才加年月;驗算證明,只需要電腦時間。

即係話,最難嗰部分——寫——而家有 AI 代勞。剩低嘅驗算,係機器嘅事。

但幾乎每個討論都會補返同一句:範圍限制要睇清楚。RISC-V、單線程、靜態連結,呢啲字眼唔係細節,係證明嘅邊界。

Anthropic 自己嘅講法都一致:呢個係起點,唔係終點。方向係將模型擴展到更多架構、更接近真實部署嘅系統。

一句記住

Claude 唔再靠「撞彩」捉蟲,而係寫出數學證明,等檢查器驗算——但證明保邊度,就只保邊度。

資料來源

本頁為 ELI5 解說,數字與說法以 Anthropic 官方文章為準。Anthropic 每週研究速報 · 2026-10-26。