跨版本執行階段保證
Protobuf 語言繫結有兩個元件:產生的程式碼 (通常由 protoc
產生) 和使用產生程式碼時必須包含的執行階段程式庫。當這些元件來自不同版本的 protobuf 時,我們就處於「跨版本執行階段」的情況。
我們打算針對 C++ 以外的所有語言提供以下保證 C++。這些是預設保證;但是,protobuf 程式碼產生器和執行階段的擁有者可以明確覆寫這些保證,針對該語言提供更明確的保證。
Protobuf 跨版本用法若超出保證範圍,**容易出錯且不受支援**。版本偏差可能會導致*不穩定和未定義的行為*,即使在來源不相容變更之前看似可以運作,也難以診斷。對於 Protobuf 而言,依賴使用不受支援的 Protobuf 語言繫結的工具和服務大量增加,使得 protobuf 團隊無法回應錯誤報告或安全性漏洞來更新 protobuf 實作。
新版程式碼產生器 + 舊版執行階段 = 絕不允許
我們可能會在任何類型的版本 (主要、次要或修補程式) 中新增執行階段 API。該版本中的產生程式碼可以放心使用這些新 API。因此,產生程式碼絕不應與早於用於產生這些繫結的 protoc
和外掛程式的執行階段配對。
我們會在允許的情況下加入「毒丸」機制,以防止嘗試將較新的產生程式碼與較舊的執行階段配對。
主要版本
從 2025 年第一季版本開始,protobuf 專案將針對主要版本採用滾動相容性視窗。針對主要版本 V (完整版本:V.x.y) 產生的程式碼將受到版本 V 和 V+1 的 protobuf 執行階段支援。
在此政策之前,針對 3.22.x+ (版本約在主要版本 4 前一年發布) 產生的程式碼仍會受到版本 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++ 特定保證
Protobuf C++ 不提供任何跨執行階段支援,且隨時都要求其產生程式碼版本與執行階段版本完全相符。此外,Protobuf C++ 不保證任何版本 (主要、次要或微幅) 之間的 ABI 穩定性。