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

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

このコミットは、Go言語のランタイムにおけるPlan 9オペレーティングシステム上でのビルド問題を修正するものです。具体的には、src/pkg/runtime/mem_plan9.cファイル内のruntime·SysFault関数の引数名が、その使用箇所と一致していなかったために発生していたコンパイルエラーを解消します。

コミット

commit 092dd4bed26a9e241d629c94734ded2c2cb2f2bd
Author: David du Colombier <0intro@gmail.com>
Date:   Thu Feb 27 09:22:02 2014 +0100

    runtime: fix build on Plan 9
    
    warning: src/pkg/runtime/mem_plan9.c:72 param declared and not used: n
    src/pkg/runtime/mem_plan9.c:73 name not declared: nbytes
    src/pkg/runtime/mem_plan9.c:73 bad in naddr: NAME nbytes<>+0(SB)
    
    LGTM=minux.ma, bradfitz
    R=khr, minux.ma, bradfitz
    CC=golang-codereviews
    https://golang.org/cl/69360043

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

https://github.com/golang/go/commit/092dd4bed26a9e241d629c94734ded2c2cb2f2bd

元コミット内容

このコミットの元々の内容は、GoランタイムがPlan 9上でビルドされる際に発生していたコンパイルエラーの修正です。エラーメッセージは以下の通りでした。

  • warning: src/pkg/runtime/mem_plan9.c:72 param declared and not used: n
  • src/pkg/runtime/mem_plan9.c:73 name not declared: nbytes
  • src/pkg/runtime/mem_plan9.c:73 bad in naddr: NAME nbytes<>+0(SB)

これらのメッセージは、src/pkg/runtime/mem_plan9.cファイル内のruntime·SysFault関数において、引数nが宣言されているにもかかわらず使用されておらず、代わりにnbytesという名前が使用されているが宣言されていない、という矛盾を示しています。これは、引数名が誤っていたことが原因です。

変更の背景

Go言語は、様々なオペレーティングシステムやアーキテクチャをサポートするように設計されています。そのため、特定のプラットフォームに依存する低レベルのコード(ランタイムの一部など)は、プラットフォームごとに異なる実装を持つことがあります。このコミットは、GoランタイムのPlan 9固有のメモリ管理コード(mem_plan9.c)において、引数名の不一致によるコンパイルエラーが発生していたことが背景にあります。

このようなエラーは、通常、コードの移植やリファクタリングの際に発生しやすく、特定のプラットフォームでのみ顕在化することがあります。この場合、runtime·SysFault関数が期待する引数名と、実際にコード内で使用されている引数名が異なっていたため、コンパイラが警告およびエラーを出力していました。

前提知識の解説

Goランタイム (Go Runtime)

Goランタイムは、Goプログラムの実行を管理する低レベルのコンポーネント群です。これには、ガベージコレクション、スケジューラ(ゴルーチンの管理)、メモリ割り当て、システムコールインターフェースなどが含まれます。ランタイムはGoプログラムとオペレーティングシステムの間で橋渡しをする役割を担っており、Go言語の並行処理モデルやメモリ管理の効率性を実現するために不可欠です。ランタイムの一部はGoで書かれていますが、パフォーマンスが重要な部分やOSとの直接的なやり取りが必要な部分はCやアセンブリ言語で書かれています。

Plan 9 from Bell Labs

Plan 9 from Bell Labsは、ベル研究所で開発された分散オペレーティングシステムです。Unixの概念をさらに推し進め、すべてのリソース(ファイル、デバイス、ネットワーク接続など)をファイルシステムとして表現するという哲学を持っています。Go言語の開発者の一部はPlan 9の設計思想に影響を受けており、Goの初期のツールチェインやランタイムにはPlan 9の慣習や設計が反映されている部分があります。

uintptr

uintptrはGo言語の組み込み型で、ポインタを保持するのに十分な大きさの符号なし整数型です。これは、ポインタ演算を行う際や、C言語との相互運用において、ポインタ値を整数として扱う必要がある場合に使用されます。uintptrのサイズは、実行されるシステムのポインタサイズ(32ビットまたは64ビット)に依存します。

USEDマクロ

GoランタイムのCコードでは、USEDというマクロがよく見られます。これは、コンパイラが「宣言されているが使用されていない変数」について警告を出すのを抑制するために使用されます。特に、デバッグビルドや特定のプラットフォームでのみ使用される引数など、コードのすべてのパスで常に使用されるわけではない変数に対して適用されます。このコミットのエラーメッセージにもparam declared and not used: nとあるように、USEDマクロはこのような警告を回避するために重要です。

runtime·SysFault関数

runtime·SysFaultは、Goランタイム内でシステムレベルのフォルト(例えば、メモリ保護違反)を処理するための関数です。オペレーティングシステムがメモリ保護違反などのシグナルをGoプロセスに送信した際に、ランタイムがそれを捕捉し、この関数を呼び出して適切な処理(例えば、パニックの発生やスタックトレースの出力)を行います。この関数はプラットフォーム固有の実装を持つことが多く、mem_plan9.cはそのPlan 9版の実装の一部です。

技術的詳細

このコミットの技術的な詳細は、C言語の関数定義における引数名の不一致と、それがコンパイラに与える影響に集約されます。

src/pkg/runtime/mem_plan9.cファイルには、Plan 9環境におけるGoランタイムのメモリ管理に関連する低レベルのコードが含まれています。問題が発生していたruntime·SysFault関数は、システムコールやメモリ保護に関連する処理を行うためのものです。

元のコードでは、runtime·SysFault関数の定義が以下のようになっていました。

void
runtime·SysFault(void *v, uintptr n)
{
    USED(v, nbytes); // ここで 'nbytes' が使われている
}

ここで、関数定義の引数名はnとなっていますが、関数本体のUSEDマクロ内ではnbytesという名前が使用されています。C言語では、関数定義の引数名と関数本体内で使用される変数の名前は一致している必要があります。この不一致が、Plan 9のコンパイラ(おそらく8c6cといったPlan 9のツールチェインのコンパイラ)によって以下のエラーとして検出されました。

  1. warning: src/pkg/runtime/mem_plan9.c:72 param declared and not used: n: 引数nが宣言されているが、関数本体で一度も使用されていないという警告。
  2. src/pkg/runtime/mem_plan9.c:73 name not declared: nbytes: nbytesという名前が宣言されていないというエラー。これは、コンパイラがnbytesを未定義の変数として扱ったためです。
  3. src/pkg/runtime/mem_plan9.c:73 bad in naddr: NAME nbytes<>+0(SB): これは、nbytesが未定義であることに関連するアセンブラレベルのエラーメッセージで、シンボル解決に失敗していることを示唆しています。

この問題は、単なるタイポ(打ち間違い)か、あるいはコードの変更履歴の中で引数名が変更されたにもかかわらず、関数定義が更新されなかったために発生したと考えられます。修正は非常に単純で、関数定義の引数名をnからnbytesに変更することで、この不一致を解消し、コンパイルエラーを解決しました。

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

変更はsrc/pkg/runtime/mem_plan9.cファイルの一箇所のみです。

--- a/src/pkg/runtime/mem_plan9.c
+++ b/src/pkg/runtime/mem_plan9.c
@@ -68,7 +68,7 @@ runtime·SysMap(void *v, uintptr nbytes, uint64 *stat)
 }
 
 void
-runtime·SysFault(void *v, uintptr n)
+runtime·SysFault(void *v, uintptr nbytes)
 {
 	USED(v, nbytes);
 }

コアとなるコードの解説

この変更は、runtime·SysFault関数のシグネチャ(関数名、引数の型と順序)を修正するものです。

  • 変更前: runtime·SysFault(void *v, uintptr n)
    • 2番目の引数名がnとなっていました。
  • 変更後: runtime·SysFault(void *v, uintptr nbytes)
    • 2番目の引数名がnbytesに変更されました。

この変更により、関数定義の引数名nbytesが、関数本体のUSED(v, nbytes);で使用されているnbytesと一致するようになりました。これにより、コンパイラはnbytesを正しく引数として認識し、未定義の変数として扱わなくなり、結果としてコンパイルエラーが解消されました。

USED(v, nbytes);という行は、前述の通り、コンパイラが未使用の引数に関する警告を抑制するためのものです。この場合、vnbytesという引数が、コードの他の部分で直接使用されていなくても、コンパイラに「これらは意図的に使用されている」と伝える役割を果たします。

この修正は、GoランタイムのPlan 9サポートにおける、特定のプラットフォームでのビルドの健全性を保つための、小さくも重要なバグ修正です。

関連リンク

参考にした情報源リンク

  • Go言語のドキュメント (特にuintptr型について): https://go.dev/doc/
  • Plan 9 from Bell Labsに関する情報: https://9p.io/plan9/
  • C言語の関数と引数に関する一般的な情報 (C言語のコンパイラの動作について): (一般的なC言語の教科書やオンラインリソース)
  • Goランタイムの内部構造に関する情報 (Goのソースコードや関連するブログ記事、論文)
    • 例: "Go's Runtime" by Russ Cox (Goの公式ブログやカンファレンス発表など)
    • Goのソースコード内のsrc/runtimeディレクトリ
  • USEDマクロの一般的な用途 (C言語のコンパイラ警告抑制テクニック): (C言語のプログラミングに関する一般的なリソース)

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

このコミットは、Go言語のランタイムにおけるPlan 9オペレーティングシステム上でのビルド問題を修正するものです。具体的には、src/pkg/runtime/mem_plan9.cファイル内のruntime·SysFault関数の引数名が、その使用箇所と一致していなかったために発生していたコンパイルエラーを解消します。

コミット

commit 092dd4bed26a9e241d629c94734ded2c2cb2f2bd
Author: David du Colombier <0intro@gmail.com>
Date:   Thu Feb 27 09:22:02 2014 +0100

    runtime: fix build on Plan 9
    
    warning: src/pkg/runtime/mem_plan9.c:72 param declared and not used: n
    src/pkg/runtime/mem_plan9.c:73 name not declared: nbytes
    src/pkg/runtime/mem_plan9.c:73 bad in naddr: NAME nbytes<>+0(SB)
    
    LGTM=minux.ma, bradfitz
    R=khr, minux.ma, bradfitz
    CC=golang-codereviews
    https://golang.org/cl/69360043

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

https://github.com/golang/go/commit/092dd4bed26a9e241d629c94734ded2c2cb2f2bd

元コミット内容

このコミットの元々の内容は、GoランタイムがPlan 9上でビルドされる際に発生していたコンパイルエラーの修正です。エラーメッセージは以下の通りでした。

  • warning: src/pkg/runtime/mem_plan9.c:72 param declared and not used: n
  • src/pkg/runtime/mem_plan9.c:73 name not declared: nbytes
  • src/pkg/runtime/mem_plan9.c:73 bad in naddr: NAME nbytes<>+0(SB)

これらのメッセージは、src/pkg/runtime/mem_plan9.cファイル内のruntime·SysFault関数において、引数nが宣言されているにもかかわらず使用されておらず、代わりにnbytesという名前が使用されているが宣言されていない、という矛盾を示しています。これは、引数名が誤っていたことが原因です。

変更の背景

Go言語は、様々なオペレーティングシステムやアーキテクチャをサポートするように設計されています。そのため、特定のプラットフォームに依存する低レベルのコード(ランタイムの一部など)は、プラットフォームごとに異なる実装を持つことがあります。このコミットは、GoランタイムのPlan 9固有のメモリ管理コード(mem_plan9.c)において、引数名の不一致によるコンパイルエラーが発生していたことが背景にあります。

このようなエラーは、通常、コードの移植やリファクタリングの際に発生しやすく、特定のプラットフォームでのみ顕在化することがあります。この場合、runtime·SysFault関数が期待する引数名と、実際にコード内で使用されている引数名が異なっていたため、コンパイラが警告およびエラーを出力していました。

前提知識の解説

Goランタイム (Go Runtime)

Goランタイムは、Goプログラムの実行を管理する低レベルのコンポーネント群です。これには、ガベージコレクション、スケジューラ(ゴルーチンの管理)、メモリ割り当て、システムコールインターフェースなどが含まれます。ランタイムはGoプログラムとオペレーティングシステムの間で橋渡しをする役割を担っており、Go言語の並行処理モデルやメモリ管理の効率性を実現するために不可欠です。ランタイムの一部はGoで書かれていますが、パフォーマンスが重要な部分やOSとの直接的なやり取りが必要な部分はCやアセンブリ言語で書かれています。

Plan 9 from Bell Labs

Plan 9 from Bell Labsは、ベル研究所で開発された分散オペレーティングシステムです。Unixの概念をさらに推し進め、すべてのリソース(ファイル、デバイス、ネットワーク接続など)をファイルシステムとして表現するという哲学を持っています。Go言語の開発者の一部はPlan 9の設計思想に影響を受けており、Goの初期のツールチェインやランタイムにはPlan 9の慣習や設計が反映されている部分があります。

uintptr

uintptrはGo言語の組み込み型で、ポインタを保持するのに十分な大きさの符号なし整数型です。これは、ポインタ演算を行う際や、C言語との相互運用において、ポインタ値を整数として扱う必要がある場合に使用されます。uintptrのサイズは、実行されるシステムのポインタサイズ(32ビットまたは64ビット)に依存します。

USEDマクロ

GoランタイムのCコードでは、USEDというマクロがよく見られます。これは、コンパイラが「宣言されているが使用されていない変数」について警告を出すのを抑制するために使用されます。特に、デバッグビルドや特定のプラットフォームでのみ使用される引数など、コードのすべてのパスで常に使用されるわけではない変数に対して適用されます。このコミットのエラーメッセージにもparam declared and not used: nとあるように、USEDマクロはこのような警告を回避するために重要です。

runtime·SysFault関数

runtime·SysFaultは、Goランタイム内でシステムレベルのフォルト(例えば、メモリ保護違反)を処理するための関数です。オペレーティングシステムがメモリ保護違反などのシグナルをGoプロセスに送信した際に、ランタイムがそれを捕捉し、この関数を呼び出して適切な処理(例えば、パニックの発生やスタックトレースの出力)を行います。この関数はプラットフォーム固有の実装を持つことが多く、mem_plan9.cはそのPlan 9版の実装の一部です。

技術的詳細

このコミットの技術的な詳細は、C言語の関数定義における引数名の不一致と、それがコンパイラに与える影響に集約されます。

src/pkg/runtime/mem_plan9.cファイルには、Plan 9環境におけるGoランタイムのメモリ管理に関連する低レベルのコードが含まれています。問題が発生していたruntime·SysFault関数は、システムコールやメモリ保護に関連する処理を行うためのものです。

元のコードでは、runtime·SysFault関数の定義が以下のようになっていました。

void
runtime·SysFault(void *v, uintptr n)
{
    USED(v, nbytes); // ここで 'nbytes' が使われている
}

ここで、関数定義の引数名はnとなっていますが、関数本体のUSEDマクロ内ではnbytesという名前が使用されています。C言語では、関数定義の引数名と関数本体内で使用される変数の名前は一致している必要があります。この不一致が、Plan 9のコンパイラ(おそらく8c6cといったPlan 9のツールチェインのコンパイラ)によって以下のエラーとして検出されました。

  1. warning: src/pkg/runtime/mem_plan9.c:72 param declared and not used: n: 引数nが宣言されているが、関数本体で一度も使用されていないという警告。
  2. src/pkg/runtime/mem_plan9.c:73 name not declared: nbytes: nbytesという名前が宣言されていないというエラー。これは、コンパイラがnbytesを未定義の変数として扱ったためです。
  3. src/pkg/runtime/mem_plan9.c:73 bad in naddr: NAME nbytes<>+0(SB): これは、nbytesが未定義であることに関連するアセンブラレベルのエラーメッセージで、シンボル解決に失敗していることを示唆しています。

この問題は、単なるタイポ(打ち間違い)か、あるいはコードの変更履歴の中で引数名が変更されたにもかかわらず、関数定義が更新されなかったために発生したと考えられます。修正は非常に単純で、関数定義の引数名をnからnbytesに変更することで、この不一致を解消し、コンパイルエラーを解決しました。

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

変更はsrc/pkg/runtime/mem_plan9.cファイルの一箇所のみです。

--- a/src/pkg/runtime/mem_plan9.c
+++ b/src/pkg/runtime/mem_plan9.c
@@ -68,7 +68,7 @@ runtime·SysMap(void *v, uintptr nbytes, uint64 *stat)
 }
 
 void
-runtime·SysFault(void *v, uintptr n)
+runtime·SysFault(void *v, uintptr nbytes)
 {
 	USED(v, nbytes);
 }

コアとなるコードの解説

この変更は、runtime·SysFault関数のシグネチャ(関数名、引数の型と順序)を修正するものです。

  • 変更前: runtime·SysFault(void *v, uintptr n)
    • 2番目の引数名がnとなっていました。
  • 変更後: runtime·SysFault(void *v, uintptr nbytes)
    • 2番目の引数名がnbytesに変更されました。

この変更により、関数定義の引数名nbytesが、関数本体のUSED(v, nbytes);で使用されているnbytesと一致するようになりました。これにより、コンパイラはnbytesを正しく引数として認識し、未定義の変数として扱わなくなり、結果としてコンパイルエラーが解消されました。

USED(v, nbytes);という行は、前述の通り、コンパイラが未使用の引数に関する警告を抑制するためのものです。この場合、vnbytesという引数が、コードの他の部分で直接使用されていなくても、コンパイラに「これらは意図的に使用されている」と伝える役割を果たします。

この修正は、GoランタイムのPlan 9サポートにおける、特定のプラットフォームでのビルドの健全性を保つための、小さくも重要なバグ修正です。

関連リンク

参考にした情報源リンク

  • Go言語のドキュメント (特にuintptr型について): https://go.dev/doc/
  • Plan 9 from Bell Labsに関する情報: https://9p.io/plan9/
  • C言語の関数と引数に関する一般的な情報 (C言語のコンパイラの動作について): (一般的なC言語の教科書やオンラインリソース)
  • Goランタイムの内部構造に関する情報 (Goのソースコードや関連するブログ記事、論文)
    • 例: "Go's Runtime" by Russ Cox (Goの公式ブログやカンファレンス発表など)
    • Goのソースコード内のsrc/runtimeディレクトリ
  • USEDマクロの一般的な用途 (C言語のコンパイラ警告抑制テクニック): (C言語のプログラミングに関する一般的なリソース)