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