]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: don't believe that variables mentioned 256 times are unused.
authorRémy Oudompheng <oudomphe@phare.normalesup.org>
Tue, 21 Feb 2012 05:38:01 +0000 (16:38 +1100)
committerRob Pike <r@golang.org>
Tue, 21 Feb 2012 05:38:01 +0000 (16:38 +1100)
Such variables would be put at 0(SP), leading to serious
corruptions at zero initialization.
Fixes #3084.

R=golang-dev, r
CC=golang-dev, remy
https://golang.org/cl/5683052

src/cmd/5g/ggen.c
src/cmd/6g/ggen.c
src/cmd/8g/ggen.c
test/fixedbugs/bug423.go [new file with mode: 0644]

index 832767e8620cd95b00ff6a5c22e4d20538e539d8..de100620be6a79de30c108e472ba63c25ffbb37d 100644 (file)
@@ -29,10 +29,10 @@ markautoused(Prog* p)
 {
        for (; p; p = p->link) {
                if (p->from.name == D_AUTO && p->from.node)
-                       p->from.node->used++;
+                       p->from.node->used = 1;
 
                if (p->to.name == D_AUTO && p->to.node)
-                       p->to.node->used++;
+                       p->to.node->used = 1;
        }
 }
 
index 2f68885bd368bb3079f0b7abe40d2147ecf96e36..02e67d6d41e5a49080c34babed7186547ae98be5 100644 (file)
@@ -26,10 +26,10 @@ markautoused(Prog* p)
 {
        for (; p; p = p->link) {
                if (p->from.type == D_AUTO && p->from.node)
-                       p->from.node->used++;
+                       p->from.node->used = 1;
 
                if (p->to.type == D_AUTO && p->to.node)
-                       p->to.node->used++;
+                       p->to.node->used = 1;
        }
 }
 
index c4f28236808e5d2534d5aabfe87b6facb34660a3..6a457019901d42020efed418e0acd321f55d0d17 100644 (file)
@@ -28,10 +28,10 @@ markautoused(Prog* p)
 {
        for (; p; p = p->link) {
                if (p->from.type == D_AUTO && p->from.node)
-                       p->from.node->used++;
+                       p->from.node->used = 1;
 
                if (p->to.type == D_AUTO && p->to.node)
-                       p->to.node->used++;
+                       p->to.node->used = 1;
        }
 }
 
diff --git a/test/fixedbugs/bug423.go b/test/fixedbugs/bug423.go
new file mode 100644 (file)
index 0000000..4a04c77
--- /dev/null
@@ -0,0 +1,277 @@
+// run
+
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// gc used to overflow a counter when a variable was
+// mentioned 256 times, and generate stack corruption.
+
+package main
+
+func main() {
+       F(1)
+}
+
+func F(arg int) {
+       var X int64
+       _ = X // used once
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0 // used 32 times
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0 // used 64 times
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0 // used 96 times
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0 // used 128 times
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0 // used 200 times
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0
+       X = 0 // used 256 times
+       if arg != 0 {
+               panic("argument was changed")
+       }
+}