From 4cf33e361ada37d8fee9443a258abd167e31d033 Mon Sep 17 00:00:00 2001 From: Iskander Sharipov Date: Tue, 4 Sep 2018 17:17:32 +0300 Subject: [PATCH] cmd/compile/internal/gc: fix mayAffectMemory in esc.go For OINDEX and other Left+Right nodes, we want the whole node to be considered as "may affect memory" if either of Left or Right affect memory. Initial implementation only considered node as such if both Left and Right were non-safe. Change-Id: Icfb965a0b4c24d8f83f3722216db068dad2eba95 Reviewed-on: https://go-review.googlesource.com/133275 Run-TryBot: Iskander Sharipov TryBot-Result: Gobot Gobot Reviewed-by: David Chase --- src/cmd/compile/internal/gc/esc.go | 4 ++-- test/escape_param.go | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/cmd/compile/internal/gc/esc.go b/src/cmd/compile/internal/gc/esc.go index 99f046ad21..9db6c8e0b4 100644 --- a/src/cmd/compile/internal/gc/esc.go +++ b/src/cmd/compile/internal/gc/esc.go @@ -696,9 +696,9 @@ func (e *EscState) mayAffectMemory(n *Node) bool { case OCONV: return e.mayAffectMemory(n.Left) case OINDEX: - return e.mayAffectMemory(n.Left) && e.mayAffectMemory(n.Right) + return e.mayAffectMemory(n.Left) || e.mayAffectMemory(n.Right) case OADD, OSUB, OOR, OXOR, OMUL, OLSH, ORSH, OAND, OANDNOT, ODIV, OMOD: - return e.mayAffectMemory(n.Left) && e.mayAffectMemory(n.Right) + return e.mayAffectMemory(n.Left) || e.mayAffectMemory(n.Right) case ONOT, OCOM, OPLUS, OMINUS, OALIGNOF, OOFFSETOF, OSIZEOF: return e.mayAffectMemory(n.Left) default: diff --git a/test/escape_param.go b/test/escape_param.go index 4eb96dff9b..dff13b6f7c 100644 --- a/test/escape_param.go +++ b/test/escape_param.go @@ -11,6 +11,8 @@ package escape +func zero() int { return 0 } + var sink interface{} // in -> out @@ -62,6 +64,12 @@ func paramArraySelfAssign(p *PairOfPairs) { // ERROR "p does not escape" p.pairs[0] = p.pairs[1] // ERROR "ignoring self-assignment in p.pairs\[0\] = p.pairs\[1\]" } +func paramArraySelfAssignUnsafeIndex(p *PairOfPairs) { // ERROR "leaking param content: p" + // Function call inside index disables self-assignment case to trigger. + p.pairs[zero()] = p.pairs[1] + p.pairs[zero()+1] = p.pairs[1] +} + type PairOfPairs struct { pairs [2]*Pair } -- 2.48.1