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

[インデックス 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拡張が行われています。

  1. crypto/subtle パッケージの機能強化: 暗号学的操作におけるサイドチャネル攻撃対策として、定数時間比較を行う関数が追加されたと考えられます。
  2. log/syslog パッケージの拡張: システムロギング機能が強化され、より多くのログレベル定数や、異なるOS/アーキテクチャでのSyslogへの対応が追加された可能性があります。
  3. 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の標準ライブラリの以下の領域における拡張を示しています。

  1. crypto/subtle パッケージ:

    • func ConstantTimeLessOrEq(int, int) int: この関数は、2つの整数を定数時間で比較し、最初の引数が2番目の引数以下であれば1を、そうでなければ0を返します。これは、暗号学的アルゴリズムにおいて、比較結果が処理時間に影響を与えないようにするために重要です。
  2. 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機能をより包括的にサポートすることを示しています。

  3. 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の syscalllog/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系システムでより深く統合され、低レベルな操作を直接行えるようになることを意味します。

関連リンク

参考にした情報源リンク