跳到正文
参考文档 / ZLIB × LEAN

早期论证与参考来源

此页源文件快照 · 911099fbe671bb07 · 对应提交的原文 ↗

主要参考快照为 zlib-formal 的 0f1428677ebf5b1614ff77f4702bbb382b2bf3c6。参考审查阅读过其源代码和审计文档,没有重新构建快照,也没有在本仓库建立其结果。这里是复用记录;进度负责当前工作,检查指南定义验收。

借鉴的思路

阅读这份索引时,先用中间一列找需要的论证,再用左列定位旧来源,最后看右列的适用边界。路径和声明名保持原样,是为了能跳到实际定义;它们不是要求读者预先掌握的算法术语。后面的函数族表也按“可复用内容 → 当前落点”提供检索。

参考来源 此处的改编 边界
Spec/Api/InflateApi.lean:Call, exec ZlibF/Spec/Public/Calls.lean 中封闭的公开调用集合与直接分派 入口覆盖不证明每个入口或调用序列
translation_map.py 清单检查公开名称、定义文件与手册章节 不是完整的预处理后语法比较
check_imports.py 检查传递根导入闭包与缺失源文件 模块位于闭包不表示它证明了公开目标
final_check.sh 区分开发检查、规范就绪和最终验收 快速构建不等于最终验收
Spec/crc32.lean, Spec/adler32.lean 独立的位/寄存器及模和校验规范 保留非规范种子与独特的单字节 Adler 行为
check_axioms.py 拒绝空/重复登记表;避免被优化禁用的检查;审查已登记名称之外的声明 仅登记不能验证声明定义域或翻译忠实性
Witness/, CONTRACT_AUDIT.md 在序列目标旁增加初始化定义域目标与非空泛性要求 实际初始化必须建立调用所用的同一个不变量

表中路径相对于参考仓库的 lean/ 目录。下表映射函数族与改变的表示。

不能直接迁移的部分

参考堆使用带类型单元和字节块;当前堆使用对象记录与表。堆声明和证明项需要适配。纯算术、位流关系、循环度量和分解,只有比较其定义与定义域之后才能保留含义。

参考序列定理 Zlib.Api.seq_safe 将 ApiContract 作为假设。其契约审计记录过假前置条件实例与错误策略契约。调用集合与归纳结构有价值,但条件序列定理不能在这里建立安全:每个库内被调用函数需要关于实际翻译的定理,实际初始化必须建立不变量。不相关的见证不能补足这一连接。

参考仓库的 ub.patch 政策及启用补丁不同,其构建配置和证明状态不会自动迁移。本仓库验证自己的上游固定版本与已审查补丁,采用自己的公开定义域和验收规则。

flowchart LR
    R[固定参考版本] --> M[提取数学与论证结构]
    M --> T[针对当前源代码与堆重新陈述]
    T --> K[内核检查、审计与变异]
    K --> C[仅接受本仓库的证据]

下表用于定位可复用论证族。组件证明指南解释当前论证结构。参考链接与历史测试报告都不属于新的验证运行。

复用早期论证

旧堆使用带标签单元和字节块,当前堆使用记录与对象表。纯论证只有在定义和定义域一致后才能迁移。堆级证明需要新的执行、帧性质和所有权论证。早期对被调用函数契约的假设不能替代实际翻译后函数的定理。

Deflate 引擎来源

来源族 数学或操作内容 当前源代码族
EngineChains 滚动哈希在三次更新后遗忘旧值;掩码键界限;键与前两个字节相同时第三字节一致 deflate.c.engine.hash
EngineChains, Spec/deflate/Engine 环槽算术;链可达性;插入/滑动保持;链位置递减 deflate.c.engine.chains
EngineFillSlide, EngineFill 滑动阈值、读取数、插入数、high_water 和不相交滑动复制范围 deflate.c.engine.window
EngineMatch, matchChain_spec, innerLoop_spec 首个不匹配、每轮八次比较、最大长度 258 与结果限幅 deflate.c.engine.match, .lminner, .lmcond, .lmbody, .lmmain
PendingPut, DeflatePut, Hash, LmInit 待输出字节顺序、哈希更新、插入存储与清除 deflate.c.engine.macros
EngineSlide 每个哈希项变为 m >= w_size ? m - w_size : 0;准确帧性质 deflate.c.engine.slide
EngineReadBuf 复制 min(avail_in, size) 字节,推进入口计数并更新所选校验和 deflate.c.engine.readbuf
PendingFlush 刷出树位、复制待输出字节、推进输出计数并重设空 pending 指针 待输出字节复制与树位缓冲证明

Deflate 生命周期来源

早期来源 保留内容 当前源代码族
Inv, Inv7, Heap 回指针、缓冲区分离、范围、存储保持与帧性质 deflate.c.base
StateCheckQuick, End 空指针与无效流拒绝;准确状态检查结果 基础检查引理
TuneQuick, HeaderQuick, UsedQuick, PendingQuick, Simple 四项调优写入;仅 gzip 的头存储;可选输出写入;待输出计数溢出 deflate.c.life.check
Bound 包装长度、extra_len 低 16 位、终止字符串与界限算术 deflate.c.life.bound,包括 boundTail、WrapLen
InitParams, Init* 参数规范化、二的幂、缓冲区大小与配置表范围 支持初始化的算术和基础不变量
End 精确依赖状态的结果、五次释放和流状态指针清除 deflate.c.life.end
LmInit, Reset*, ResetTr 哈希清除、调优表、计数器、包装状态与树重设 deflate.c.life.reset
InitFail*, InitOk*, InitMem, InitFresh 每次失败分配及其清理;准确成功状态 初始化论证结构
Prime*, PrimeArith 移动待输出字节;保持其位值;追加请求的低位 位预置算术与执行分解
Copy* 拒绝、失败清理、独立缓冲区与重定向树指针 复制论证结构
DictGet, GetDictQuick 返回窗口末尾的 min(strstart + lookahead, w_size) 字节 deflate.c.life.getdict

Inflate 来源

早期族 内容 当前源代码族
natBits, bytesBits,移位与掩码引理 低位列表、字节追加、丢弃位和格式位序 inflate.c.main.bits
InflateBits PULLBYTE, NEEDBITS, BITS, DROPBITS, BYTEBITS, INITBITS;保持已存位后接未读字节的关系 inflate.c.main.macros
InflateTopLoop, InflateLoop 递减度量与每个循环退出 inflate.c.main.xloop
SpecStored, SpecStoredCopy, Copy* 存储长度/补码检查与原样复制字节 inflate.c.main.stored, .stored2
InflateHead, InflateHdr*, InflateName 头检查、字段长度、可选头写入与 CRC 模式论证与头部算术
InflateTable, InflateTables, InflateCodeLens* 动态计数、码长顺序、重复与表安装 inflate.c.main.table 至 .table6;见配套记录
InflateLen*, InflateDist*, InflateMatch* 慢速查找、子表、距离检查与窗口/输出复制 符号、查找与复制论证结构
InflateCheck, InflateCheckStep 总计、校验和更新与尾部比较 inflate.c.main.check0, .check
InflateCases1, InflateUpd, InflateFixed 简单模式、分派、拒绝与固定表选择 simple/type 模块和固定表定理
infLeave_ok, leaveTail_ok, updatewindow_frame 寄存器回写、窗口更新、计数器与返回码规则 收尾组合论证

表与尾部来源

早期来源 可复用论证 当前源代码族
InflateTables(约 1,161 行) 在读取三比特码长的 LENLENS 阶段,ncode 是要读的组数,have 是已读组数,available_bits 是当前可用位数;一次读取 min(ncode - have, available_bits / 3) 组;顺序排列、lensRead、lensZero、Good3;读取和补零循环 inflate.c.main.table 至 .table6
InflateCheck, InflateCheckStep 输出总计、校验和更新与字节交换后的 zlib 比较 inflate.c.main.check0, .check
InflateBits 补充/消费位,不改变所表示流 共享 inflate.c.main.macros 结果

回调来源

早期族 可复用内容 当前源代码族
初始化检查与分配 版本、大小与参数拒绝;内存失败;成功时准确写入字段 infback.c.init
End 与入口退出 无效流/状态拒绝;释放状态并清除指针 infback.c.end, .back
首次输入耗尽 in 未提供字节、缓冲区错误、恢复输入字段、不调用输出回调 infback.c.back
回调契约与见证 自有块集合和局部不变量;具体已初始化示例 infback.c.callbacks
输入宏 补充/消费位、回调转移与剩余输入度量 infback.c.pull, .macros 及共享 inflate 位引理
输出空间与窗口写入 将满窗口交给 out,保持先前输出并扩展输出视图 infback.c.room, .stored
TYPE、固定表与错误模式 最终块判断、块类型、固定表字段与错误消息 infback.c.inv 和 inflate_fixed_ok
存储块与码长顺序 对齐、补码检查、有界分段复制;顺序排列 infback.c.pure, .stored
动态表与慢速查找 计数、重复、构造调用及规范根/子表一致性 需对当前表语义重新陈述的早期论证结构
分派与离开 下降循环度量、最终输出回调、准确结果与输入回写 当前循环规则和组合论证

Gzip 来源

早期族 可复用内容 当前源代码族或边界
Basic 字段布局与标签 由记录访问和流引用替代
Simple 缓冲设置、EOF、tell、错误查询和整数限制 gzlib.c.simple
Error, ErrorMsg 释放旧消息、存储码、分配并格式化 path: text、分配失败 gzlib.c.error 覆盖空消息路径;格式化消息需要准确格式化语义
Reset, Rewind 重设字段和错误、拒绝规则、文件定位与按输入修正偏移 gzlib.c.error, .rewind
SeekParts, SeekRaw, SeekFwd, SeekBack, SeekTail, SeekMain, SeekCor 目标算术与 raw、向前、向后分支 gzlib.c.seek
SeekNeg, SeekNegUb, SeekFault, SeekWitness 负位置与有符号溢出路径 条件性的准确故障引理,不是公开安全定理
OpenMode, OpenParts, OpenRest 模式字符折叠与遇到 + 时清理 parseMode 和打开论证结构
OpenPath, OpenDesc, OpenFinish, OpenEff*, GzopenEff*, Dopen* 路径复制、描述符标志、追加/截断效果与失败清理 准确格式化、文件效果和所有权必须组合
Close, Dispatch 读/写分派和存活块核算 gzclose.c;实际读/写清理属于各自文件

历史短距离检查

旧记录报告过一次实验,检查快速路径前可能缺少 whave 更新的疑点。raw 固定 Huffman 流使用一至三个字面量,随后接长度三、距离一至四的匹配。矩阵包括:至少六个输入字节、258 字节输出空间的快速调用;输入每次只给一字节;以及使用新输出缓冲区的两次调用解码。记录报告路径一致、出现预期的“invalid distance too far back”错误,且运行时检测器没有发现问题。

实验只对这些普通 inflate 情形反驳了候选问题,未覆盖长距离、完整或环绕窗口、其他窗口大小或回调解码器。它是历史测试证据,不是内核证明,也不是本次重新执行的验证。

证据边界

早期审查记录过 8000 次随机压缩会话,使用运行时检测器与往返比较。变化包括级别、策略、内存级别、包装、最小一字节输出块、刷新模式、参数改变和复制。记录报告这些会话中无不一致或运行时检测器诊断。该运行不包含字典设置、位预置、自定义 gzip 头,也排除了单字节窗口的 stored 路径。

这些观察不证明全部输入的安全、初始化历史、共享存储容量、其他配置或上述 C 假设。聚焦且可复现的证据应与其回归放在一起。验收规则属于检查指南,进度记录当前未解决项与证明验收。

历史 gzip 定位观察

早期记录报告:读取五字节到 EOF,再从当前位置向前定位五字节。Seek 返回十,而 tell 仍为五。其解释是向前定位保留 past;旧抽象关系却要求目标位置并清除该标志。本次修订未重新执行此实验。该源代码路径的操作细化尚未完成,记录只保留这次历史观察。

ZLIB × LEAN

全局目录

当前位置早期论证与参考来源