[インデックス 19373] ファイルの概要
このコミットは、Go言語プロジェクトの api/except.txt
ファイルに対する変更です。api/except.txt
は、GoのAPI互換性チェックツール (goapi
) が使用する重要なファイルであり、特定のプラットフォームやアーキテクチャにおいて、Goの標準ライブラリの公開APIの一部として利用できない、あるいは異なる振る舞いをする要素(定数、関数、型など)を列挙しています。このファイルに記載されている要素は、GoのAPI互換性保証の例外として扱われます。
コミット
このコミットは、OpenBSD 5.5環境において、以前誤って削除された syscall
パッケージ内の特定の定数をGoのAPI互換性リストに「復元」することを目的としています。具体的には、api/except.txt
からこれらの定数に関するエントリを削除することで、それらがOpenBSD 5.5でサポートされるべきAPIの一部であることを示しています。これにより、GoのAPI互換性の方針が維持されます。
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/8c8c260d2eecae480f99fcc336ab0e6fc15b23c4
元コミット内容
api: update openbsd exceptions
This CL restores dropped constants not supported in OpenBSD 5.5
and tris to keep the promise of API compatibility.
Update #7049
LGTM=jsing, bradfitz
R=rsc, jsing, bradfitz
CC=golang-codereviews
https://golang.org/cl/94950043
変更の背景
Go言語は、その公開APIに対して厳格な後方互換性保証を提供しています。これは、Goの新しいバージョンがリリースされても、既存のGoプログラムが特別な変更なしに動作し続けることを意味します。しかし、オペレーティングシステムやアーキテクチャの特定のバージョンによっては、Goの標準ライブラリが依存する基盤となるシステムコールや定数が利用できない、あるいはその定義が異なる場合があります。
このコミットの背景には、OpenBSD 5.5のリリースがあります。OpenBSDは、セキュリティとコードの正確性に重点を置いたUnix系オペレーティングシステムです。Goの syscall
パッケージは、OS固有のシステムコールへの低レベルなアクセスを提供しますが、これはOSのバージョンによって利用可能な定数や関数のセットが異なることを意味します。
以前の変更で、OpenBSD環境、特にOpenBSD 5.5でサポートされていないと誤解されたいくつかの syscall
定数が api/except.txt
に追加されたか、あるいはそこから削除されるべきものが削除されずに残っていた可能性があります。このコミットは、OpenBSD 5.5で実際にはサポートされている、またはGoのAPI互換性の方針に従ってサポートされるべきであったにもかかわらず、api/except.txt
に例外としてリストされていた定数を「復元」することを目的としています。api/except.txt
からエントリを削除することは、その定数がもはや例外ではなく、GoのAPIの一部として期待されることを意味します。これにより、GoのAPI互換性の約束が維持されます。
前提知識の解説
GoのAPI互換性ポリシー
Go言語プロジェクトは、バージョン間の後方互換性を非常に重視しています。特に、Go 1以降のリリースでは、Go 1で導入された公開APIは、将来のGoのバージョンでも変更されないことが保証されています。これにより、開発者はGoのバージョンアップに伴うコードの変更を最小限に抑えることができます。この互換性保証は、標準ライブラリの公開APIに適用されます。
api/except.txt
の役割
api/except.txt
ファイルは、GoのAPI互換性チェックプロセスにおいて重要な役割を果たします。Goプロジェクトは、goapi
というツールを使用して、新しいGoのバージョンがAPI互換性を維持しているかどうかを検証します。このツールは、Goの公開APIの定義を抽出し、以前のバージョンと比較します。
しかし、特定のオペレーティングシステムやアーキテクチャでは、一部のAPI要素が利用できない、あるいは異なる振る舞いをすることがあります。api/except.txt
は、このようなプラットフォーム固有の例外をリストアップするために使用されます。このファイルに記載されているAPI要素は、goapi
ツールによる互換性チェックの対象外となります。
したがって、api/except.txt
からエントリを削除するということは、そのAPI要素がもはや例外ではなく、指定されたプラットフォームでGoの標準APIの一部として期待されることを意味します。
OpenBSDとその特徴
OpenBSDは、セキュリティ、コードの品質、そして正確性に非常に重点を置いていることで知られるフリーでオープンソースのUnix系オペレーティングシステムです。厳格な開発プロセスとコードレビューにより、既知の脆弱性が少ないことで評価されています。
OpenBSDは、他のUnix系OSと同様に、カーネルが提供するシステムコールを通じてハードウェアやOSの機能にアクセスします。これらのシステムコールは、OSのバージョンやアーキテクチャによって異なる定数や構造体、関数を持つことがあります。Goの syscall
パッケージは、これらの低レベルなOS機能へのインターフェースを提供します。
syscall
パッケージの役割
Goの syscall
パッケージは、オペレーティングシステムが提供する低レベルなプリミティブ(システムコール)へのインターフェースを提供します。これには、ファイル操作、プロセス管理、ネットワーク通信など、OSカーネルと直接対話するための機能が含まれます。syscall
パッケージは、GoプログラムがOS固有の機能を利用する必要がある場合に用いられますが、その性質上、OSやアーキテクチャに強く依存します。そのため、異なるプラットフォーム間での互換性を確保するためには、プラットフォーム固有の定数や関数の存在を適切に管理する必要があります。
技術的詳細
このコミットは、OpenBSD 5.5環境における syscall
パッケージのAPI互換性に関する問題を修正しています。具体的には、以前の変更で api/except.txt
に追加された、またはそこから削除されるべきであったにもかかわらず残っていた以下の定数に関するエントリが削除されました。
削除された定数(つまり、このコミットによってOpenBSD 5.5でサポートされると「復元」された定数)は以下の通りです。
EMUL_ENABLED
EMUL_NATIVE
IFA_ROUTE
IPV6_FAITH
IPV6_OPTIONS
IPV6_RTHDR_STRICT
IPV6_SOCKOPT_RESERVED1
SIOCGIFGENERIC
SIOCSIFGENERIC
これらの定数は、OpenBSDの syscall
パッケージ内で定義されるもので、主にネットワーク関連(IPv6、インターフェース情報)やエミュレーション関連の機能に使用されます。
コミットメッセージにある「This CL restores dropped constants not supported in OpenBSD 5.5」という表現は、一見すると矛盾しているように見えますが、api/except.txt
の文脈で理解する必要があります。
- 「dropped constants」:以前のGoのバージョンやOpenBSDの特定のバージョンで、GoのAPIから「削除された」と見なされていた定数。
- 「not supported in OpenBSD 5.5」:OpenBSD 5.5でこれらの定数がサポートされていないと誤って判断されていた、あるいは一時的にサポートが中断されていた状況を指す可能性があります。
このコミットは、これらの定数が実際にはOpenBSD 5.5で利用可能である、またはGoのAPI互換性の方針に従って利用可能であるべきだと判断されたため、api/except.txt
からそれらのエントリを削除しました。api/except.txt
からエントリが削除されると、goapi
ツールはこれらの定数をOpenBSD 5.5環境でもGoの標準APIの一部として期待するようになります。これにより、GoのAPI互換性の約束が維持され、OpenBSD 5.5上でGoプログラムがこれらの定数に依存しても問題なく動作することが保証されます。
コアとなるコードの変更箇所
変更は api/except.txt
ファイルのみです。このファイルから、OpenBSDの 386
および amd64
アーキテクチャにおける syscall
パッケージの特定の定数に関する72行が削除されています。
--- a/api/except.txt
+++ b/api/except.txt
@@ -20,29 +20,11 @@ pkg syscall (darwin-amd64), const ImplementsGetwd = false
pkg syscall (darwin-amd64-cgo), const ImplementsGetwd = false
pkg syscall (openbsd-386), const BIOCGRTIMEOUT = 1074283118
pkg syscall (openbsd-386), const BIOCSRTIMEOUT = 2148024941
-pkg syscall (openbsd-386), const EMUL_ENABLED = 1
-pkg syscall (openbsd-386), const EMUL_ENABLED ideal-int
-pkg syscall (openbsd-386), const EMUL_NATIVE = 2
-pkg syscall (openbsd-386), const EMUL_NATIVE ideal-int
-pkg syscall (openbsd-386), const IFA_ROUTE = 1
-pkg syscall (openbsd-386), const IFA_ROUTE ideal-int
-pkg syscall (openbsd-386), const IPV6_FAITH = 29
-pkg syscall (openbsd-386), const IPV6_FAITH ideal-int
-pkg syscall (openbsd-386), const IPV6_OPTIONS = 1
-pkg syscall (openbsd-386), const IPV6_OPTIONS ideal-int
-pkg syscall (openbsd-386), const IPV6_RTHDR_STRICT = 1
-pkg syscall (openbsd-386), const IPV6_RTHDR_STRICT ideal-int
-pkg syscall (openbsd-386), const IPV6_SOCKOPT_RESERVED1 = 3
-pkg syscall (openbsd-386), const IPV6_SOCKOPT_RESERVED1 ideal-int
pkg syscall (openbsd-386), const RTF_FMASK = 63496
pkg syscall (openbsd-386), const RTM_VERSION = 4
pkg syscall (openbsd-386), const SIOCBRDGDADDR = 2150132039
pkg syscall (openbsd-386), const SIOCBRDGGPARAM = 3224922456
pkg syscall (openbsd-386), const SIOCBRDGSADDR = 3223873860
-pkg syscall (openbsd-386), const SIOCGIFGENERIC = 3223349562
-pkg syscall (openbsd-386), const SIOCGIFGENERIC ideal-int
-pkg syscall (openbsd-386), const SIOCSIFGENERIC = 2149607737
-pkg syscall (openbsd-386), const SIOCSIFGENERIC ideal-int
pkg syscall (openbsd-386), const SYS_CLOCK_GETRES = 234
pkg syscall (openbsd-386), const SYS_CLOCK_GETTIME = 232
pkg syscall (openbsd-386), const SYS_CLOCK_SETTIME = 233
@@ -90,29 +72,11 @@ pkg syscall (openbsd-386), type Timespec struct, Sec int32
pkg syscall (openbsd-386), type Timeval struct, Sec int32
pkg syscall (openbsd-386-cgo), const BIOCGRTIMEOUT = 1074283118
pkg syscall (openbsd-386-cgo), const BIOCSRTIMEOUT = 2148024941
-pkg syscall (openbsd-386-cgo), const EMUL_ENABLED = 1
-pkg syscall (openbsd-386-cgo), const EMUL_ENABLED ideal-int
-pkg syscall (openbsd-386-cgo), const EMUL_NATIVE = 2
-pkg syscall (openbsd-386-cgo), const EMUL_NATIVE ideal-int
-pkg syscall (openbsd-386-cgo), const IFA_ROUTE = 1
-pkg syscall (openbsd-386-cgo), const IFA_ROUTE ideal-int
-pkg syscall (openbsd-386-cgo), const IPV6_FAITH = 29
-pkg syscall (openbsd-386-cgo), const IPV6_FAITH ideal-int
-pkg syscall (openbsd-386-cgo), const IPV6_OPTIONS = 1
-pkg syscall (openbsd-386-cgo), const IPV6_OPTIONS ideal-int
-pkg syscall (openbsd-386-cgo), const IPV6_RTHDR_STRICT = 1
-pkg syscall (openbsd-386-cgo), const IPV6_RTHDR_STRICT ideal-int
-pkg syscall (openbsd-386-cgo), const IPV6_SOCKOPT_RESERVED1 = 3
-pkg syscall (openbsd-386-cgo), const IPV6_SOCKOPT_RESERVED1 ideal-int
pkg syscall (openbsd-386-cgo), const RTF_FMASK = 63496
pkg syscall (openbsd-386-cgo), const RTM_VERSION = 4
pkg syscall (openbsd-386-cgo), const SIOCBRDGDADDR = 2150132039
pkg syscall (openbsd-386-cgo), const SIOCBRDGGPARAM = 3224922456
pkg syscall (openbsd-386-cgo), const SIOCBRDGSADDR = 3223873860
-pkg syscall (openbsd-386-cgo), const SIOCGIFGENERIC = 3223349562
-pkg syscall (openbsd-386-cgo), const SIOCGIFGENERIC ideal-int
-pkg syscall (openbsd-386-cgo), const SIOCSIFGENERIC = 2149607737
-pkg syscall (openbsd-386-cgo), const SIOCSIFGENERIC ideal-int
pkg syscall (openbsd-386-cgo), const SYS_CLOCK_GETRES = 234
pkg syscall (openbsd-386-cgo), const SYS_CLOCK_GETTIME = 232
pkg syscall (openbsd-386-cgo), const SYS_CLOCK_SETTIME = 233
@@ -170,30 +134,12 @@ pkg syscall (openbsd-amd64), const EFER_NXE = 2048
pkg syscall (openbsd-amd64), const EFER_NXE ideal-int
pkg syscall (openbsd-amd64), const EFER_SCE = 1
pkg syscall (openbsd-amd64), const EFER_SCE ideal-int
-pkg syscall (openbsd-amd64), const EMUL_ENABLED = 1
-pkg syscall (openbsd-amd64), const EMUL_ENABLED ideal-int
-pkg syscall (openbsd-amd64), const EMUL_NATIVE = 2
-pkg syscall (openbsd-amd64), const EMUL_NATIVE ideal-int
-pkg syscall (openbsd-amd64), const IFA_ROUTE = 1
-pkg syscall (openbsd-amd64), const IFA_ROUTE ideal-int
-pkg syscall (openbsd-amd64), const IPV6_FAITH = 29
-pkg syscall (openbsd-amd64), const IPV6_FAITH ideal-int
-pkg syscall (openbsd-amd64), const IPV6_OPTIONS = 1
-pkg syscall (openbsd-amd64), const IPV6_OPTIONS ideal-int
-pkg syscall (openbsd-amd64), const IPV6_RTHDR_STRICT = 1
-pkg syscall (openbsd-amd64), const IPV6_RTHDR_STRICT ideal-int
-pkg syscall (openbsd-amd64), const IPV6_SOCKOPT_RESERVED1 = 3
-pkg syscall (openbsd-amd64), const IPV6_SOCKOPT_RESERVED1 ideal-int
pkg syscall (openbsd-amd64), const PMC5_PIPELINE_FLUSH = 21
pkg syscall (openbsd-amd64), const PMC5_PIPELINE_FLUSH ideal-int
pkg syscall (openbsd-amd64), const RTF_FMASK = 63496
pkg syscall (openbsd-amd64), const RTM_VERSION = 4
pkg syscall (openbsd-amd64), const SIOCBRDGDADDR = 2150132039
pkg syscall (openbsd-amd64), const SIOCBRDGSADDR = 3223873860
-pkg syscall (openbsd-amd64), const SIOCGIFGENERIC = 3223349562
-pkg syscall (openbsd-amd64), const SIOCGIFGENERIC ideal-int
-pkg syscall (openbsd-amd64), const SIOCSIFGENERIC = 2149607737
-pkg syscall (openbsd-amd64), const SIOCSIFGENERIC ideal-int
pkg syscall (openbsd-amd64), const SYS_CLOCK_GETRES = 234
pkg syscall (openbsd-amd64), const SYS_CLOCK_GETTIME = 232
pkg syscall (openbsd-amd64), const SYS_CLOCK_SETTIME = 233
@@ -250,30 +196,12 @@ pkg syscall (openbsd-amd64-cgo), const EFER_NXE = 2048
pkg syscall (openbsd-amd64-cgo), const EFER_NXE ideal-int
pkg syscall (openbsd-amd64-cgo), const EFER_SCE = 1
pkg syscall (openbsd-amd64-cgo), const EFER_SCE ideal-int
-pkg syscall (openbsd-amd64-cgo), const EMUL_ENABLED = 1
-pkg syscall (openbsd-amd64-cgo), const EMUL_ENABLED ideal-int
-pkg syscall (openbsd-amd64-cgo), const EMUL_NATIVE = 2
-pkg syscall (openbsd-amd64-cgo), const EMUL_NATIVE ideal-int
-pkg syscall (openbsd-amd64-cgo), const IFA_ROUTE = 1
-pkg syscall (openbsd-amd64-cgo), const IFA_ROUTE ideal-int
-pkg syscall (openbsd-amd64-cgo), const IPV6_FAITH = 29
-pkg syscall (openbsd-amd64-cgo), const IPV6_FAITH ideal-int
-pkg syscall (openbsd-amd64-cgo), const IPV6_OPTIONS = 1
-pkg syscall (openbsd-amd64-cgo), const IPV6_OPTIONS ideal-int
-pkg syscall (openbsd-amd64-cgo), const IPV6_RTHDR_STRICT = 1
-pkg syscall (openbsd-amd64-cgo), const IPV6_RTHDR_STRICT ideal-int
-pkg syscall (openbsd-amd64-cgo), const IPV6_SOCKOPT_RESERVED1 = 3
-pkg syscall (openbsd-amd64-cgo), const IPV6_SOCKOPT_RESERVED1 ideal-int
pkg syscall (openbsd-amd64-cgo), const PMC5_PIPELINE_FLUSH = 21
pkg syscall (openbsd-amd64-cgo), const PMC5_PIPELINE_FLUSH ideal-int
pkg syscall (openbsd-amd64-cgo), const RTF_FMASK = 63496
pkg syscall (openbsd-amd64-cgo), const RTM_VERSION = 4
pkg syscall (openbsd-amd64-cgo), const SIOCBRDGDADDR = 2150132039
pkg syscall (openbsd-amd64-cgo), const SIOCBRDGSADDR = 3223873860
-pkg syscall (openbsd-amd64-cgo), const SIOCGIFGENERIC = 3223349562
-pkg syscall (openbsd-amd64-cgo), const SIOCGIFGENERIC ideal-int
-pkg syscall (openbsd-amd64-cgo), const SIOCSIFGENERIC = 2149607737
-pkg syscall (openbsd-amd64-cgo), const SIOCSIFGENERIC ideal-int
pkg syscall (openbsd-amd64-cgo), const SYS_CLOCK_GETRES = 234
pkg syscall (openbsd-amd64-cgo), const SYS_CLOCK_GETTIME = 232
pkg syscall (openbsd-amd64-cgo), const SYS_CLOCK_SETTIME = 233
コアとなるコードの解説
上記のdiffが示すように、api/except.txt
から複数の行が削除されています。各行は pkg syscall (openbsd-ARCH), const CONSTANT_NAME = VALUE
の形式で、特定の定数がOpenBSDの特定のアーキテクチャ(386またはamd64)において例外であることを示していました。
これらの行が削除されたということは、以下のことを意味します。
- 定数の「復元」: 以前はOpenBSD環境でGoのAPIの一部として利用できない、または異なる振る舞いをすると見なされていたこれらの定数が、このコミット以降はGoのAPI互換性保証の対象となり、OpenBSD 5.5でも期待通りに動作することが保証されます。
- API互換性の維持: GoのAPI互換性ポリシーに従い、OpenBSD 5.5の特定のシステムコール定数がGoの
syscall
パッケージを通じて正しく公開されるようになります。これにより、OpenBSD 5.5をターゲットとするGoプログラムが、これらの定数に依存しても問題なくコンパイルおよび実行できるようになります。 goapi
ツールの挙動:api/except.txt
からこれらのエントリが削除されたことで、GoのAPI互換性チェックツールであるgoapi
は、OpenBSD 5.5環境においてこれらの定数がsyscall
パッケージに存在することを期待するようになります。もし将来のGoのバージョンでこれらの定数がOpenBSD 5.5で利用できなくなった場合、goapi
ツールは互換性違反を報告するでしょう。
具体的に削除された定数は、EMUL_ENABLED
, EMUL_NATIVE
, IFA_ROUTE
, IPV6_FAITH
, IPV6_OPTIONS
, IPV6_RTHDR_STRICT
, IPV6_SOCKOPT_RESERVED1
, SIOCGIFGENERIC
, SIOCSIFGENERIC
です。これらは、OpenBSDのネットワークスタックやシステムエミュレーションに関連する低レベルな定数であり、Goの syscall
パッケージがこれらのOS固有の機能と連携するために必要とします。
この変更は、Goが様々なプラットフォームで一貫したAPIを提供しようとする努力の一環であり、特定のOSバージョンにおける細かな差異にも対応することで、Goの堅牢性と移植性を高めています。
関連リンク
- Go言語のAPI互換性保証に関する公式ドキュメント: https://go.dev/doc/go1compat
- Goの
syscall
パッケージのドキュメント: https://pkg.go.dev/syscall - OpenBSD 公式サイト: https://www.openbsd.org/
- OpenBSD 5.5 リリース情報 (当時の情報源を探す必要がありますが、一般的にはOpenBSDの公式サイトやメーリングリストアーカイブで確認できます)
参考にした情報源リンク
- Go言語の公式ドキュメント
- OpenBSDの公式ドキュメントおよびリリースノート
- GoプロジェクトのGitHubリポジトリおよび関連するコードレビュー (Gerrit) の議論
api/except.txt
ファイルの一般的な役割に関するGoコミュニティの議論