跨版本執行階段保證
Protobuf 語言繫結有兩個元件。產生的程式碼 (通常由 protoc
產生) 以及使用產生的程式碼時必須包含的執行階段程式庫。當這些來自不同版本的 protobuf 時,我們處於「跨版本執行階段」的情況。
我們打算在除了 C++ 以外的所有語言中提供以下保證。這些是預設保證;但是,protobuf 程式碼產生器和執行階段的所有者可以明確地覆寫它們,為該語言提供更具體的保證。
在保證之外的 Protobuf 跨版本使用是容易出錯且不支援的。版本偏差可能會導致難以診斷的不穩定和未定義的行為,即使只要原始碼未以不相容的方式變更,它通常似乎可以正常運作。對於 Protobuf,依賴使用不受支援的 Protobuf 語言繫結的工具和服務的普及,使得 protobuf 團隊無法更新 protobuf 實作以回應錯誤報告或安全性漏洞。
新產生的程式碼 + 舊執行階段 = 絕不允許
我們可能會在任何類型的版本 (主要、次要或修補) 中新增執行階段 API。該版本中的產生程式碼可以使用這些新的 API。結果是,產生的程式碼永遠不應與早於用於產生這些繫結的 protoc
和外掛程式的執行階段配對。
我們將在可能的情況下新增「毒藥丸」,以防止嘗試將較新的產生程式碼與較舊的執行階段配對。
主要版本
從 2025 年第一季的版本開始,protobuf 專案將為主要版本採用滾動相容性視窗。主要版本 V (完整版本:V.x.y) 所產生的程式碼將由 V 和 V+1 版本的 protobuf 執行階段支援。
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++ 特定保證
Protobuf C++ 放棄所有跨執行階段支援,並要求其產生的程式碼版本與執行階段版本始終完全符合。此外,Protobuf C++ 不保證任何版本 (主要、次要或微型) 的 ABI 穩定性。