go x/text: 在语言.Matcher中出现索引超出范围的恐慌,

sxissh06  于 6个月前  发布在  Go
关注(0)|答案(5)|浏览(58)

你正在使用的Go版本是什么(go version)?
go 1.9

这个问题在最新的版本中是否重现?
是的

你正在使用什么操作系统和处理器架构(go env)?
amd64, darwin 和 linux。

你做了什么?
language.MustParse接受"lang_ZZ",例如en_ZZ,es_ZZ等,并返回一个有效的标签。但是m.Match(这样的语言标签)在这个查找表中触发了一个“索引超出范围”的恐慌:https://github.com/golang/text/blob/master/language/tables.go#L50
重现问题的示例代码:

package main

import (
	"fmt"
	"golang.org/x/text/language"
)

func main() {
	supportedLanguages := []language.Tag{
		language.English,
		language.Arabic,
		language.BritishEnglish,
		language.Spanish,
		language.French,
		language.Italian,
		language.Japanese,
		language.Korean,
		language.Portuguese,
		language.Russian,
		language.SimplifiedChinese,
		language.TraditionalChinese,
	}

	tl := language.MustParse("en_ZZ")
	fmt.Printf("target language: %v\n", tl)

	m := language.NewMatcher(supportedLanguages)
	_, idx, _ := m.Match(tl)

	fmt.Printf("index matched: %v\n", idx)
}

输出:

target language: en-ZZ
panic: runtime error: index out of range

goroutine 1 [running]:
golang.org/x/text/language.regionGroupDist(0x139005701650135, 0x1650139)
	/Users/yb/go_root/src/golang.org/x/text/language/match.go:677 +0x13d
golang.org/x/text/language.(*bestMatch).update(0xc42003fbf0, 0xc4200722d0, 0x1650139, 0x0, 0x0, 0x101650057)
	/Users/ybi/go_root/src/golang.org/x/text/language/match.go:622 +0x28d
golang.org/x/text/language.(*matcher).getBest(0xc420072270, 0xc42000adc0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0)
	/Users/yb/go_root/src/golang.org/x/text/language/match.go:504 +0x4a0
golang.org/x/text/language.(*matcher).Match(0xc420072270, 0xc42000adc0, 0x1, 0x1, 0x0, 0x0, 0x1161220, 0xc420072270, 0x2d952e1a19cc2e08)
	/Users/yb/go_root/src/golang.org/x/text/language/match.go:83 +0xd4
main.main()
	/Users/yb/test.go:28 +0x4d5
exit status 2

你期望看到什么?
(1) language.MustParse拒绝"lang_ZZ"并抛出错误;
或者
(2) language.MustParse将"lang_ZZ"解析为仅包含"lang"的标签,类似于"lang_UND",例如language.MustParse("en_ZZ")和"en"应该返回相同的结果。
或者
(3) language.Matcher支持ZZ国家代码并正常工作。

你看到了什么?
language.MustParse接受ZZ,但language.Matcher在这一点上崩溃了。

pieyvz9o

pieyvz9o1#

相同的错误在1.10.3 darwin/amd64中重复出现。由于索引错误导致失败:

zd287kbt

zd287kbt2#

这仍然发生在1.11.1 darwin/amd64上。

e4yzc0pl

e4yzc0pl3#

是的,因为它还没有固定。
/cc @mpvl

lnxxn5zx

lnxxn5zx4#

这个问题是否已经修复了?现在已经过去一年了,我使用的是go1.12.4 darwin/amd64版本,但它仍然在我的代码中发生。
输入中到底出了什么问题?也许如果我知道输入中出了什么问题,我就可以筛选出来。
这是我们用于数百个不同人的生产代码,所以我不知道他们每个人发送的是什么内容。

1tu0hz3e

1tu0hz3e5#

不熟悉这段代码,这可能只是一个更大的问题的症状,但看起来恐慌的原因是语言/tables.go文件中区域ToGroups字节数组中的一个字节被删除(意外地?)
golang/text@b85db4f#diff-9b4a7a0caec1562de30551ab14452668L3346
如果有人遇到这个问题,并想尝试一个hacky修复方法,只需fork这个仓库,在字节数组中添加一个额外的零字节。https://github.com/golang/text/blob/master/language/tables.go#L101 并使用fork的仓库

相关问题