跳到主要内容

诊断码速查表

Zero 编译器发出的所有稳定诊断码的快速参考表。使用 zero explain <code> 获取更详细的指导。

如何阅读诊断信息

运行 zero check --json 获取结构化诊断输出:

{
"schemaVersion": 1,
"ok": false,
"diagnostics": [
{
"severity": "error",
"code": "NAM003",
"message": "unknown identifier 'message'",
"path": "examples/hello.0",
"line": 2,
"column": 27,
"length": 7,
"expected": "visible local, parameter, function, or builtin",
"actual": "no visible symbol named 'message'",
"help": "declare the name before using it",
"fixSafety": "behavior-preserving",
"repair": {
"id": "manual-review",
"summary": "Inspect the diagnostic fields and choose a repair manually."
},
"related": []
}
]
}

每条诊断信息包含:code(稳定标识符)、message(出了什么问题)、位置信息(pathlinecolumn)、expected/actual(不匹配详情)、help(建议修复方案)和 fixSafety(自动化标签)。

修复安全标签

修复方案附带安全标签,帮助 Agent 和工具判断是否可以自动应用:

标签含义
format-only仅修改格式,不影响行为
behavior-preserving保持程序行为不变,可安全应用
local-edit限于当前局部作用域或文件
api-changing会改变函数签名、导出名称、包 API 或调用点
requires-human-review有风险或存在歧义;展示方案但不自动应用

代码参考

PAR - 解析器

CodeMessageMeaningFix
PAR100parser syntax failure缺少花括号、逗号,或类型参数列表格式错误等语法错误检查指示的 token 及周围结构;添加缺少的分隔符或修正语法

NAM - 名称

CodeMessageMeaningFix
NAM003unknown identifier在当前词法作用域中使用了未声明的名称在使用前引入局部绑定、参数或导入
NAM004duplicate name / arity mismatch重复的名称、错误的调用参数数量,或泛型类型名遮蔽重命名重复项、修正参数数量或移除遮蔽声明

TYP - 类型

CodeMessageMeaningFix
TYP002type mismatch赋值、字面量、返回值或类型默认值中的类型不匹配确保表达式与预期类型匹配;添加显式转换或标注
TYP009mutable storage required可写字节辅助函数(如 std.mem.copy)需要可变存储将目标绑定的 let 改为 var
TYP010condition must be Bool条件表达式不是 Bool 类型使用布尔表达式或比较运算符
TYP011null requires Maybe contextnullMaybe<T> 上下文之外使用Maybe<T> 包装或提供带类型的默认值
TYP012break outside loopbreak 在没有外层循环时使用break 移到循环体内部或重构控制流
TYP013continue outside loopcontinue 在没有外层循环时使用continue 移到循环体内部或重构控制流
TYP014non-integer loop bounds范围循环的边界必须是整数兼容类型为循环范围使用整数表达式
TYP015invalid integer literal整数字面量使用了无效的数字、分隔符、进制前缀或后缀修正字面量格式;使用有效的数字和可选进制前缀(0x0b0o
TYP016integer overflow整数字面量超出预期的原始整数宽度使用更宽的类型或减小字面量值
TYP017invalid castas 转换仅限于原始数值类型和字节 char 类型仅在兼容的数值类型之间转换
TYP018invalid char literal字符字面量必须包含恰好一个字节或支持的字节转义使用单个字符或转义序列如 \n\t\\
TYP019invalid float literal浮点字面量必须使用 digits "." digits 格式,可选指数添加小数点;例如用 1.0 代替 1
TYP020float overflow浮点字面量超出预期的原始浮点宽度对较大值使用 f64 或减小字面量
TYP021unsupported indexing target对不支持的目标进行索引、切片或索引赋值使用支持的数组、切片或可索引类型
TYP022non-integer index索引表达式和切片边界必须是整数为索引和边界使用整数表达式
TYP023generic arity mismatch泛型调用类型参数数量不匹配,或在非泛型函数上使用了类型参数匹配类型参数数量;从非泛型调用中移除类型参数
TYP024conflicting generic inference泛型推断为同一类型参数找到了冲突的具体类型使参数一致或传递显式类型参数
TYP025inference failure无法从局部调用参数推断泛型类型参数传递显式类型参数:fn<Type>(args)
TYP026cyclic type alias类型别名重复、格式错误或循环将别名指向具体类型或移除循环
TYP027recursive generic mutation递归泛型调用改变了类型参数确保递归调用使用一致的类型参数

BOR - 借用

CodeMessageMeaningFix
BOR001borrow conflict词法借用冲突;JSON 中的 borrowTrace.activeBorrows 包含每个借用根的详细信息重新排列借用顺序、缩小借用范围或克隆值
BOR002reference escape引用来源逃逸,包括从调用返回的引用或通过可变参数存储的引用返回拥有的值而非引用,或重构以避免逃逸

OWN - 所有权

CodeMessageMeaningFix
OWN001use after move拥有的值在移动后被使用,或泛型容器拥有无约束的泛型负载移动前克隆、重新排列使用顺序或在适当处使用引用

ERR - 错误流

CodeMessageMeaningFix
ERR002missing error in set调用者的显式错误集缺少被调用者抛出的错误将缺失的错误添加到 raises 集合:raises [NotFound, Io, ...]
ERR003unchecked fallible call可失败的调用未使用 checkrescue添加 check 传播错误,或添加 rescue 本地处理

TAR - 目标

CodeMessageMeaningFix
TAR001unknown target请求的目标名称不在 zero targets 列表中使用 zero targets 检查可用目标并使用有效名称
TAR002missing capability选定的目标不提供程序所需的能力为具有所需能力的目标构建,或使用目标特定的入口点

IMP - 导入

CodeMessageMeaningFix
IMP001unknown import未知的包本地导入路径检查导入路径;使用修复 id fix-import-path
IMP002import cycle包本地导入形成循环重构导入以打破循环
IMP003duplicate export导入的模块之间存在重复的公共导出重命名或移除其中一个冲突的导出

PKG - 包

CodeMessageMeaningFix
PKG001missing zero.json本地包依赖路径不包含 zero.json确保依赖目录包含有效的 zero.json 清单文件
PKG002package cycle包依赖形成循环重构依赖以打破循环
PKG003version conflict一个包名解析到冲突的版本在清单之间对齐依赖版本
PKG004unsupported target包依赖不支持所选目标使用兼容的目标或寻找替代依赖

IFC - 接口

CodeMessageMeaningFix
IFC001unknown constraint接口约束未知,或具体类型参数没有静态类型体导入接口或提供具有所需静态体的类型
IFC002missing method受约束的具体类型缺少所需的静态接口方法在具体类型上实现所需的方法
IFC003wrong parameter count具体静态方法的参数数量与接口不匹配匹配接口方法签名的参数数量
IFC004wrong return type具体静态方法的返回类型与接口不匹配匹配接口方法的返回类型
IFC005wrong parameter type具体静态方法的参数类型与接口不匹配匹配接口方法的参数类型

STC - 静态值

CodeMessageMeaningFix
STC001unsupported static type静态值参数使用了不支持的非整数类型为静态值参数使用整数类型
STC002non-literal static arg静态值参数不是整数字面量或确定的顶层常量使用整数字面量或顶层 const
STC003static value conflict显式静态值参数与带标注类型携带的值冲突移除显式参数或调整类型标注

其他

CodeMessageMeaningFix
BLD002bad manifest错误的项目清单或不支持的清单目标格式修复 zero.json 清单结构或移除不支持的目标配置
ABI001unsupported C ABI不支持的 C ABI 导出或 extern 布局使用支持的 ABI 兼容类型;检查 extern 声明
CIMP003host path leak外部目标 C 依赖会使用主机 include/库路径或主机 pkg-config使用包相对的 vendor 头文件/库或配置目标 sysroot
CIMP004missing C functionextern C 调用引用了导入头文件中缺失的函数或使用了不支持的 C ABI 类型确保函数在头文件中声明;使用兼容的 C 类型
CIMP005missing C link planextern C 调用缺少匹配的 C 链接元数据或使用了不安全的系统库名称zero.json 中添加匹配的 c.libs.* 条目,包含 headerslib/link
SHM001inference failure泛型类型方法调用无法推断继承的类型/静态参数传递显式类型或静态参数
SHM002conflicting Self泛型类型方法的参数暗示了冲突的 Self 实例化确保参数同意同一个 Self 类型
RCV001unknown method接收者风格的调用引用了未知方法或无 self 的静态方法检查方法名;对接收者调用使用实例方法
RCV002addressable receiver接收者风格的调用需要可寻址的接收者,或 mutref<Self> 需要可变接收者使用变量绑定作为接收者;对可变接收者使用 var
FLD001unknown field类型字面量包含未知字段移除该字段或检查类型定义
FLD002missing required field类型字面量遗漏了没有默认值的必需字段添加必需字段并赋值
MEM001malformed Maybe格式错误的内存类型形式,如 Maybe 缺少必需的类型参数添加类型参数:Maybe<T>
MEM002unguarded Maybe readMaybe<T>.value 的读取未通过可见的 .has 守卫证明存在在读取 .value 前添加 .has 守卫、checkrescue
MET001unsupported meta解析的 meta 表达式请求了尚不支持的编译时行为避免不支持的 meta 表达式;使用运行时替代方案
PUB001missing API metadata公共声明遗漏了必需的显式 API 类型元数据添加显式类型标注:pub const name: Type = value
MAT004payload mismatchmatch 分支只能为携带负载的 choice case 绑定负载将负载模式与携带负载的 case 匹配

常见修复方案

1. 缺少变量声明 (NAM003)

问题: 在声明前使用了变量名。

pub fn main(world: World) -> Void raises {
check world.out.write(message) // 'message' 未声明
}

修复: 在使用前引入局部绑定。

pub fn main(world: World) -> Void raises {
let message: String = "hello from zero\n"
check world.out.write(message)
}

2. 未检查的可失败调用 (ERR003)

问题: 可失败的函数调用没有 checkrescue

let file: owned<File> = std.fs.createOrRaise(fs, ".zero/out.txt")

修复: 使用 check 传播错误并声明错误集。

fn createFile(fs: owned<Fs>) -> owned<File> raises [NotFound, TooLarge, Io] {
return check std.fs.createOrRaise(fs, ".zero/out.txt")
}

3. 类型推断冲突 (TYP024)

问题: 泛型调用中 T 需要同时是 i32u8

fn first<T: Type>(left: T, right: T) -> T {
return left
}
let value: i32 = first(1, 2_u8)

修复: 使参数一致或传递显式类型参数。

let value: i32 = first<i32>(1, 2)

4. 缺少 API 元数据 (PUB001)

问题: 公共常量缺少显式类型标注。

pub const answer = 42

修复: 添加必需的类型标注。

pub const answer: i32 = 42

5. 跨目标 C 依赖 (CIMP003)

问题: 外部目标构建尝试使用主机 include 路径或 pkg-config

zero build --json --target linux-musl-x64 my-package

修复: 使用包相对的 vendor 头文件/库或配置目标 sysroot。不要在交叉编译时依赖主机路径。

延伸阅读