跨版本运行时保证
Protobuf 语言绑定有两个组件。生成的代码(通常由 protoc
生成)以及使用生成代码时必须包含的运行时库。当这些来自不同版本的 protobuf 时,我们就处于“跨版本运行时”的情况。
我们打算为除 C++ 之外的所有语言提供以下保证。这些是默认保证;但是,protobuf 代码生成器和运行时的所有者可以明确地覆盖它们,为该语言提供更具体的保证。
在保证范围之外的 Protobuf 跨版本使用容易出错且不受支持。版本偏差可能导致难以诊断的错误和未定义行为,即使它通常似乎可以工作,只要没有以源代码不兼容的方式发生任何更改。对于 Protobuf,依赖于使用不受支持的 Protobuf 语言绑定的工具和服务的激增,阻止了 protobuf 团队根据错误报告或安全漏洞更新 protobuf 实现。
新 Gencode + 旧运行时 = 永不允许
我们可以在任何类型的版本(主版本、次版本或补丁版本)中添加新的运行时 API。该版本中的 Gencode 允许使用这些新的 API。结果是,gencode 永远不应该与早于用于生成这些绑定的 protoc
和插件的运行时配对。
我们将尽可能添加“毒丸”,以防止尝试将较新的 gencode 与较旧的运行时配对。
主版本
从 2025Q1 版本开始,protobuf 项目将为主要版本采用滚动兼容窗口。为主要版本 V(完整版本:V.x.y)生成的代码将受版本 V 和 V+1 的 protobuf 运行时支持。
Protobuf 不支持使用版本 V 的 gencode 与版本 >= V+2 的运行时,并将使用“毒丸”机制在软件程序集尝试使用此类配置时以清晰的错误消息失败。
次版本
在单个主要运行时版本内,来自旧版本 protoc
的生成代码将在较新的运行时上运行。
安全例外
如果出于安全原因需要,我们保留违反上述承诺的权利。我们预计这些例外情况很少见,但始终会将安全性置于这些保证之上。例如,footmitten 需要同时更新运行时和生成的 Java 代码。因此,由 3.20.3(包含 footmitten 修复)生成的代码不会加载运行时库 3.21.6(早于 footmitten 修复),从而创建以下兼容性矩阵
生成代码版本 | |||||
3.20.2 | 3.20.3 | 3.21.6 | 3.21.7 | ||
运行时 版本 | 3.20.2 | 漏洞 | 已损坏 | 漏洞 | 已损坏 |
3.20.3 | 漏洞 | 工作 | 漏洞 | 工作? | |
3.21.6 | 漏洞 | 已损坏 | 漏洞 | 已损坏 | |
3.21.7 | 漏洞 | 工作 | 漏洞 | 工作 |
- “漏洞”表示组合将成功启动,但安全漏洞仍然存在。
- “工作”表示组合将成功启动并且不存在漏洞。
- “已损坏”表示组合将无法成功启动。
- 粗体表示鉴于本主题中概述的保证,从未故意打算一起使用的配置。
不支持在同一进程中同时存在多个主运行时版本
在同一进程中同时存在多个主版本不受支持。
C++ 特定保证
Protobuf C++ 声明放弃所有跨运行时支持,并且始终需要其生成的代码版本与其运行时版本完全匹配。此外,Protobuf C++ 对任何版本(主版本、次版本或微版本)的 ABI 稳定性不作任何保证。