转载

Go 1.5 重大 Bug 的自行 patch 方法

Hi,all:

我相信很多人都已经知道了Go 1.5存在一个重大Bug。它的issue在这里: https://github.com/golang/go/issues/12226 。

具体表现为下面这段代码

 package main  import "fmt"  func main() {     if []byte("abc")[0] == []byte("efg")[0] {         fmt.Println("BUG: abc and efg appear to have the same first byte")     } else {         fmt.Println("No bug: abc doesn't start with efg")     } } 

会打印出以 BUG 开头的那行内容。这显然是个严重的错误。

在那个issue的讨论过程中,uli-go提出了一个patch并已经交给golang team来review了。不出意外的话,这个patch会被接受。

这个patch其实很简单,在文件 $GOROOT/src/cmd/compile/internal/gc/cgen.go 中找到2021行:

2018                 Regalloc(&n2, nr.Type, nil) 2019                 Cgen(nr, &n2) 2020                 nr = &n2 2021                 Regfree(&n2) 

复制2021行的代码,然后找到2025行:

2021                 Regalloc(&n1, nl.Type, nil) 2022                 Cgen(&tmp, &n1) 2025                 Regfree(&n1) 

在2025行代码的最后敲回车,并黏贴代码 Regfree(&n2) 。最后删除掉2021行的那行代码。变更之后的代码片段如下:

2017                 var n2 Node 2018                 Regalloc(&n2, nr.Type, nil) 2019                 Cgen(nr, &n2) 2020                 nr = &n2 2021 2022                 Regalloc(&n1, nl.Type, nil) 2023                 Cgen(&tmp, &n1) 2024                 Regfree(&n1) 2025                 Regfree(&n2) 2026         } else { 2027                 var n1 Node 2028                 if !nl.Addable && Ctxt.Arch.Thechar == '8' { 

修改完 cgen.go 这个文件之后,你需要从新编译、安装一遍Go语言的1.5版本。当然首先你需要在机器中有go1.4并把它放置到家目录中(在我的mac中,为这次编译放置的1.4版本的go在这里: /Users/haolin/go1.4),然后运行$GOROOT/src/all.bash。最后就是等待这个脚本运行完成了。在这之后,你可以用本贴开始处的那段程序进行验证。

请注意,这是一个纯手工的hack方法。如果你觉得不保险或者不想自己hack,那么就需要等到1.5.1版本的到来了(据称是9月下旬发布),并请在程序中避免如此比较两个字节切片。

分享到:
总共 4 回复
Go 1.5 重大 Bug 的自行 patch 方法

傅小黑 5小时前 1楼

改改代码,换种写法好了

正文到此结束
Loading...