クロスバージョン実行時保証
Protobuf言語バインディングには2つのコンポーネントがあります。生成されたコード(通常はprotoc
から生成されます)と、生成されたコードを使用する際に含める必要があるランタイムライブラリです。これらが異なるProtobufリリースから提供される場合、私たちは「クロスバージョンランタイム」の状況にあります。
私たちはC++とRustを除くすべての言語で、以下の保証を提供することを意図しています。これらはデフォルトの保証ですが、Protobufのコードジェネレーターとランタイムの所有者は、その言語に対してより具体的な保証で明示的に上書きすることができます。
保証外のProtobufクロスバージョン使用はエラーを起こしやすく、サポートされていません。バージョンのずれは、ソース互換性のない変更がない限り、しばしば機能するように見えることがあっても、診断が困難な不安定な動作や未定義の動作を引き起こす可能性があります。Protobufの場合、サポートされていないProtobuf言語バインディングの使用に依存するツールやサービスの普及は、バグ報告やセキュリティ脆弱性に対応してProtobufチームがProtobuf実装を更新することを妨げます。
新しい生成コード + 古いランタイム = 許可されない
あらゆる種類のリリース(メジャー、マイナー、パッチ)で新しいランタイムAPIを追加する可能性があります。そのリリースの生成コードは、それらの新しいAPIを使用することが許可されています。その結果、生成コードは、それらのバインディングを生成するために使用されたprotoc
とプラグインよりも古いランタイムと組み合わせるべきではありません。
可能な限り「ポイズンピル」を追加し、新しい生成コードを古いランタイムと組み合わせようとする試みを防止します。
メジャーバージョン
2025年第1四半期(2025Q1)リリースから、Protobufプロジェクトはメジャーバージョンに対してローリング互換性ウィンドウを採用します。メジャーバージョンV(フルバージョン:V.x.y)用に生成されたコードは、バージョンVおよびV+1のProtobufランタイムによってサポートされます。
このポリシーに先立ち、3.22.x+(メジャーバージョン4の約1年前のリリース)用に生成されたコードは、引き続きバージョン3および4のProtobufランタイムによってサポートされます。古い生成コードを使用しているユーザーは、3.25.xの最新生成コードにアップグレードする必要があります。
Protobufは、バージョンVの生成コードをランタイム >= 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++およびRustに特化した保証
Protobuf C++とRustは、すべてのクロスランタイムサポートを否認し、生成コードバージョンとランタイムバージョンとの間で常に厳密な一致を要求します。
さらに、Protobuf C++は、いかなるリリース(メジャー、マイナー、マイクロ)においてもABIの安定性について保証しません。