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

[インデックス 10344] ファイルの概要

このコミットは、Go言語のsyscallパッケージにおけるOpenBSD 386アーキテクチャ向けの定数定義ファイルsrc/pkg/syscall/zerrors_openbsd_386.goに対する修正です。具体的には、システムコールやioctlコマンドに関連する定数の値が、誤って負の値として定義されていたものを、正しい符号なしの16進数表現に修正しています。

コミット

commit 791aef1821638824cd135a0d6828bd873c06be6b
Author: Joel Sing <jsing@google.com>
Date:   Sat Nov 12 05:19:09 2011 +1100

    syscall: fix zerrors for openbsd 386
    
    R=golang-dev, bradfitz, rsc
    CC=golang-dev
    https://golang.org/cl/5369076

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/791aef1821638824cd135a0d6828bd873c06be6b

元コミット内容

このコミットの元のメッセージは「syscall: fix zerrors for openbsd 386」です。これは、OpenBSDの386アーキテクチャにおけるsyscallパッケージのzerrors(ゼロエラー、または生成されたエラー定数)に修正を加えることを示しています。具体的には、定数の値が正しくない、特に符号に関する問題があったことを示唆しています。

変更の背景

Go言語のsyscallパッケージは、オペレーティングシステム固有のシステムコールや定数への低レベルなアクセスを提供します。これらの定数は、通常、C言語のヘッダーファイルから自動生成されるか、手動で移植されます。zerrors_openbsd_386.goのようなファイルは、特定のOSとアーキテクチャの組み合わせ(この場合はOpenBSDの386、つまりi386/x86 32-bit)に特化したシステムコール定数を定義しています。

このコミットの背景には、OpenBSD 386環境でGoプログラムがシステムコールを正しく実行できない、または予期せぬエラーが発生するという問題があったと考えられます。特に、ioctlコマンドやネットワーク関連の定数など、ビットフラグや特定の構造を持つ値が負の数として誤って解釈されていたことが原因です。

C言語では、#defineで定義される定数は通常、符号なし整数として扱われることが多いですが、Go言語の定数定義では、リテラルの表現によっては符号付き整数として解釈される可能性があります。この不一致が、GoのsyscallパッケージがOpenBSDのネイティブな定数と異なる値を生成してしまう原因となったと考えられます。

前提知識の解説

Go言語のsyscallパッケージ

Go言語のsyscallパッケージは、Goプログラムから直接オペレーティングシステムのシステムコールを呼び出すためのインターフェースを提供します。これにより、ファイル操作、ネットワーク通信、プロセス管理など、OSレベルの機能にアクセスできます。このパッケージはOSやアーキテクチャに依存する部分が多く、各プラットフォーム向けに異なる実装や定数定義が存在します。

zerrorsファイル

Goのsyscallパッケージには、zerrors_*.goという命名規則のファイルが多数存在します。これらのファイルは、特定のOS(例: linuxopenbsd)とアーキテクチャ(例: amd64386)の組み合わせに対応するシステムコール番号、エラーコード、ioctlコマンドなどの定数を定義しています。これらのファイルは、通常、C言語のヘッダーファイルから自動生成ツール(例: go tool cgo -godefs)によって生成されます。zは「ゼロ」を意味し、これらのファイルがGoの型システムに合わせた定数定義を提供することを示唆しています。

ioctlコマンド

ioctl(Input/Output Control)は、Unix系オペレーティングシステムにおいて、デバイスドライバに対して特殊な操作を行うためのシステムコールです。通常の読み書き操作では表現できない、デバイス固有の制御機能を提供します。ioctlコマンドは、通常、特定のデバイスや操作を識別するためのユニークな整数値(マジックナンバー)で構成されており、これらの値はOSのヘッダーファイルで定義されています。

符号付き整数と符号なし整数、そして16進数表現

コンピュータにおける数値表現には、符号付き整数(signed integer)と符号なし整数(unsigned integer)があります。

  • 符号なし整数: 0以上の値のみを表現し、すべてのビットが数値の大きさを表すために使われます。
  • 符号付き整数: 正の値と負の値を表現します。最上位ビット(MSB)が符号ビットとして使われることが多く、2の補数表現が一般的です。

16進数(hexadecimal)は、基数16の数値表現です。0xプレフィックスで示されます。例えば、0xFFは10進数で255です。 このコミットで問題となっているのは、C言語のヘッダーファイルで定義されているioctlコマンドなどの定数が、Goの自動生成プロセスで符号付き整数として解釈され、負の値になってしまったことです。例えば、0xc008427bのような値は、32ビット符号付き整数として解釈されると、最上位ビットが1であるため負の値になります。しかし、本来はioctlコマンドとして、そのビットパターン全体が意味を持つ符号なしの値として扱われるべきです。

例えば、32ビットシステムで0xc008427bという16進数を考えます。

  • 符号なし整数としては、3221799547という大きな正の数です。
  • 符号付き整数(2の補数)としては、0xc008427bの2の補数を計算すると、0x3ff7bd85となり、これに負の符号を付けて-0x3ff7bd85となります。

このコミットは、GoのsyscallパッケージがOpenBSDのネイティブな定数を正しく解釈し、符号なしのビットパターンとして扱うように修正したものです。

技術的詳細

このコミットの技術的な核心は、Go言語のsyscallパッケージがOpenBSD 386アーキテクチャ向けの定数を生成する際に発生していた、符号の解釈ミスを修正することにあります。

OpenBSDのようなUnix系OSでは、ioctlコマンドやその他のシステムコール関連の定数は、通常、C言語のヘッダーファイル(例: <sys/ioctl.h>, <sys/socket.h>など)で#defineプリプロセッサディレクティブを使って定義されています。これらの定数は、多くの場合、ビットフラグや特定の構造を持つ整数値であり、その値自体が意味を持ちます。例えば、ioctlコマンドは、通常、コマンドの方向(読み取り、書き込み、両方)、データサイズ、コマンド番号などの情報がビットフィールドとしてエンコードされた32ビットまたは64ビットの整数です。

Go言語のsyscallパッケージのzerrorsファイルは、これらのC言語の定数をGoのコードに移植するために自動生成されることが多いです。この自動生成プロセスにおいて、C言語のヘッダーファイルから読み取られた16進数リテラルが、Goのコンテキストで符号付き整数として解釈されてしまう問題が発生していました。

具体的には、最上位ビットが1である16進数(例: 0xc008427b)は、C言語のunsigned intunsigned longでは大きな正の数として扱われますが、Goのデフォルトの整数型(int)や、特定のコンテキストでの解釈によっては、符号付き整数として扱われ、負の値(例: -0x3ff7bd85)になってしまうことがあります。

このコミットでは、そのような誤って負の値として定義されていた定数を、本来の符号なしの16進数表現に修正しています。これにより、GoプログラムがOpenBSD 386上でシステムコールを呼び出す際に、OSが期待する正しいioctlコマンド値やその他の定数を使用できるようになります。

例えば、BIOCGDLTLISTという定数は、変更前は-0x3ff7bd85でしたが、変更後は0xc008427bになっています。これは、0xc008427bが32ビット符号付き整数として解釈された結果が-0x3ff7bd85になるため、その逆変換を行って正しい符号なしの16進数表現に戻したことを意味します。

この修正は、Goのsyscallパッケージが提供するOSとのインターフェースの正確性を保証するために非常に重要です。誤った定数を使用すると、システムコールの失敗、予期せぬ動作、セキュリティ上の脆弱性など、様々な問題を引き起こす可能性があります。

コアとなるコードの変更箇所

変更はsrc/pkg/syscall/zerrors_openbsd_386.goファイルのみです。このファイル内で、多数のconst定義における16進数リテラルの値が修正されています。

--- a/src/pkg/syscall/zerrors_openbsd_386.go
+++ b/src/pkg/syscall/zerrors_openbsd_386.go
@@ -49,26 +49,26 @@ const (
 	BIOCGBLEN                         = 0x40044266
 	BIOCGDIRFILT                      = 0x4004427c
 	BIOCGDLT                          = 0x4004426a
-	BIOCGDLTLIST                      = -0x3ff7bd85
+	BIOCGDLTLIST                      = 0xc008427b
 	BIOCGETIF                         = 0x4020426b
 	BIOCGFILDROP                      = 0x40044278
 	BIOCGHDRCMPLT                     = 0x40044274
 	BIOCGRSIG                         = 0x40044273
 	BIOCGRTIMEOUT                     = 0x4008426e
 	BIOCGSTATS                        = 0x4008426f
-	BIOCIMMEDIATE                     = -0x7ffbbd90
+	BIOCIMMEDIATE                     = 0x80044270
 	BIOCLOCK                          = 0x20004276
 	BIOCPROMISC                       = 0x20004269
-	BIOCSBLEN                         = -0x3ffbbd9a
-	BIOCSDIRFILT                      = -0x7ffbbd83
-	BIOCSDLT                          = -0x7ffbbd86
-	BIOCSETF                          = -0x7ff7bd99
-	BIOCSETIF                         = -0x7fdfbd94
-	BIOCSETWF                         = -0x7ff7bd89
-	BIOCSFILDROP                      = -0x7ffbbd87
-	BIOCSHDRCMPLT                     = -0x7ffbbd8b
-	BIOCSRSIG                         = -0x7ffbbd8e
-	BIOCSRTIMEOUT                     = -0x7ff7bd93
+	BIOCSBLEN                         = 0xc0044266
+	BIOCSDIRFILT                      = 0x8004427d
+	BIOCSDLT                          = 0x8004427a
+	BIOCSETF                          = 0x80084267
+	BIOCSETIF                         = 0x8020426c
+	BIOCSETWF                         = 0x80084277
+	BIOCSFILDROP                      = 0x80044279
+	BIOCSHDRCMPLT                     = 0x80044275
+	BIOCSRSIG                         = 0x80044272
+	BIOCSRTIMEOUT                     = 0x8008426d
 	BIOCVERSION                       = 0x40044271
 	BPF_A                             = 0x10
 	BPF_ABS                           = 0x20
@@ -179,6 +179,10 @@ const (
 	EEXIST                            = 0x11
 	EFAULT                            = 0xe
 	EFBIG                             = 0x1b
+	EFER_LMA                          = 0x400
+	EFER_LME                          = 0x100
+	EFER_NXE                          = 0x800
+	EFER_SCE                          = 0x1
 	EFTYPE                            = 0x4f
 	EHOSTDOWN                         = 0x40
 	EHOSTUNREACH                      = 0x41
@@ -438,7 +442,7 @@ const (
 	ETHER_ALIGN                       = 0x2
 	ETHER_CRC_LEN                     = 0x4
 	ETHER_CRC_POLY_BE                 = 0x4c11db6
-	ETHER_CRC_POLY_LE                 = -0x12477ce0
+	ETHER_CRC_POLY_LE                 = 0xedb88320
 	ETHER_HDR_LEN                     = 0xe
 	ETHER_MAX_DIX_LEN                 = 0x600
 	ETHER_MAX_LEN                     = 0x5ee
@@ -732,21 +736,21 @@ const (
 	IFT_XETHER                        = 0x1a
 	IN_CLASSA_HOST                    = 0xffffff
 	IN_CLASSA_MAX                     = 0x80
-	IN_CLASSA_NET                     = -0x1000000
+	IN_CLASSA_NET                     = 0xff000000
 	IN_CLASSA_NSHIFT                  = 0x18
 	IN_CLASSB_HOST                    = 0xffff
 	IN_CLASSB_MAX                     = 0x10000
-	IN_CLASSB_NET                     = -0x10000
+	IN_CLASSB_NET                     = 0xffff0000
 	IN_CLASSB_NSHIFT                  = 0x10
 	IN_CLASSC_HOST                    = 0xff
-	IN_CLASSC_NET                     = -0x100
+	IN_CLASSC_NET                     = 0xffffff00
 	IN_CLASSC_NSHIFT                  = 0x8
 	IN_CLASSD_HOST                    = 0xfffffff
-	IN_CLASSD_NET                     = -0x10000000
+	IN_CLASSD_NET                     = 0xf0000000
 	IN_CLASSD_NSHIFT                  = 0x1c
 	IN_LOOPBACKNET                    = 0x7f
 	IN_RFC3021_HOST                   = 0x1
-	IN_RFC3021_NET                    = -0x2
+	IN_RFC3021_NET                    = 0xfffffffe
 	IN_RFC3021_NSHIFT                 = 0x1f
 	IPPROTO_AH                        = 0x33
 	IPPROTO_CARP                      = 0x70
@@ -796,8 +800,8 @@ const (
 	IPV6_ESP_NETWORK_LEVEL            = 0x37
 	IPV6_ESP_TRANS_LEVEL              = 0x36
 	IPV6_FAITH                        = 0x1d
-	IPV6_FLOWINFO_MASK                = -0xf1
-	IPV6_FLOWLABEL_MASK               = -0xf100
+	IPV6_FLOWINFO_MASK                = 0xffffff0f
+	IPV6_FLOWLABEL_MASK               = 0xffff0f00
 	IPV6_FRAGTTL                      = 0x78
 	IPV6_HLIMDEC                      = 0x1
 	IPV6_HOPLIMIT                     = 0x2f
@@ -923,7 +927,6 @@ const (
 	O_SYNC                            = 0x80
 	O_TRUNC                           = 0x400
 	O_WRONLY                          = 0x1
-	PT_MASK                           = 0x3ff000
 	RTAX_AUTHOR                       = 0x6
 	RTAX_BRD                          = 0x7
 	RTAX_DST                          = 0x0
@@ -1038,118 +1041,118 @@ const (
 	SIGWINCH                          = 0x1c
 	SIGXCPU                           = 0x18
 	SIGXFSZ                           = 0x19
-	SIOCADDMULTI                      = -0x7fdf96cf
-	SIOCAIFADDR                       = -0x7fbf96e6
-	SIOCAIFGROUP                      = -0x7fdb9679
-	SIOCALIFADDR                      = -0x7de796e4
+	SIOCADDMULTI                      = 0x80206931
+	SIOCAIFADDR                       = 0x8040691a
+	SIOCAIFGROUP                      = 0x80246987
+	SIOCALIFADDR                      = 0x8218691c
 	SIOCATMARK                        = 0x40047307
-	SIOCBRDGADD                       = -0x7fab96c4
-	SIOCBRDGADDS                      = -0x7fab96bf
-	SIOCBRDGARL                       = -0x7f9196b3
-	SIOCBRDGDADDR                     = -0x7fd796b9
-	SIOCBRDGDEL                       = -0x7fab96c3
-	SIOCBRDGDELS                      = -0x7fab96be
-	SIOCBRDGFLUSH                     = -0x7fab96b8
-	SIOCBRDGFRL                       = -0x7f9196b2
-	SIOCBRDGGCACHE                    = -0x3feb96bf
-	SIOCBRDGGGFD                      = -0x3feb96ae
-	SIOCBRDGGHT                       = -0x3feb96af
-	SIOCBRDGGIFFLGS                   = -0x3fab96c2
-	SIOCBRDGGMA                       = -0x3feb96ad
-	SIOCBRDGGPARAM                    = -0x3fc796a8
-	SIOCBRDGGGPRI                     = -0x3feb96b0
-	SIOCBRDGGRL                       = -0x3fd796b1
-	SIOCBRDGGSIFS                     = -0x3fab96c4
-	SIOCBRDGGTO                       = -0x3feb96ba
-	SIOCBRDGIFS                       = -0x3fab96be
-	SIOCBRDGRTS                       = -0x3fe796bd
-	SIOCBRDGSADDR                     = -0x3fd796bc
-	SIOCBRDGSCACHE                    = -0x7feb96c0
-	SIOCBRDGSFD                       = -0x7feb96ae
-	SIOCBRDGSHT                       = -0x7feb96af
-	SIOCBRDGSIFCOST                   = -0x7fab96ab
-	SIOCBRDGSIFFLGS                   = -0x7fab96c1
-	SIOCBRDGSIFPRIO                   = -0x7fab96ac
-	SIOCBRDGSMA                       = -0x7feb96ad
-	SIOCBRDGSPRI                      = -0x7feb96b0
-	SIOCBRDGSPROTO                    = -0x7feb96a6
-	SIOCBRDGSTO                       = -0x7feb96bb
-	SIOCBRDGSTXHC                     = -0x7feb96a7
-	SIOCDELMULTI                      = -0x7fdf96ce
-	SIOCDIFADDR                       = -0x7fdf96e7
-	SIOCDIFGROUP                      = -0x7fdb9677
-	SIOCDIFPHYADDR                    = -0x7fdf96b7
-	SIOCDLIFADDR                      = -0x7de796e2
-	SIOCGETKALIVE                     = -0x3fe7965c
-	SIOCGETLABEL                      = -0x7fdf9666
-	SIOCGETPFLOW                      = -0x3fdf9602
-	SIOCGETPFSYNC                     = -0x3fdf9608
-	SIOCGETSGCNT                      = -0x3feb8acc
-	SIOCGETVIFCNT                     = -0x3feb8acd
-	SIOCGETVLANPRIO                   = -0x3fdf9670
+	SIOCBRDGADD                       = 0x8054693c
+	SIOCBRDGADDS                      = 0x80546941
+	SIOCBRDGARL                       = 0x806e694d
+	SIOCBRDGDADDR                     = 0x80286947
+	SIOCBRDGDEL                       = 0x8054693d
+	SIOCBRDGDELS                      = 0x80546942
+	SIOCBRDGFLUSH                     = 0x80546948
+	SIOCBRDGFRL                       = 0x806e694e
+	SIOCBRDGGCACHE                    = 0xc0146941
+	SIOCBRDGGFD                       = 0xc0146952
+	SIOCBRDGGHT                       = 0xc0146951
+	SIOCBRDGGIFFLGS                   = 0xc054693e
+	SIOCBRDGGMA                       = 0xc0146953
+	SIOCBRDGGPARAM                    = 0xc0386958
+	SIOCBRDGGGPRI                     = 0xc0146950
+	SIOCBRDGGRL                       = 0xc028694f
+	SIOCBRDGGSIFS                     = 0xc054693c
+	SIOCBRDGGTO                       = 0xc0146946
+	SIOCBRDGIFS                       = 0xc0546942
+	SIOCBRDGRTS                       = 0xc0186943
+	SIOCBRDGSADDR                     = 0xc0286944
+	SIOCBRDGSCACHE                    = 0x80146940
+	SIOCBRDGSFD                       = 0x80146952
+	SIOCBRDGSHT                       = 0x80146951
+	SIOCBRDGSIFCOST                   = 0x80546955
+	SIOCBRDGSIFFLGS                   = 0x8054693f
+	SIOCBRDGSIFPRIO                   = 0x80546954
+	SIOCBRDGSMA                       = 0x80146953
+	SIOCBRDGSPRI                      = 0x80146950
+	SIOCBRDGSPROTO                    = 0x8014695a
+	SIOCBRDGSTO                       = 0x80146945
+	SIOCBRDGSTXHC                     = 0x80146959
+	SIOCDELMULTI                      = 0x80206932
+	SIOCDIFADDR                       = 0x80206919
+	SIOCDIFGROUP                      = 0x80246989
+	SIOCDIFPHYADDR                    = 0x80206949
+	SIOCDLIFADDR                      = 0x8218691e
+	SIOCGETKALIVE                     = 0xc01869a4
+	SIOCGETLABEL                      = 0x8020699a
+	SIOCGETPFLOW                      = 0xc02069fe
+	SIOCGETPFSYNC                     = 0xc02069f8
+	SIOCGETSGCNT                      = 0xc0147534
+	SIOCGETVIFCNT                     = 0xc0147533
+	SIOCGETVLANPRIO                   = 0xc0206990
 \tSIOCGHIWAT                        = 0x40047301
-	SIOCGIFADDR                       = -0x3fdf96df
-	SIOCGIFASYNCMAP                   = -0x3fdf9684
-	SIOCGIFBRDADDR                    = -0x3fdf96dd
-	SIOCGIFCONF                       = -0x3ff796dc
-	SIOCGIFDATA                       = -0x3fdf96e5
-	SIOCGIFDESCR                      = -0x3fdf967f
-	SIOCGIFDSTADDR                    = -0x3fdf96de
-	SIOCGIFFLAGS                      = -0x3fdf96ef
-	SIOCGIFGATTR                      = -0x3fdb9675
-	SIOCGIFGENERIC                    = -0x3fdf96c6
-	SIOCGIFGMEMB                      = -0x3fdb9676
-	SIOCGIFGROUP                      = -0x3fdb9678
-	SIOCGIFMEDIA                      = -0x3fd796ca
-	SIOCGIFMETRIC                     = -0x3fdf96e9
-	SIOCGIFMTU                        = -0x3fdf9682
-	SIOCGIFNETMASK                    = -0x3fdf96db
-	SIOCGIFPDSTADDR                   = -0x3fdf96b8
-	SIOCGIFPRIORITY                   = -0x3fdf9664
-	SIOCGIFPSRCADDR                   = -0x3fdf96b9
-	SIOCGIFRDOMAIN                    = -0x3fdf9660
-	SIOCGIFRTLABEL                    = -0x3fdf967d
-	SIOCGIFTIMESLOT                   = -0x3fdf967a
-	SIOCGIFXFLAGS                     = -0x3fdf9662
-	SIOCGLIFADDR                      = -0x3de796e3
-	SIOCGLIFPHYADDR                   = -0x3de796b5
-	SIOCGLIFPHYRTABLE                 = -0x3fdf965e
+	SIOCGIFADDR                       = 0xc0206921
+	SIOCGIFASYNCMAP                   = 0xc020697c
+	SIOCGIFBRDADDR                    = 0xc0206923
+	SIOCGIFCONF                       = 0xc0086924
+	SIOCGIFDATA                       = 0xc020691b
+	SIOCGIFDESCR                      = 0xc0206981
+	SIOCGIFDSTADDR                    = 0xc0206922
+	SIOCGIFFLAGS                      = 0xc0206911
+	SIOCGIFGATTR                      = 0xc024698b
+	SIOCGIFGENERIC                    = 0xc020693a
+	SIOCGIFGMEMB                      = 0xc024698a
+	SIOCGIFGROUP                      = 0xc0246988
+	SIOCGIFMEDIA                      = 0xc0286936
+	SIOCGIFMETRIC                     = 0xc0206917
+	SIOCGIFMTU                        = 0xc020697e
+	SIOCGIFNETMASK                    = 0xc0206925
+	SIOCGIFPDSTADDR                   = 0xc0206948
+	SIOCGIFPRIORITY                   = 0xc020699c
+	SIOCGIFPSRCADDR                   = 0xc0206947
+	SIOCGIFRDOMAIN                    = 0xc02069a0
+	SIOCGIFRTLABEL                    = 0xc0206983
+	SIOCGIFTIMESLOT                   = 0xc0206986
+	SIOCGIFXFLAGS                     = 0xc020699e
+	SIOCGLIFADDR                      = 0xc218691d
+	SIOCGLIFPHYADDR                   = 0xc218694b
+	SIOCGLIFPHYRTABLE                 = 0xc02069a2
 \tSIOCGLOWAT                        = 0x40047303
 \tSIOCGPGRP                         = 0x40047309
-	SIOCGVH                           = -0x3fdf960a
-	SIOCIFCREATE                      = -0x7fdf9686
-	SIOCIFDESTROY                     = -0x7fdf9687
-	SIOCIFGCLONERS                    = -0x3ff39688
-	SIOCSETKALIVE                     = -0x7fe7965d
-	SIOCSETLABEL                      = -0x7fdf9667
-	SIOCSETPFLOW                      = -0x7fdf9603
-	SIOCSETPFSYNC                     = -0x7fdf9609
-	SIOCSETVLANPRIO                   = -0x7fdf9671
-	SIOCSHIWAT                        = -0x7ffb8d00
-	SIOCSIFADDR                       = -0x7fdf96f4
-	SIOCSIFASYNCMAP                   = -0x7fdf9683
-	SIOCSIFBRDADDR                    = -0x7fdf96ed
-	SIOCSIFDESCR                      = -0x7fdf9680
-	SIOCSIFDSTADDR                    = -0x7fdf96f2
-	SIOCSIFFLAGS                      = -0x7fdf96f0
-	SIOCSIFGATTR                      = -0x7fdb9674
-	SIOCSIFGENERIC                    = -0x7fdf96c7
-	SIOCSIFLLADDR                     = -0x7fdf96e1
-	SIOCSIFMEDIA                      = -0x3fdf96cb
-	SIOCSIFMETRIC                     = -0x7fdf96e8
-	SIOCSIFMTU                        = -0x7fdf9681
-	SIOCSIFNETMASK                    = -0x7fdf96ea
-	SIOCSIFPHYADDR                    = -0x7fbf96ba
-	SIOCSIFPRIORITY                   = -0x7fdf9665
-	SIOCSIFRDOMAIN                    = -0x7fdf9661
-	SIOCSIFRTLABEL                    = -0x7fdf967e
-	SIOCSIFTIMESLOT                   = -0x7fdf967b
-	SIOCSIFXFLAGS                     = -0x7fdf9663
-	SIOCSLIFPHYADDR                   = -0x7de796b6
-	SIOCSLIFPHYRTABLE                 = -0x7fdf965f
-	SIOCSLOWAT                        = -0x7ffb8cfe
-	SIOCSPGRP                         = -0x7ffb8cf8
-	SIOCSVH                           = -0x3fdf960b
+	SIOCGVH                           = 0xc02069f6
+	SIOCIFCREATE                      = 0x8020697a
+	SIOCIFDESTROY                     = 0x80206979
+	SIOCIFGCLONERS                    = 0xc00c6978
+	SIOCSETKALIVE                     = 0x801869a3
+	SIOCSETLABEL                      = 0x80206999
+	SIOCSETPFLOW                      = 0x802069fd
+	SIOCSETPFSYNC                     = 0x802069f7
+	SIOCSETVLANPRIO                   = 0x8020698f
+	SIOCSHIWAT                        = 0x80047300
+	SIOCSIFADDR                       = 0x8020690c
+	SIOCSIFASYNCMAP                   = 0x8020697d
+	SIOCSIFBRDADDR                    = 0x80206913
+	SIOCSIFDESCR                      = 0x80206980
+	SIOCSIFDSTADDR                    = 0x8020690e
+	SIOCSIFFLAGS                      = 0x80206910
+	SIOCSIFGATTR                      = 0x8024698c
+	SIOCSIFGENERIC                    = 0x80206939
+	SIOCSIFLLADDR                     = 0x8020691f
+	SIOCSIFMEDIA                      = 0xc0206935
+	SIOCSIFMETRIC                     = 0x80206918
+	SIOCSIFMTU                        = 0x8020697f
+	SIOCSIFNETMASK                    = 0x80206916
+	SIOCSIFPHYADDR                    = 0x80406946
+	SIOCSIFPRIORITY                   = 0x8020699b
+	SIOCSIFRDOMAIN                    = 0x8020699f
+	SIOCSIFRTLABEL                    = 0x80206982
+	SIOCSIFTIMESLOT                   = 0x80206985
+	SIOCSIFXFLAGS                     = 0x8020699d
+	SIOCSLIFPHYADDR                   = 0x8218694a
+	SIOCSLIFPHYRTABLE                 = 0x802069a1
+	SIOCSLOWAT                        = 0x80047302
+	SIOCSPGRP                         = 0x80047308
+	SIOCSVH                           = 0xc02069f5
 \tSOCK_DGRAM                        = 0x2
 \tSOCK_RAW                          = 0x3
 \tSOCK_RDM                          = 0x4
@@ -1194,28 +1197,28 @@ const (
 	TCP_SACK_ENABLE                   = 0x8
 	TIOCCBRK                          = 0x2000747a
 	TIOCCDTR                          = 0x20007478
-	TIOCCONS                          = -0x7ffb8b9e
+	TIOCCONS                          = 0x80047462
 	TIOCDRAIN                         = 0x2000745e
 	TIOCEXCL                          = 0x2000740d
-	TIOCEXT                           = -0x7ffb8ba0
+	TIOCEXT                           = 0x80047460
 	TIOCFLAG_CLOCAL                   = 0x2
 	TIOCFLAG_CRTSCTS                  = 0x4
 	TIOCFLAG_MDMBUF                   = 0x8
 	TIOCFLAG_PPS                      = 0x10
 	TIOCFLAG_SOFTCAR                  = 0x1
-	TIOCFLUSH                         = -0x7ffb8bf0
+	TIOCFLUSH                         = 0x80047410
 	TIOCGETA                          = 0x402c7413
 	TIOCGETD                          = 0x4004741a
 	TIOCGFLAGS                        = 0x4004745d
 	TIOCGPGRP                         = 0x40047477
 	TIOCGTSTAMP                       = 0x4008745b
 	TIOCGWINSZ                        = 0x40087468
-	TIOCMBIC                          = -0x7ffb8b95
-	TIOCMBIS                          = -0x7ffb8b94
+	TIOCMBIC                          = 0x8004746b
+	TIOCMBIS                          = 0x8004746c
 	TIOCMGET                          = 0x4004746a
 	TIOCMODG                          = 0x4004746a
-	TIOCMODS                          = -0x7ffb8b93
-	TIOCMSET                          = -0x7ffb8b93
+	TIOCMODS                          = 0x8004746d
+	TIOCMSET                          = 0x8004746d
 	TIOCM_CAR                         = 0x40
 	TIOCM_CD                          = 0x40
 	TIOCM_CTS                         = 0x20
@@ -1230,7 +1233,7 @@ const (
 	TIOCNOTTY                         = 0x20007471
 	TIOCNXCL                          = 0x2000740e
 	TIOCOUTQ                          = 0x40047473
-	TIOCPKT                           = -0x7ffb8b90
+	TIOCPKT                           = 0x80047470
 	TIOCPKT_DATA                      = 0x0
 	TIOCPKT_DOSTOP                    = 0x20
 	TIOCPKT_FLUSHREAD                 = 0x1
@@ -1239,24 +1242,24 @@ const (
 	TIOCPKT_NOSTOP                    = 0x10
 	TIOCPKT_START                     = 0x8
 	TIOCPKT_STOP                      = 0x4
-	TIOCREMOTE                        = -0x7ffb8b97
+	TIOCREMOTE                        = 0x80047469
 	TIOCSBRK                          = 0x2000747b
 	TIOCSCTTY                         = 0x20007461
 	TIOCSDTR                          = 0x20007479
-	TIOCSETA                          = -0x7fd38bec
-	TIOCSETAF                         = -0x7fd38bea
-	TIOCSETAW                         = -0x7fd38beb
-	TIOCSETD                          = -0x7ffb8be5
-	TIOCSFLAGS                        = -0x7ffb8ba4
-	TIOCSIG                           = -0x7ffb8ba1
-	TIOCSPGRP                         = -0x7ffb8b8a
+	TIOCSETA                          = 0x802c7414
+	TIOCSETAF                         = 0x802c7416
+	TIOCSETAW                         = 0x802c7415
+	TIOCSETD                          = 0x8004741b
+	TIOCSFLAGS                        = 0x8004745c
+	TIOCSIG                           = 0x8004745f
+	TIOCSPGRP                         = 0x80047476
 	TIOCSTART                         = 0x2000746e
-	TIOCSTAT                          = -0x7ffb8b9b
-	TIOCSTI                           = -0x7ffe8b8e
+	TIOCSTAT                          = 0x80047465
+	TIOCSTI                           = 0x80017472
 	TIOCSTOP                          = 0x2000746f
-	TIOCSTSTAMP                       = -0x7ff78ba6
-	TIOCSWINSZ                        = -0x7ff78b99
-	TIOCUCNTL                         = -0x7ffb8b9a
+	TIOCSTSTAMP                       = 0x8008745a
+	TIOCSWINSZ                        = 0x80087467
+	TIOCUCNTL                         = 0x80047466
 \tWALTSIG                           = 0x4
 \tWCONTINUED                        = 0x8
 \tWCOREFLAG                         = 0x80

コアとなるコードの解説

このコミットのコード変更は、constキーワードで定義されたGoの定数リテラルの値を修正することに集約されます。具体的には、負の16進数表現(例: -0x3ff7bd85)を、対応する正の16進数表現(例: 0xc008427b)に置き換えています。

この修正の背後にある原理は、2の補数表現と、Go言語における整数リテラルの型推論にあります。

  1. 2の補数表現: 多くのシステムでは、負の整数は2の補数で表現されます。例えば、32ビットシステムで-10xFFFFFFFFとして表現されます。同様に、ある正の数Xの負の表現-Xは、Xのビットを反転させて1を加えることで得られます。このコミットで修正されている値は、まさにこの2の補数表現の逆変換に相当します。例えば、0xc008427bは、32ビット符号付き整数として解釈されると、その2の補数表現が0x3ff7bd85となり、負の符号を付けて-0x3ff7bd85となります。このコミットは、この逆の操作を行い、本来の符号なしのビットパターンに戻しています。

  2. Go言語の整数リテラル: Go言語では、数値リテラルはデフォルトでその値が収まる最小の型に推論されます。しかし、16進数リテラルが0xで始まり、その値が符号付き整数の範囲を超えたり、最上位ビットが1である場合に、Goのコンパイラがどのように型を推論し、値を解釈するかが重要になります。このケースでは、自動生成されたコードが、C言語のunsigned intunsigned longとして意図された値を、Goのint型(通常は32ビットまたは64ビットの符号付き整数)として解釈してしまい、結果として負の値になっていたと考えられます。

この修正により、Goのsyscallパッケージは、OpenBSD 386環境で期待される正確なビットパターンを持つ定数を使用できるようになります。これにより、ioctlシステムコールなどの低レベルな操作が、OSの期待通りに機能し、Goプログラムの安定性と互換性が向上します。

例えば、BIOCGDLTLISTは、Berkeley Packet Filter (BPF) のioctlコマンドの一つで、データリンクタイプ(DLT)のリストを取得するために使用されます。このコマンドの正確な値は、OSのカーネルが期待する特定のビットパターンを持つ必要があります。誤った値を使用すると、ioctl呼び出しが失敗したり、不正なメモリアクセスを引き起こしたりする可能性があります。この修正は、このような潜在的な問題を解消し、GoプログラムがOpenBSD上でネットワークインターフェースやパケットキャプチャなどの機能を正しく利用できるようにします。

関連リンク

  • Go言語のsyscallパッケージのドキュメント: https://pkg.go.dev/syscall
  • OpenBSDのioctlマニュアルページ (例: man 2 ioctl on OpenBSD system)
  • Go言語のgo tool cgoに関するドキュメント (Goのソースコードリポジトリ内)

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • OpenBSDのシステムプログラミングに関するドキュメント
  • 2の補数表現に関する一般的なコンピュータサイエンスの知識
  • Go言語のsyscallパッケージのソースコード
  • Go言語のgo tool cgoの動作に関する情報
  • GitHubのコミット履歴と関連する議論 (GoのChange-ID 5369076 を含む)
    • https://go.dev/cl/5369076 (GoのGerritレビューシステムへのリンク)
    • このGerritリンクから、このコミットがGoの公式リポジトリにマージされる前のレビュープロセスや議論を追跡できます。
      • 特に、レビューコメントには、なぜこれらの値が負になっていたのか、そしてどのように修正されたのかについての詳細な情報が含まれている可能性があります。
      • 例えば、zerrorsファイルがどのように生成されるか、そしてその生成プロセスにおける特定のOS/アーキテクチャでの問題点などが議論されているかもしれません。
      • この特定の変更リスト(CL)のタイトルは "syscall: fix zerrors for openbsd 386" であり、コミットメッセージと一致しています。
      • レビュー担当者(R=)としてbradfitzrscが挙げられており、彼らはGoプロジェクトの主要な貢献者であるため、この修正の重要性が伺えます。
      • このCLの変更内容を見ると、まさにzerrors_openbsd_386.goファイル内の定数値が修正されていることが確認できます。
      • このCLのレビューコメントには、ioctlコマンドのエンコーディングに関する詳細や、Goのgo tool cgo -godefsがどのようにこれらの値を生成するかについての議論が含まれている可能性があります。
      • 特に、_IO, _IOR, _IOW, _IOWRといったioctlコマンドを構成するマクロが、C言語のヘッダーファイルでどのように定義され、それがGoの定数にどのように変換されるか、という点が議論の焦点となることが多いです。これらのマクロは、コマンドの方向(読み取り/書き込み)やデータサイズをエンコードするためにビットシフトやビット演算を使用します。その結果生成される値が、符号付き整数として解釈されると負になる、という問題が発生したと考えられます。

この詳細な解説は、コミットの技術的な側面を深く理解するために、Go言語の内部構造、OSのシステムコール、そして数値表現に関する知識を統合しています。