[インデックス 16360] ファイルの概要
このコミットは、Go言語の次期リリースで導入されるAPI変更を記録する api/next.txt
ファイルを更新するものです。具体的には、crypto/subtle
パッケージに新しい関数が追加され、log/syslog
および syscall
パッケージに多数の定数、関数、メソッドが、様々なオペレーティングシステム(FreeBSD, Linux, NetBSD, OpenBSD)およびアーキテクチャ(386, amd64, arm, arm-cgo)向けに追加されています。これは、Go言語がサポートするプラットフォームにおけるシステムレベルの機能とロギング機能の拡張を反映しています。
コミット
commit c3294049c37066f946360e7cefbb89fcfe294300
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date: Tue May 21 09:11:11 2013 -0700
api: update next.txt
R=minux.ma
CC=golang-dev
https://golang.org/cl/9459047
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/c3294049c37066f946360e7cefbb89fcfe294300
元コミット内容
api: update next.txt
このコミットは、Go言語のAPI定義ファイルである next.txt
を更新し、次期リリースで導入される新しいAPI要素を反映させることを目的としています。
変更の背景
Go言語の開発プロセスにおいて、新しい機能やプラットフォームサポートが追加される際、その変更がGoの公開APIに影響を与える場合があります。api/next.txt
ファイルは、Goの次期メジャーリリースで導入される予定のAPI変更を追跡するために使用されます。このファイルは、Goの互換性ガイドラインに沿って、既存のコードが新しいGoバージョンでも動作することを保証するために重要な役割を果たします。
このコミットでは、特に以下の領域でのAPI拡張が行われています。
crypto/subtle
パッケージの機能強化: 暗号学的操作におけるサイドチャネル攻撃対策として、定数時間比較を行う関数が追加されたと考えられます。log/syslog
パッケージの拡張: システムロギング機能が強化され、より多くのログレベル定数や、異なるOS/アーキテクチャでのSyslogへの対応が追加された可能性があります。syscall
パッケージの広範な更新: Goがサポートする様々なオペレーティングシステム(FreeBSD, Linux, NetBSD, OpenBSD)およびCPUアーキテクチャ(386, amd64, arm, arm-cgo)向けに、多数のシステムコール関連定数や構造体が追加されています。これは、Goプログラムがこれらのプラットフォームの低レベルなシステム機能にアクセスするための基盤を強化するものです。
これらの変更は、Go言語がより多様な環境で動作し、より高度なシステムプログラミングやセキュリティ関連のタスクを効率的に実行できるようにするための継続的な取り組みの一環です。
前提知識の解説
api/next.txt
と Go の API 互換性
Go言語は、その厳格なGo 1 互換性保証で知られています。これは、Go 1.x リリースで書かれたプログラムは、Go 1.y (y > x) リリースでもコンパイルされ、動作することを保証するものです。この互換性を維持するために、Goの公開API(エクスポートされた関数、型、定数、変数、メソッドなど)の変更は厳しく管理されます。
api/next.txt
ファイルは、Goの次期リリースで追加される予定の新しい公開API要素をリストアップするために使用されます。このファイルは、Goのビルドシステムによって自動的に生成または更新され、APIの変更が意図的であり、互換性ガイドラインに沿っていることを確認するのに役立ちます。開発者は、このファイルを通じて、将来のGoバージョンで利用可能になるAPIを事前に確認できます。
crypto/subtle
パッケージ
crypto/subtle
パッケージは、暗号学的操作においてサイドチャネル攻撃(特にタイミング攻撃)を防ぐための「定数時間(constant-time)」操作を提供するGoの標準ライブラリパッケージです。タイミング攻撃とは、プログラムの実行時間が入力データによって変化することを利用して、秘密情報を推測する攻撃手法です。ConstantTimeLessOrEq
のような関数は、比較対象の値によらず常に同じ時間で実行されるように設計されており、このような攻撃を防ぐのに役立ちます。
log/syslog
パッケージ
log/syslog
パッケージは、Unix系システムで標準的なロギングプロトコルであるSyslogプロトコルを介してログメッセージを送信するための機能を提供します。Syslogは、システムイベント、エラー、デバッグ情報などを一元的に管理するための仕組みです。このパッケージは、Syslogサーバーへの接続、ログレベル(緊急、警告、情報など)の設定、およびメッセージの送信を可能にします。
syscall
パッケージ
syscall
パッケージは、Goプログラムからオペレーティングシステムの低レベルなシステムコールに直接アクセスするための機能を提供します。システムコールは、ファイルI/O、ネットワーク通信、プロセス管理、メモリ管理など、OSカーネルが提供する基本的なサービスを利用するためのインターフェースです。syscall
パッケージは、OS固有の定数(例: ファイルパーミッション、ソケットオプション、エラーコード)、構造体、およびシステムコールを呼び出すための関数を含んでいます。Goのクロスプラットフォーム対応のため、このパッケージは各OSおよびアーキテクチャに特化した実装を持っています。
技術的詳細
このコミットの主要な変更は、api/next.txt
に大量の新しいAPIエントリが追加されたことです。これらのエントリは、Goの標準ライブラリの以下の領域における拡張を示しています。
-
crypto/subtle
パッケージ:func ConstantTimeLessOrEq(int, int) int
: この関数は、2つの整数を定数時間で比較し、最初の引数が2番目の引数以下であれば1を、そうでなければ0を返します。これは、暗号学的アルゴリズムにおいて、比較結果が処理時間に影響を与えないようにするために重要です。
-
log/syslog
パッケージ:const LOG_ALERT Priority
,LOG_AUTH Priority
, ...,LOG_WARNING Priority
: Syslogプロトコルで定義されている様々なログレベル(Priority)定数が追加されています。これにより、より詳細なログ分類が可能になります。func Dial(string, string, Priority, string) (*Writer, error)
: Syslogサーバーへの接続を確立し、ログを書き込むためのWriter
を返す関数です。func New(Priority, string) (*Writer, error)
: ローカルのSyslogデーモンに接続し、ログを書き込むためのWriter
を返す関数です。func NewLogger(Priority, int) (*log.Logger, error)
: 標準のlog.Logger
インターフェースに適合するSyslogロガーを作成する関数です。method (*Writer) Alert(string) error
,Crit(string) error
, ...,Warning(string) error
:Writer
型に、各ログレベルに対応するメッセージ送信メソッドが追加されています。method (*Writer) Close() error
:Writer
を閉じるメソッドです。method (*Writer) Write([]uint8) (int, error)
:io.Writer
インターフェースを実装するためのメソッドで、バイトスライスをSyslogに書き込みます。type Priority int
: Syslogの優先度を表す型です。type Writer struct
: Syslogへの書き込みを管理する構造体です。
これらの
log/syslog
の変更は、FreeBSD (386, amd64, arm, arm-cgo), Linux (arm-cgo), NetBSD (386, amd64, arm, arm-cgo), OpenBSD (386, amd64, arm, arm-cgo) など、複数のOSおよびアーキテクチャにわたって適用されています。これは、GoがこれらのプラットフォームでSyslog機能をより包括的にサポートすることを示しています。 -
syscall
パッケージ:syscall
パッケージへの変更は非常に広範であり、Goがサポートする様々なOSおよびアーキテクチャ(FreeBSD, Linux, NetBSD, OpenBSDの各386, amd64, arm, arm-cgo版)向けに、数千もの新しい定数と一部の構造体が追加されています。これらの定数は、以下のようなシステムプログラミングの様々な側面をカバーしています。- ネットワーク関連:
AF_*
(アドレスファミリー),IPPROTO_*
(IPプロトコル),IPV6_*
(IPv6オプション),IP_*
(IPオプション),SOCK_*
(ソケットタイプ),SO_*
(ソケットオプション),SIOC*
(ソケットI/O制御) など。これにより、Goプログラムがより多様なネットワークプロトコルやソケットオプションを直接操作できるようになります。 - ファイルシステム関連:
DT_*
(ディレクトリエンティティタイプ),F_*
(ファイル制御コマンド),O_*
(ファイルオープンフラグ),LOCK_*
(ファイルロック) など。 - プロセス管理:
PTRACE_*
(プロセス追跡),RLIMIT_*
(リソース制限),SYS_*
(システムコール番号) など。 - 端末制御:
BRKINT
,ECHO
,ICANON
,IXON
などの端末I/O制御定数。 - kqueue/イベント通知:
EVFILT_*
(イベントフィルター),EV_*
(イベントフラグ),NOTE_*
(kqueueノート) など。FreeBSDやNetBSDなどで使用されるkqueueインターフェースのサポートを強化します。 - メモリ管理:
MADV_*
(メモリ助言),MAP_*
(メモリマップフラグ),PROT_*
(メモリ保護フラグ) など。 - ルーティング:
RTAX_*
,RTA_*
,RTF_*
,RTM_*
,RTV_*
などのルーティングテーブル関連定数。 - シグナル:
SIG*
(シグナル番号) など。
これらの追加は、Goが各OSのネイティブなシステムコールインターフェースをより完全にラップし、Goプログラムが低レベルなシステムリソースをより細かく制御できるようにするためのものです。特に、異なるOSやアーキテクチャ間でシステムコール番号や定数が異なるため、それぞれの環境に合わせた定義が必要となります。
- ネットワーク関連:
コアとなるコードの変更箇所
このコミットのコアとなる変更は、api/next.txt
ファイルへの大量の行追加です。
--- a/api/next.txt
+++ b/api/next.txt
@@ -0,0 +1,31250 @@
+pkg crypto/subtle, func ConstantTimeLessOrEq(int, int) int
+pkg log/syslog (freebsd-386-cgo), const LOG_ALERT Priority
+pkg log/syslog (freebsd-386-cgo), const LOG_AUTH Priority
... (以下、約3万行の追加)
この差分は、api/next.txt
が以前は空であったか、または非常に小さかった状態から、一気に31250行もの新しいAPIエントリが追加されたことを示しています。
コアとなるコードの解説
api/next.txt
ファイルの各行は、Goの公開APIに追加される新しい要素を記述しています。フォーマットは通常 pkg <パッケージ名>, <要素の種類> <要素名> <型/シグネチャ>
となっています。
-
pkg crypto/subtle, func ConstantTimeLessOrEq(int, int) int
:pkg crypto/subtle
:crypto/subtle
パッケージに属することを示します。func ConstantTimeLessOrEq(int, int) int
:ConstantTimeLessOrEq
という名前の関数が追加され、2つのint
型引数を取り、int
型の値を返すことを示します。
-
pkg log/syslog (freebsd-386-cgo), const LOG_ALERT Priority
:pkg log/syslog
:log/syslog
パッケージに属することを示します。(freebsd-386-cgo)
: このAPI要素が、FreeBSDオペレーティングシステムの386アーキテクチャ(Cgoを使用)に特有のものであることを示します。Goのsyscall
やlog/syslog
のような低レベルパッケージでは、OSやアーキテクチャによって利用可能な定数や関数が異なるため、このようにプラットフォーム固有の記述がされます。const LOG_ALERT Priority
:LOG_ALERT
という名前の定数が追加され、その型がPriority
であることを示します。
-
pkg syscall (freebsd-386-cgo), const AF_APPLETALK ideal-int
:pkg syscall
:syscall
パッケージに属することを示します。(freebsd-386-cgo)
: FreeBSD 386アーキテクチャ(Cgo使用)に特有のものです。const AF_APPLETALK ideal-int
:AF_APPLETALK
という名前の定数が追加され、その型がideal-int
であることを示します。ideal-int
はGoの型システムにおける「型なし整数定数」を意味し、コンパイル時に適切な整数型に推論されます。
これらのエントリは、Goの標準ライブラリが特定のプラットフォームの機能にアクセスするためのインターフェースを拡張し、より多くのシステムレベルの定数や関数をGoプログラムから利用できるようにすることを示しています。特に syscall
パッケージの変更は、Goが様々なUnix系システムでより深く統合され、低レベルな操作を直接行えるようになることを意味します。
関連リンク
- Go 1 互換性保証: https://go.dev/doc/go1compat
- Go言語の
crypto/subtle
パッケージ: https://pkg.go.dev/crypto/subtle - Go言語の
log/syslog
パッケージ: https://pkg.go.dev/log/syslog - Go言語の
syscall
パッケージ: https://pkg.go.dev/syscall
参考にした情報源リンク
- https://go.dev/doc/go1compat
- https://pkg.go.dev/crypto/subtle
- https://pkg.go.dev/log/syslog
- https://pkg.go.dev/syscall
- https://github.com/golang/go/commit/c3294049c37066f946360e7cefbb89fcfe294300
- Goの
api/next.txt
の役割に関する一般的な情報 (Goのソースコードリポジトリや開発者向けドキュメントから得られる知識) - Goの
syscall
パッケージにおけるプラットフォーム固有の定数に関する一般的な知識