[インデックス 17697] ファイルの概要
このコミットは、Go言語の標準ライブラリである html/template
パッケージにおけるバグ修正を扱っています。具体的には、テンプレートのパース後に html/template
の Tree
フィールドが適切に更新されない問題に対処しています。この問題は、エスケープ処理中にエラーが発生した場合に、正しいテンプレートツリーが参照できなくなる可能性がありました。
コミット
commit e2e9d1d6841d4ee937568eeb73a9b43e73e88ad3
Author: Rob Pike <r@golang.org>
Date: Wed Sep 25 10:00:09 2013 +1000
html/template: update the Tree field after parsing new templates
After text/template.Parse, all the templates may have changed, so
we need to set them all back to their unescaped state. The code
did this but (mea culpa) forgot to set the Tree field of the html/template
struct.
Since the Tree is reset during escaping, this only matters if an error
arises during escaping and we want to print a message.
Fixes #6459.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/13877043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/e2e9d1d6841d4ee937568eeb73a9b43e73e88ad3
元コミット内容
html/template: update the Tree field after parsing new templates
text/template.Parse
の後、全てのテンプレートが変更されている可能性があるため、それらをエスケープされていない元の状態に戻す必要がありました。コードはこの処理を行っていましたが、html/template
構造体の Tree
フィールドを設定し忘れていました(私の過失です)。
Tree
はエスケープ中にリセットされるため、この問題はエスケープ中にエラーが発生し、メッセージを出力したい場合にのみ影響します。
Fixes #6459.
R=golang-dev, rsc CC=golang-dev https://golang.org/cl/13877043
変更の背景
このコミットは、Go言語の html/template
パッケージにおける特定のバグ(Issue #6459)を修正するために行われました。html/template
は、ウェブアプリケーションなどでHTMLコンテンツを安全に生成するためのテンプレートエンジンです。クロスサイトスクリプティング(XSS)などのセキュリティ脆弱性を防ぐために、自動的にコンテンツをエスケープする機能を持っています。
問題の核心は、html/template
が内部的に text/template
パッケージを利用している点にあります。text/template.Parse
メソッドが呼び出された後、テンプレートの内部表現(構文木、Tree
フィールド)が更新される可能性があります。しかし、html/template
側で、この Tree
フィールドの更新が適切に行われていませんでした。
具体的には、html/template
はテンプレートをパースした後、セキュリティ上の理由からエスケープ処理を行います。このエスケープ処理の過程で、元の text/template
の Tree
フィールドが参照されることがあります。もし html/template
自身の Tree
フィールドが text/template
の最新の Tree
を指していない場合、特にエスケープ処理中にエラーが発生した際に、誤った構文木を参照してしまう可能性がありました。これにより、エラーメッセージの表示やデバッグが困難になる、あるいは予期せぬ動作を引き起こす可能性がありました。
このバグは、エスケープ処理中にエラーが発生した場合にのみ顕在化するため、通常のテンプレート実行では問題にならないことが多かったと考えられます。しかし、堅牢なシステムを構築するためには、このようなエッジケースも適切に処理される必要があります。
前提知識の解説
このコミットを理解するためには、以下のGo言語のテンプレートパッケージに関する知識が必要です。
-
text/template
パッケージ:- Go言語の基本的なテキストテンプレートエンジンです。任意のテキスト形式の出力を生成するために使用されます。
- テンプレートは、プレースホルダー(例:
{{.Name}}
)や制御構造(例:{{if .Condition}}...{{end}}
)を含むテキストとして定義されます。 - テンプレートがパースされると、その内部表現として「構文木(Parse Tree)」が生成されます。この構文木は、
template.Tree
型で表現され、テンプレートの構造とロジックを抽象化したものです。 Parse
メソッドは、文字列からテンプレートを解析し、その結果として*template.Template
オブジェクトを返します。このオブジェクトは、パースされたテンプレートの構文木を内部に保持しています。
-
html/template
パッケージ:text/template
パッケージを基盤として構築されており、HTMLコンテンツの生成に特化しています。- 最も重要な機能は、自動エスケープ(Auto-escaping)です。これにより、テンプレートに挿入されるデータが、HTMLコンテキスト(例:
<div>
タグ内)、URLコンテキスト(例:href
属性)、JavaScriptコンテキスト(例:<script>
タグ内)などに応じて適切にエスケープされます。これにより、XSS攻撃などのセキュリティ脆弱性を防ぎます。 html/template
のTemplate
構造体は、内部にtext/template.Template
のインスタンス(通常はtext
フィールドとして)を保持しています。html/template
は、text/template
が生成した構文木を基に、さらにHTMLエスケープのための変換処理を行います。この変換後の構文木も、html/template.Template
構造体内のTree
フィールドに保持されます。
-
template.Tree
フィールド:text/template.Template
およびhtml/template.Template
構造体に含まれるフィールドで、パースされたテンプレートの抽象構文木(AST)を指します。- この構文木は、テンプレートの構造、変数、関数呼び出し、制御フローなどを表現しており、テンプレートの実行時に解釈されます。
html/template
の場合、このTree
フィールドは、エスケープ処理後のテンプレートの構文木を保持することが期待されます。
-
テンプレートのパースとエスケープのライフサイクル:
- ユーザーが
html/template.Template.Parse()
メソッドを呼び出すと、まず内部的にtext/template.Template.Parse()
が呼び出され、基本的な構文木が生成されます。 - 次に、
html/template
はこの構文木を走査し、HTMLエスケープルールに基づいてノードを変換します。例えば、{{.UserContent}}
のようなプレースホルダーは、HTMLエンティティに変換されるようにマークされます。 - このエスケープ処理の結果、
html/template.Template
構造体のTree
フィールドが更新され、エスケープ後の構文木を指すようになります。
- ユーザーが
このコミットは、この「エスケープ後の構文木を指すように Tree
フィールドを更新する」という最後のステップが、特定の条件下で欠落していたために発生したバグを修正するものです。
技術的詳細
このコミットの技術的な詳細は、html/template
パッケージが text/template
パッケージの機能をどのように拡張し、その際に発生しうる内部状態の不整合をどのように修正したかにあります。
html/template.Template
構造体は、内部に text/template.Template
型の text
フィールドを持っています。html/template
の Parse
メソッドが呼び出されると、まずこの text
フィールドを通じて text/template
のパース処理が行われます。
// src/pkg/html/template/template.go (変更前)
func (t *Template) Parse(src string) (*Template, error) {
// ...
if tmpl == nil {
tmpl = t.new(name)
}
// Restore our record of this text/template to its unescaped original state.
tmpl.escaped = false
tmpl.text = v // ここで text/template のインスタンスを更新
// tmpl.Tree = v.Tree が欠落していた
// ...
}
上記のコードスニペット(変更前)では、tmpl.text = v
という行で、html/template
の内部にある text/template.Template
インスタンスが、新しくパースされたテンプレート v
に置き換えられています。しかし、html/template.Template
自身の Tree
フィールドは、この v
の Tree
フィールドを指すように更新されていませんでした。
html/template
は、テンプレートをエスケープする際に、html/template.Template
の Tree
フィールドを参照します。もし Parse
処理後に Tree
フィールドが更新されていないと、古い(またはnilの)構文木を参照してしまう可能性があります。コミットメッセージにあるように、「Tree
はエスケープ中にリセットされる」とありますが、これはエスケープ処理が成功した場合の話です。エスケープ処理中にエラーが発生した場合、エラーメッセージを生成する際に、正しい Tree
が参照できないと、デバッグ情報が不正確になるなどの問題が生じます。
このコミットは、tmpl.text = v
の直後に tmpl.Tree = v.Tree
を追加することで、この不整合を解消しています。これにより、html/template
の Template
構造体が常に最新かつ正確な構文木を保持するようになります。
また、escape_test.go
に追加されたテストケースは、このバグが修正されたことを検証しています。
// src/pkg/html/template/escape_test.go (追加されたテスト)
// Check for bug 6459: Tree field was not set in Parse.
if tmpl.Tree != tmpl.text.Tree {
t.Errorf("%s: tree not set properly", test.name)
continue
}
このテストは、html/template.Template
の Tree
フィールドが、その内部の text/template.Template
インスタンス (tmpl.text
) の Tree
フィールドと一致していることを確認しています。これは、Parse
処理が完了した後に、両方の Tree
フィールドが同じ最新の構文木を指しているべきであるという前提に基づいています。このテストの追加により、将来的に同様の回帰バグが発生するのを防ぐことができます。
コアとなるコードの変更箇所
このコミットによる主要なコード変更は、以下の2つのファイルに集中しています。
-
src/pkg/html/template/escape_test.go
:- バグ #6459 の修正を検証するための新しいテストケースが追加されました。
TestEscape
関数内に、パース後のtmpl.Tree
とtmpl.text.Tree
が一致するかどうかを確認するアサーションが追加されています。
--- a/src/pkg/html/template/escape_test.go +++ b/src/pkg/html/template/escape_test.go @@ -655,6 +655,11 @@ func TestEscape(t *testing.T) { for _, test := range tests { tmpl := New(test.name) tmpl = Must(tmpl.Parse(test.input)) + // Check for bug 6459: Tree field was not set in Parse. + if tmpl.Tree != tmpl.text.Tree { + t.Errorf("%s: tree not set properly", test.name) + continue + } b := new(bytes.Buffer) if err := tmpl.Execute(b, data); err != nil { t.Errorf("%s: template execution failed: %s", test.name, err)
-
src/pkg/html/template/template.go
:Template
構造体のParse
メソッド内で、Tree
フィールドの更新が追加されました。
--- a/src/pkg/html/template/template.go +++ b/src/pkg/html/template/template.go @@ -128,8 +128,10 @@ func (t *Template) Parse(src string) (*Template, error) { if tmpl == nil { tmpl = t.new(name) } + // Restore our record of this text/template to its unescaped original state. tmpl.escaped = false tmpl.text = v + tmpl.Tree = v.Tree } return t, nil }
コアとなるコードの解説
src/pkg/html/template/template.go
の変更
このファイルの変更は、html/template.Template
型の Parse
メソッドにあります。このメソッドは、新しいテンプレート文字列を解析し、既存のテンプレートオブジェクトにマージする役割を担っています。
変更前のコードでは、tmpl.text = v
という行で、html/template
が内部的に保持する text/template.Template
のインスタンス (tmpl.text
) を、新しくパースされた text/template.Template
オブジェクト v
に置き換えていました。しかし、html/template.Template
自身の Tree
フィールドは、この v
の Tree
フィールドを指すように更新されていませんでした。
追加された行 tmpl.Tree = v.Tree
は、この問題を修正します。これにより、html/template.Template
オブジェクトの Tree
フィールドが、新しくパースされた text/template
の構文木を正確に参照するようになります。この修正は、特にエスケープ処理中にエラーが発生した場合に、html/template
が正しい構文木を参照して適切なエラーメッセージを生成するために重要です。
コメント // Restore our record of this text/template to its unescaped original state.
は、このブロックの目的が、テンプレートをエスケープされていない元の状態に戻すことであることを示しています。tmpl.escaped = false
もその一部であり、tmpl.Tree = v.Tree
もまた、この「元の状態」を正確に反映させるための重要なステップです。
src/pkg/html/template/escape_test.go
の変更
このファイルの変更は、TestEscape
関数内に新しいテストロジックを追加しています。TestEscape
は、html/template
のエスケープ機能が正しく動作するかどうかを検証するための包括的なテストです。
追加されたコードブロックは、tmpl = Must(tmpl.Parse(test.input))
の直後に実行されます。ここで、tmpl.Tree != tmpl.text.Tree
という条件がチェックされます。
tmpl.Tree
:html/template.Template
オブジェクト自身のTree
フィールド。これは、エスケープ処理後の構文木を指すことが期待されます。tmpl.text.Tree
:html/template.Template
が内部に持つtext/template.Template
オブジェクト (tmpl.text
) のTree
フィールド。これは、text/template
によってパースされた元の構文木を指します。
修正が適用された後、Parse
メソッドは tmpl.Tree
を tmpl.text.Tree
と同じ値に設定するため、この条件は常に false
になるはずです。もし true
になった場合(つまり、両者が一致しない場合)、それはバグ #6459 が再発したことを意味し、テストは t.Errorf
を呼び出して失敗します。
このテストの追加により、html/template
の内部状態の一貫性が保証され、将来の変更によって同様のバグが導入されることを防ぐためのセーフティネットが提供されます。
関連リンク
- Go Issue #6459: https://github.com/golang/go/issues/6459
- Go CL 13877043: https://golang.org/cl/13877043
参考にした情報源リンク
- Go言語の公式ドキュメント:
html/template
パッケージ - Go言語の公式ドキュメント:
text/template
パッケージ - Go言語のソースコード(特に
src/pkg/html/template/
ディレクトリ) - GitHubのGoリポジトリにおけるIssue #6459の議論
- Go言語のコードレビューシステム (Gerrit) におけるCL 13877043の議論# [インデックス 17697] ファイルの概要
このコミットは、Go言語の標準ライブラリである html/template
パッケージにおけるバグ修正を扱っています。具体的には、テンプレートのパース後に html/template
の Tree
フィールドが適切に更新されない問題に対処しています。この問題は、エスケープ処理中にエラーが発生した場合に、正しいテンプレートツリーが参照できなくなる可能性がありました。
コミット
commit e2e9d1d6841d4ee937568eeb73a9b43e73e88ad3
Author: Rob Pike <r@golang.org>
Date: Wed Sep 25 10:00:09 2013 +1000
html/template: update the Tree field after parsing new templates
After text/template.Parse, all the templates may have changed, so
we need to set them all back to their unescaped state. The code
did this but (mea culpa) forgot to set the Tree field of the html/template
struct.
Since the Tree is reset during escaping, this only matters if an error
arises during escaping and we want to print a message.
Fixes #6459.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/13877043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/e2e9d1d6841d4ee937568eeb73a9b43e73e88ad3
元コミット内容
html/template: update the Tree field after parsing new templates
text/template.Parse
の後、全てのテンプレートが変更されている可能性があるため、それらをエスケープされていない元の状態に戻す必要がありました。コードはこの処理を行っていましたが、html/template
構造体の Tree
フィールドを設定し忘れていました(私の過失です)。
Tree
はエスケープ中にリセットされるため、この問題はエスケープ中にエラーが発生し、メッセージを出力したい場合にのみ影響します。
Fixes #6459.
R=golang-dev, rsc CC=golang-dev https://golang.org/cl/13877043
変更の背景
このコミットは、Go言語の html/template
パッケージにおける特定のバグ(Issue #6459)を修正するために行われました。html/template
は、ウェブアプリケーションなどでHTMLコンテンツを安全に生成するためのテンプレートエンジンです。クロスサイトスクリプティング(XSS)などのセキュリティ脆弱性を防ぐために、自動的にコンテンツをエスケープする機能を持っています。
問題の核心は、html/template
が内部的に text/template
パッケージを利用している点にあります。text/template.Parse
メソッドが呼び出された後、テンプレートの内部表現(構文木、Tree
フィールド)が更新される可能性があります。しかし、html/template
側で、この Tree
フィールドの更新が適切に行われていませんでした。
具体的には、html/template
はテンプレートをパースした後、セキュリティ上の理由からエスケープ処理を行います。このエスケープ処理の過程で、元の text/template
の Tree
フィールドが参照されることがあります。もし html/template
自身の Tree
フィールドが text/template
の最新の Tree
を指していない場合、特にエスケープ処理中にエラーが発生した際に、誤った構文木を参照してしまう可能性がありました。これにより、エラーメッセージの表示やデバッグが困難になる、あるいは予期せぬ動作を引き起こす可能性がありました。
このバグは、エスケープ処理中にエラーが発生した場合にのみ顕在化するため、通常のテンプレート実行では問題にならないことが多かったと考えられます。しかし、堅牢なシステムを構築するためには、このようなエッジケースも適切に処理される必要があります。
前提知識の解説
このコミットを理解するためには、以下のGo言語のテンプレートパッケージに関する知識が必要です。
-
text/template
パッケージ:- Go言語の基本的なテキストテンプレートエンジンです。任意のテキスト形式の出力を生成するために使用されます。
- テンプレートは、プレースホルダー(例:
{{.Name}}
)や制御構造(例:{{if .Condition}}...{{end}}
)を含むテキストとして定義されます。 - テンプレートがパースされると、その内部表現として「構文木(Parse Tree)」が生成されます。この構文木は、
template.Tree
型で表現され、テンプレートの構造とロジックを抽象化したものです。 Parse
メソッドは、文字列からテンプレートを解析し、その結果として*template.Template
オブジェクトを返します。このオブジェクトは、パースされたテンプレートの構文木を内部に保持しています。
-
html/template
パッケージ:text/template
パッケージを基盤として構築されており、HTMLコンテンツの生成に特化しています。- 最も重要な機能は、自動エスケープ(Auto-escaping)です。これにより、テンプレートに挿入されるデータが、HTMLコンテキスト(例:
<div>
タグ内)、URLコンテキスト(例:href
属性)、JavaScriptコンテキスト(例:<script>
タグ内)などに応じて適切にエスケープされます。これにより、XSS攻撃などのセキュリティ脆弱性を防ぎます。 html/template
のTemplate
構造体は、内部にtext/template.Template
のインスタンス(通常はtext
フィールドとして)を保持しています。html/template
は、text/template
が生成した構文木を基に、さらにHTMLエスケープのための変換処理を行います。この変換後の構文木も、html/template.Template
構造体内のTree
フィールドに保持されます。
-
template.Tree
フィールド:text/template.Template
およびhtml/template.Template
構造体に含まれるフィールドで、パースされたテンプレートの抽象構文木(AST)を指します。- この構文木は、テンプレートの構造、変数、関数呼び出し、制御フローなどを表現しており、テンプレートの実行時に解釈されます。
html/template
の場合、このTree
フィールドは、エスケープ処理後のテンプレートの構文木を保持することが期待されます。
-
テンプレートのパースとエスケープのライフサイクル:
- ユーザーが
html/template.Template.Parse()
メソッドを呼び出すと、まず内部的にtext/template.Template.Parse()
が呼び出され、基本的な構文木が生成されます。 - 次に、
html/template
はこの構文木を走査し、HTMLエスケープルールに基づいてノードを変換します。例えば、{{.UserContent}}
のようなプレースホルダーは、HTMLエンティティに変換されるようにマークされます。 - このエスケープ処理の結果、
html/template.Template
のTree
フィールドが更新され、エスケープ後の構文木を指すようになります。
- ユーザーが
このコミットは、この「エスケープ後の構文木を指すように Tree
フィールドを更新する」という最後のステップが、特定の条件下で欠落していたために発生したバグを修正するものです。
技術的詳細
このコミットの技術的な詳細は、html/template
パッケージが text/template
パッケージの機能をどのように拡張し、その際に発生しうる内部状態の不整合をどのように修正したかにあります。
html/template.Template
構造体は、内部に text/template.Template
型の text
フィールドを持っています。html/template
の Parse
メソッドが呼び出されると、まずこの text
フィールドを通じて text/template
のパース処理が行われます。
// src/pkg/html/template/template.go (変更前)
func (t *Template) Parse(src string) (*Template, error) {
// ...
if tmpl == nil {
tmpl = t.new(name)
}
// Restore our record of this text/template to its unescaped original state.
tmpl.escaped = false
tmpl.text = v // ここで text/template のインスタンスを更新
// tmpl.Tree = v.Tree が欠落していた
// ...
}
上記のコードスニペット(変更前)では、tmpl.text = v
という行で、html/template
の内部にある text/template.Template
インスタンスが、新しくパースされたテンプレート v
に置き換えられています。しかし、html/template.Template
自身の Tree
フィールドは、この v
の Tree
フィールドを指すように更新されていませんでした。
html/template
は、テンプレートをエスケープする際に、html/template.Template
の Tree
フィールドを参照します。もし Parse
処理後に Tree
フィールドが更新されていないと、古い(またはnilの)構文木を参照してしまう可能性があります。コミットメッセージにあるように、「Tree
はエスケープ中にリセットされる」とありますが、これはエスケープ処理が成功した場合の話です。エスケープ処理中にエラーが発生した場合、エラーメッセージを生成する際に、正しい Tree
が参照できないと、デバッグ情報が不正確になるなどの問題が生じます。
このコミットは、tmpl.text = v
の直後に tmpl.Tree = v.Tree
を追加することで、この不整合を解消しています。これにより、html/template
の Template
構造体が常に最新かつ正確な構文木を保持するようになります。
また、escape_test.go
に追加されたテストケースは、このバグが修正されたことを検証しています。
// src/pkg/html/template/escape_test.go (追加されたテスト)
// Check for bug 6459: Tree field was not set in Parse.
if tmpl.Tree != tmpl.text.Tree {
t.Errorf("%s: tree not set properly", test.name)
continue
}
このテストは、html/template.Template
の Tree
フィールドが、その内部の text/template.Template
インスタンス (tmpl.text
) の Tree
フィールドと一致していることを確認しています。これは、Parse
処理が完了した後に、両方の Tree
フィールドが同じ最新の構文木を指しているべきであるという前提に基づいています。このテストの追加により、将来的に同様の回帰バグが発生するのを防ぐことができます。
コアとなるコードの変更箇所
このコミットによる主要なコード変更は、以下の2つのファイルに集中しています。
-
src/pkg/html/template/escape_test.go
:- バグ #6459 の修正を検証するための新しいテストケースが追加されました。
TestEscape
関数内に、パース後のtmpl.Tree
とtmpl.text.Tree
が一致するかどうかを確認するアサーションが追加されています。
--- a/src/pkg/html/template/escape_test.go +++ b/src/pkg/html/template/escape_test.go @@ -655,6 +655,11 @@ func TestEscape(t *testing.T) { for _, test := range tests { tmpl := New(test.name) tmpl = Must(tmpl.Parse(test.input)) + // Check for bug 6459: Tree field was not set in Parse. + if tmpl.Tree != tmpl.text.Tree { + t.Errorf("%s: tree not set properly", test.name) + continue + } b := new(bytes.Buffer) if err := tmpl.Execute(b, data); err != nil { t.Errorf("%s: template execution failed: %s", test.name, err)
-
src/pkg/html/template/template.go
:Template
構造体のParse
メソッド内で、Tree
フィールドの更新が追加されました。
--- a/src/pkg/html/template/template.go +++ b/src/pkg/html/template/template.go @@ -128,8 +128,10 @@ func (t *Template) Parse(src string) (*Template, error) { if tmpl == nil { tmpl = t.new(name) } + // Restore our record of this text/template to its unescaped original state. tmpl.escaped = false tmpl.text = v + tmpl.Tree = v.Tree } return t, nil }
コアとなるコードの解説
src/pkg/html/template/template.go
の変更
このファイルの変更は、html/template.Template
型の Parse
メソッドにあります。このメソッドは、新しいテンプレート文字列を解析し、既存のテンプレートオブジェクトにマージする役割を担っています。
変更前のコードでは、tmpl.text = v
という行で、html/template
が内部的に保持する text/template.Template
のインスタンス (tmpl.text
) を、新しくパースされた text/template.Template
オブジェクト v
に置き換えていました。しかし、html/template.Template
自身の Tree
フィールドは、この v
の Tree
フィールドを指すように更新されていませんでした。
追加された行 tmpl.Tree = v.Tree
は、この問題を修正します。これにより、html/template.Template
オブジェクトの Tree
フィールドが、新しくパースされた text/template
の構文木を正確に参照するようになります。この修正は、特にエスケープ処理中にエラーが発生した場合に、html/template
が正しい構文木を参照して適切なエラーメッセージを生成するために重要です。
コメント // Restore our record of this text/template to its unescaped original state.
は、このブロックの目的が、テンプレートをエスケープされていない元の状態に戻すことであることを示しています。tmpl.escaped = false
もその一部であり、tmpl.Tree = v.Tree
もまた、この「元の状態」を正確に反映させるための重要なステップです。
src/pkg/html/template/escape_test.go
の変更
このファイルの変更は、TestEscape
関数内に新しいテストロジックを追加しています。TestEscape
は、html/template
のエスケープ機能が正しく動作するかどうかを検証するための包括的なテストです。
追加されたコードブロックは、tmpl = Must(tmpl.Parse(test.input))
の直後に実行されます。ここで、tmpl.Tree != tmpl.text.Tree
という条件がチェックされます。
tmpl.Tree
:html/template.Template
オブジェクト自身のTree
フィールド。これは、エスケープ処理後の構文木を指すことが期待されます。tmpl.text.Tree
:html/template.Template
が内部に持つtext/template.Template
オブジェクト (tmpl.text
) のTree
フィールド。これは、text/template
によってパースされた元の構文木を指します。
修正が適用された後、Parse
メソッドは tmpl.Tree
を tmpl.text.Tree
と同じ値に設定するため、この条件は常に false
になるはずです。もし true
になった場合(つまり、両者が一致しない場合)、それはバグ #6459 が再発したことを意味し、テストは t.Errorf
を呼び出して失敗します。
このテストの追加により、html/template
の内部状態の一貫性が保証され、将来の変更によって同様のバグが導入されることを防ぐためのセーフティネットが提供されます。
関連リンク
- Go Issue #6459: https://github.com/golang/go/issues/6459
- Go CL 13877043: https://golang.org/cl/13877043
参考にした情報源リンク
- Go言語の公式ドキュメント:
html/template
パッケージ - Go言語の公式ドキュメント:
text/template
パッケージ - Go言語のソースコード(特に
src/pkg/html/template/
ディレクトリ) - GitHubのGoリポジトリにおけるIssue #6459の議論
- Go言語のコードレビューシステム (Gerrit) におけるCL 13877043の議論