跨版本執行階段保證

語言針對跨版本執行階段相容性提供的保證。

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.23.20.33.21.63.21.7
執行階段
版本
3.20.2漏洞故障漏洞故障
3.20.3漏洞運作漏洞運作?
3.21.6漏洞故障漏洞故障
3.21.7漏洞運作漏洞運作
  • 「漏洞」表示組合將成功啟動,但安全性漏洞仍然存在。
  • 「運作」表示組合將成功啟動,且沒有漏洞。
  • 「故障」表示組合將無法成功啟動。
  • 粗體 表示依據本主題中概述的保證,從未刻意設計為一起運作的配置。

不允許多個主要執行階段版本共存

支援在同一個程序中共存多個主要版本。

C++ 特定保證

Protobuf C++ 不提供任何跨執行階段支援,且隨時都要求其產生程式碼版本與執行階段版本完全相符。此外,Protobuf C++ 不保證任何版本 (主要、次要或微幅) 之間的 ABI 穩定性。