From ca4b868e9ae9ef11515a3224a9e311c7437e2c9c Mon Sep 17 00:00:00 2001 From: Dmitriy Vyukov Date: Mon, 17 Dec 2012 12:55:41 +0400 Subject: [PATCH] cmd/gc: racewalk: fix compiler crash The code: func main() { v := make([]int64, 10) i := 1 _ = v[(i*4)/3] } crashes compiler with: Program received signal SIGSEGV, Segmentation fault. 0x000000000043c274 in walkexpr (np=0x7fffffffc9b8, init=0x0) at src/cmd/gc/walk.c:587 587 *init = concat(*init, n->ninit); (gdb) bt #0 0x000000000043c274 in walkexpr (np=0x7fffffffc9b8, init=0x0) at src/cmd/gc/walk.c:587 #1 0x0000000000432d15 in copyexpr (n=0x7ffff7f69a48, t=, init=0x0) at src/cmd/gc/subr.c:2020 #2 0x000000000043f281 in walkdiv (init=0x0, np=0x7fffffffca70) at src/cmd/gc/walk.c:2901 #3 walkexpr (np=0x7ffff7f69760, init=0x0) at src/cmd/gc/walk.c:956 #4 0x000000000043d801 in walkexpr (np=0x7ffff7f69bc0, init=0x0) at src/cmd/gc/walk.c:988 #5 0x000000000043cc9b in walkexpr (np=0x7ffff7f69d38, init=0x0) at src/cmd/gc/walk.c:1068 #6 0x000000000043c50b in walkexpr (np=0x7ffff7f69f50, init=0x0) at src/cmd/gc/walk.c:879 #7 0x000000000043c50b in walkexpr (np=0x7ffff7f6a0c8, init=0x0) at src/cmd/gc/walk.c:879 #8 0x0000000000440a53 in walkexprlist (l=0x7ffff7f6a0c8, init=0x0) at src/cmd/gc/walk.c:357 #9 0x000000000043d0bf in walkexpr (np=0x7fffffffd318, init=0x0) at src/cmd/gc/walk.c:566 #10 0x00000000004402bf in vmkcall (fn=, t=0x0, init=0x0, va=0x7fffffffd368) at src/cmd/gc/walk.c:2275 #11 0x000000000044059a in mkcall (name=, t=0x0, init=0x0) at src/cmd/gc/walk.c:2287 #12 0x000000000042862b in callinstr (np=0x7fffffffd4c8, init=0x7fffffffd568, wr=0, skip=) at src/cmd/gc/racewalk.c:478 #13 0x00000000004288b7 in racewalknode (np=0x7ffff7f68108, init=0x7fffffffd568, wr=0, skip=0) at src/cmd/gc/racewalk.c:287 #14 0x0000000000428781 in racewalknode (np=0x7ffff7f65840, init=0x7fffffffd568, wr=0, skip=0) at src/cmd/gc/racewalk.c:302 #15 0x0000000000428abd in racewalklist (l=0x7ffff7f65840, init=0x0) at src/cmd/gc/racewalk.c:97 #16 0x0000000000428d0b in racewalk (fn=0x7ffff7f5f010) at src/cmd/gc/racewalk.c:63 #17 0x0000000000402b9c in compile (fn=0x7ffff7f5f010) at src/cmd/6g/../gc/pgen.c:67 #18 0x0000000000419f86 in funccompile (n=0x7ffff7f5f010, isclosure=0) at src/cmd/gc/dcl.c:1414 #19 0x0000000000424161 in p9main (argc=, argv=) at src/cmd/gc/lex.c:431 #20 0x0000000000401739 in main (argc=, argv=) at src/lib9/main.c:35 The problem is nil init passed to mkcall(). R=golang-dev, rsc CC=golang-dev https://golang.org/cl/6940045 --- src/cmd/gc/racewalk.c | 3 +-- src/pkg/runtime/race/testdata/regression_test.go | 6 ++++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/cmd/gc/racewalk.c b/src/cmd/gc/racewalk.c index 2d216ec67a..1840c6529e 100644 --- a/src/cmd/gc/racewalk.c +++ b/src/cmd/gc/racewalk.c @@ -475,8 +475,7 @@ callinstr(Node **np, NodeList **init, int wr, int skip) *np = n; } n = treecopy(n); - f = mkcall(wr ? "racewrite" : "raceread", T, nil, uintptraddr(n)); - //typecheck(&f, Etop); + f = mkcall(wr ? "racewrite" : "raceread", T, init, uintptraddr(n)); *init = list(*init, f); return 1; } diff --git a/src/pkg/runtime/race/testdata/regression_test.go b/src/pkg/runtime/race/testdata/regression_test.go index 442379d7ed..c48f7b8600 100644 --- a/src/pkg/runtime/race/testdata/regression_test.go +++ b/src/pkg/runtime/race/testdata/regression_test.go @@ -121,3 +121,9 @@ func TestNoRaceRpcChan(t *testing.T) { t.Fatalf("makeChanCalls %d, expected 1\n", makeChanCalls) } } + +func divInSlice() { + v := make([]int64, 10) + i := 1 + _ = v[(i*4)/3] +} -- 2.48.1