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

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

このコミットは、Go言語のビルドシステムにおいて、CGOが無効な環境ではデータ競合検出(Race Detector)テストを実行しないようにする変更を導入しています。これにより、CGOに依存するRace Detectorが正しく機能しない環境でのテストの誤検出や失敗を防ぎ、ビルドプロセスの信頼性を向上させます。

コミット

commit 8fadb70cf8d8a2a10673cdcb1441104ce2e437cf
Author: Russ Cox <rsc@golang.org>
Date:   Thu Nov 1 15:13:00 2012 -0400

    build: do not run race tests with cgo disabled
    
    R=dvyukov
    CC=golang-dev
    https://golang.org/cl/6810067

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

https://github.com/golang/go/commit/8fadb70cf8d8a2a10673cdcb1441104ce2e437cf

元コミット内容

commit 8fadb70cf8d8a2a10673cdcb1441104ce2e437cf
Author: Russ Cox <rsc@golang.org>
Date:   Thu Nov 1 15:13:00 2012 -0400

    build: do not run race tests with cgo disabled
    
    R=dvyukov
    CC=golang-dev
    https://golang.org/cl/6810067
---
 src/run.bash | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)\n
diff --git a/src/run.bash b/src/run.bash
index 7fdd637d99..0de36feca4 100755
--- a/src/run.bash
+++ b/src/run.bash
@@ -46,8 +46,8 @@ echo
 echo '# sync -cpu=10'
 go test sync -short -timeout=120s -cpu=10
 
-case "$GOHOSTOS-$GOOS-$GOARCH" in
-linux-linux-amd64 | darwin-darwin-amd64)\
+case "$GOHOSTOS-$GOOS-$GOARCH-$CGO_ENABLED" in
+linux-linux-amd64-1 | darwin-darwin-amd64-1)\
 	echo
 	echo '# Testing race detector.'
 	go test -race -i flag

変更の背景

Go言語のデータ競合検出器(Race Detector)は、並行処理におけるデータ競合を検出するための強力なツールです。しかし、このRace Detectorは内部的にCGO(GoとC言語の相互運用機能)に依存しています。CGOが有効になっていない環境(例えば、CGO_ENABLED=0でビルドされた場合)でRace Detectorを有効にしたテストを実行しようとすると、正しく機能しないか、ビルドエラーやランタイムエラーを引き起こす可能性があります。

このコミットが行われた背景には、Goのビルドおよびテストインフラストラクチャの堅牢性を高める目的があります。特定の環境設定(CGO無効)下でRace Detectorテストが不必要に実行され、その結果として誤った失敗やリソースの無駄が発生するのを防ぐため、この条件分岐が導入されました。これにより、テストスイートの実行がより効率的かつ正確になります。

前提知識の解説

Go Race Detector (データ競合検出器)

Go Race Detectorは、Goプログラム内のデータ競合を検出するためにGoランタイムに組み込まれたツールです。データ競合は、複数のゴルーチンが同時に同じメモリ位置にアクセスし、少なくとも1つのアクセスが書き込みであり、かつそれらのアクセスが同期メカニズムによって順序付けされていない場合に発生します。データ競合は、予測不能なプログラムの動作やバグの一般的な原因となります。

Race Detectorは、プログラムの実行中にメモリアクセスを監視し、競合のパターンを検出すると警告を出力します。Goのテストコマンドに-raceフラグを追加することで有効にできます(例: go test -race ./...)。

CGO

CGOは、GoプログラムからC言語のコードを呼び出したり、C言語のコードからGoの関数を呼び出したりするためのGoの機能です。Goは通常、純粋なGoコードで記述されますが、既存のCライブラリを利用したり、特定のプラットフォーム固有の機能にアクセスしたりする必要がある場合にCGOが使用されます。

CGOを有効にするには、環境変数CGO_ENABLED1に設定します(デフォルトは1)。無効にするには0に設定します。CGOを無効にすると、GoコンパイラはCGOのコードをコンパイルせず、純粋なGoコードのみを扱います。Race Detectorは、その実装の一部でCGOを利用しているため、CGOが無効な環境では機能しません。

src/run.bash スクリプト

src/run.bashは、Goプロジェクトのテストスイートを実行するためのシェルスクリプトです。Goの標準ライブラリやツールのテストは、このスクリプトを通じて実行されることが多く、様々な環境変数やビルド設定に応じてテストの挙動を制御します。このスクリプトは、GoのCI/CDパイプラインや開発者のローカル環境でのテスト実行において重要な役割を果たします。

技術的詳細

このコミットの技術的な核心は、src/run.bashスクリプト内の条件分岐の変更にあります。以前は、Race Detectorテストの実行条件が$GOHOSTOS-$GOOS-$GOARCH(ホストOS-ターゲットOS-ターゲットアーキテクチャ)の組み合わせのみに基づいていました。これは、特定のプラットフォーム(例: linux-linux-amd64darwin-darwin-amd64)でのみRace Detectorテストを実行するという意図でした。

しかし、この条件だけでは、これらのプラットフォームであってもCGO_ENABLED=0が設定されている場合にRace Detectorテストが実行されてしまうという問題がありました。Race DetectorはCGOに依存しているため、CGOが無効な状態でテストを実行しても意味がなく、むしろエラーを引き起こす可能性がありました。

この変更では、case文のパターンに-$CGO_ENABLEDを追加し、さらにlinux-linux-amd64-1darwin-darwin-amd64-1のように、CGO_ENABLED1(有効)であることも条件に含めるようにしました。これにより、Race Detectorテストは、対象のプラットフォームであり、かつCGOが明示的に有効になっている場合にのみ実行されるようになります。

この修正は、Goのビルドシステムがより賢く、環境設定に応じて適切なテストのみを実行するようにするための重要な改善です。

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

--- a/src/run.bash
+++ b/src/run.bash
@@ -46,8 +46,8 @@ echo
 echo '# sync -cpu=10'
 go test sync -short -timeout=120s -cpu=10
 
-case "$GOHOSTOS-$GOOS-$GOARCH" in
-linux-linux-amd64 | darwin-darwin-amd64)\
+case "$GOHOSTOS-$GOOS-$GOARCH-$CGO_ENABLED" in
+linux-linux-amd64-1 | darwin-darwin-amd64-1)\
 	echo
 	echo '# Testing race detector.'
 	go test -race -i flag

コアとなるコードの解説

変更はsrc/run.bashファイル内のcase文にあります。

変更前:

case "$GOHOSTOS-$GOOS-$GOARCH" in
linux-linux-amd64 | darwin-darwin-amd64)
	echo
	echo '# Testing race detector.'
	go test -race -i flag

このコードでは、$GOHOSTOS(ビルドホストのOS)、$GOOS(ターゲットOS)、$GOARCH(ターゲットアーキテクチャ)の組み合わせがlinux-linux-amd64またはdarwin-darwin-amd64である場合に、Race Detectorテスト(go test -race -i flag)が実行されていました。

変更後:

case "$GOHOSTOS-$GOOS-$GOARCH-$CGO_ENABLED" in
linux-linux-amd64-1 | darwin-darwin-amd64-1)
	echo
	echo '# Testing race detector.'
	go test -race -i flag

変更後では、case文の評価対象の文字列に-$CGO_ENABLEDが追加されました。CGO_ENABLEDはCGOが有効な場合は1、無効な場合は0となる環境変数です。 これにより、パターンマッチングはlinux-linux-amd64-1またはdarwin-darwin-amd64-1に対して行われるようになりました。つまり、Race Detectorテストは、以下の両方の条件が満たされた場合にのみ実行されます。

  1. プラットフォームがlinux-linux-amd64またはdarwin-darwin-amd64である。
  2. CGO_ENABLED1(CGOが有効)である。

この修正により、CGOが無効な環境ではRace Detectorテストがスキップされるようになり、テストの実行がより適切かつ効率的になりました。

関連リンク

参考にした情報源リンク

  • 上記のGo言語公式ドキュメント
  • コミットメッセージとdiffの内容
  • Go言語のビルドシステムとテストに関する一般的な知識
  • シェルスクリプト(bash)のcase文に関する知識
  • Goの環境変数に関する知識

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

このコミットは、Go言語のビルドシステムにおいて、CGOが無効な環境ではデータ競合検出(Race Detector)テストを実行しないようにする変更を導入しています。これにより、CGOに依存するRace Detectorが正しく機能しない環境でのテストの誤検出や失敗を防ぎ、ビルドプロセスの信頼性を向上させます。

コミット

commit 8fadb70cf8d8a2a10673cdcb1441104ce2e437cf
Author: Russ Cox <rsc@golang.org>
Date:   Thu Nov 1 15:13:00 2012 -0400

    build: do not run race tests with cgo disabled
    
    R=dvyukov
    CC=golang-dev
    https://golang.org/cl/6810067

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

https://github.com/golang/go/commit/8fadb70cf8d8a2a10673cdcb1441104ce2e437cf

元コミット内容

commit 8fadb70cf8d8a2a10673cdcb1441104ce2e437cf
Author: Russ Cox <rsc@golang.org>
Date:   Thu Nov 1 15:13:00 2012 -0400

    build: do not run race tests with cgo disabled
    
    R=dvyukov
    CC=golang-dev
    https://golang.org/cl/6810067
---
 src/run.bash | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)\n
diff --git a/src/run.bash b/src/run.bash
index 7fdd637d99..0de36feca4 100755
--- a/src/run.bash
+++ b/src/run.bash
@@ -46,8 +46,8 @@ echo
 echo '# sync -cpu=10'
 go test sync -short -timeout=120s -cpu=10
 
-case "$GOHOSTOS-$GOOS-$GOARCH" in
-linux-linux-amd64 | darwin-darwin-amd64)\
+case "$GOHOSTOS-$GOOS-$GOARCH-$CGO_ENABLED" in
+linux-linux-amd64-1 | darwin-darwin-amd64-1)\
 	echo
 	echo '# Testing race detector.'
 	go test -race -i flag

変更の背景

Go言語のデータ競合検出器(Race Detector)は、並行処理におけるデータ競合を検出するための強力なツールです。しかし、このRace Detectorは内部的にCGO(GoとC言語の相互運用機能)に依存しています。具体的には、Race DetectorはC/C++のThreadSanitizerランタイムライブラリを基盤としており、このライブラリの利用にはCGOが必須となります。

CGOが有効になっていない環境(例えば、CGO_ENABLED=0でビルドされた場合)でRace Detectorを有効にしたテストを実行しようとすると、正しく機能しないか、ビルドエラーやランタイムエラーを引き起こす可能性があります。実際、CGO_ENABLED0の状態で-raceフラグを付けてビルドしようとするとエラーが発生します。

このコミットが行われた背景には、Goのビルドおよびテストインフラストラクチャの堅牢性を高める目的があります。特定の環境設定(CGO無効)下でRace Detectorテストが不必要に実行され、その結果として誤った失敗やリソースの無駄が発生するのを防ぐため、この条件分岐が導入されました。これにより、テストスイートの実行がより効率的かつ正確になります。

前提知識の解説

Go Race Detector (データ競合検出器)

Go Race Detectorは、Goプログラム内のデータ競合を検出するためにGoランタイムに組み込まれたツールです。データ競合は、複数のゴルーチンが同時に同じメモリ位置にアクセスし、少なくとも1つのアクセスが書き込みであり、かつそれらのアクセスが同期メカニズムによって順序付けされていない場合に発生します。データ競合は、予測不能なプログラムの動作やバグの一般的な原因となります。

Race Detectorは、プログラムの実行中にメモリアクセスを監視し、競合のパターンを検出すると警告を出力します。Goのテストコマンドに-raceフラグを追加することで有効にできます(例: go test -race ./...)。

CGO

CGOは、GoプログラムからC言語のコードを呼び出したり、C言語のコードからGoの関数を呼び出したりするためのGoの機能です。Goは通常、純粋なGoコードで記述されますが、既存のCライブラリを利用したり、特定のプラットフォーム固有の機能にアクセスしたりする必要がある場合にCGOが使用されます。

CGOを有効にするには、環境変数CGO_ENABLED1に設定します(デフォルトは1)。無効にするには0に設定します。CGOを無効にすると、GoコンパイラはCGOのコードをコンパイルせず、純粋なGoコードのみを扱います。Race Detectorは、その実装の一部でCGOを利用しているため、CGOが無効な環境では機能しません。ほとんどのオペレーティングシステム(Linux、Windows、その他のUnix系システム)では、Race Detectorを機能させるためにCコンパイラがインストールされている必要があります。ただし、Go 1.20以降のmacOSでは、Race DetectorがCGOの依存関係を排除するように書き直されたため、XcodeやCGOを有効にすることなくRace Detectorを有効にしたプログラムをビルドおよび実行できます。

src/run.bash スクリプト

src/run.bashは、Goプロジェクトのテストスイートを実行するためのシェルスクリプトです。Goの標準ライブラリやツールのテストは、このスクリプトを通じて実行されることが多く、様々な環境変数やビルド設定に応じてテストの挙動を制御します。このスクリプトは、GoのCI/CDパイプラインや開発者のローカル環境でのテスト実行において重要な役割を果たします。

技術的詳細

このコミットの技術的な核心は、src/run.bashスクリプト内の条件分岐の変更にあります。以前は、Race Detectorテストの実行条件が$GOHOSTOS-$GOOS-$GOARCH(ホストOS-ターゲットOS-ターゲットアーキテクチャ)の組み合わせのみに基づいていました。これは、特定のプラットフォーム(例: linux-linux-amd64darwin-darwin-amd64)でのみRace Detectorテストを実行するという意図でした。

しかし、この条件だけでは、これらのプラットフォームであってもCGO_ENABLED=0が設定されている場合にRace Detectorテストが実行されてしまうという問題がありました。Race DetectorはCGOに依存しているため、CGOが無効な状態でテストを実行しても意味がなく、むしろエラーを引き起こす可能性がありました。

この変更では、case文のパターンに-$CGO_ENABLEDを追加し、さらにlinux-linux-amd64-1darwin-darwin-amd64-1のように、CGO_ENABLED1(有効)であることも条件に含めるようにしました。これにより、Race Detectorテストは、対象のプラットフォームであり、かつCGOが明示的に有効になっている場合にのみ実行されるようになります。

この修正は、Goのビルドシステムがより賢く、環境設定に応じて適切なテストのみを実行するようにするための重要な改善です。

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

--- a/src/run.bash
+++ b/src/run.bash
@@ -46,8 +46,8 @@ echo
 echo '# sync -cpu=10'
 go test sync -short -timeout=120s -cpu=10
 
-case "$GOHOSTOS-$GOOS-$GOARCH" in
-linux-linux-amd64 | darwin-darwin-amd64)\
+case "$GOHOSTOS-$GOOS-$GOARCH-$CGO_ENABLED" in
+linux-linux-amd64-1 | darwin-darwin-amd64-1)\
 	echo
 	echo '# Testing race detector.'
 	go test -race -i flag

コアとなるコードの解説

変更はsrc/run.bashファイル内のcase文にあります。

変更前:

case "$GOHOSTOS-$GOOS-$GOARCH" in
linux-linux-amd64 | darwin-darwin-amd64)
	echo
	echo '# Testing race detector.'
	go test -race -i flag

このコードでは、$GOHOSTOS(ビルドホストのOS)、$GOOS(ターゲットOS)、$GOARCH(ターゲットアーキテクチャ)の組み合わせがlinux-linux-amd64またはdarwin-darwin-amd64である場合に、Race Detectorテスト(go test -race -i flag)が実行されていました。

変更後:

case "$GOHOSTOS-$GOOS-$GOARCH-$CGO_ENABLED" in
linux-linux-amd64-1 | darwin-darwin-amd64-1)
	echo
	echo '# Testing race detector.'
	go test -race -i flag

変更後では、case文の評価対象の文字列に-$CGO_ENABLEDが追加されました。CGO_ENABLEDはCGOが有効な場合は1、無効な場合は0となる環境変数です。 これにより、パターンマッチングはlinux-linux-amd64-1またはdarwin-darwin-amd64-1に対して行われるようになりました。つまり、Race Detectorテストは、以下の両方の条件が満たされた場合にのみ実行されます。

  1. プラットフォームがlinux-linux-amd64またはdarwin-darwin-amd64である。
  2. CGO_ENABLED1(CGOが有効)である。

この修正により、CGOが無効な環境ではRace Detectorテストがスキップされるようになり、テストの実行がより適切かつ効率的になりました。

関連リンク

参考にした情報源リンク

  • 上記のGo言語公式ドキュメント
  • コミットメッセージとdiffの内容
  • Go言語のビルドシステムとテストに関する一般的な知識
  • シェルスクリプト(bash)のcase文に関する知識
  • Goの環境変数に関する知識
  • Web検索結果: "Go race detector CGO dependency"