Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 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)において例外であることを示していました。

これらの行が削除されたということは、以下のことを意味します。

  1. 定数の「復元」: 以前はOpenBSD環境でGoのAPIの一部として利用できない、または異なる振る舞いをすると見なされていたこれらの定数が、このコミット以降はGoのAPI互換性保証の対象となり、OpenBSD 5.5でも期待通りに動作することが保証されます。
  2. API互換性の維持: GoのAPI互換性ポリシーに従い、OpenBSD 5.5の特定のシステムコール定数がGoの syscall パッケージを通じて正しく公開されるようになります。これにより、OpenBSD 5.5をターゲットとするGoプログラムが、これらの定数に依存しても問題なくコンパイルおよび実行できるようになります。
  3. 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コミュニティの議論