mirror of
https://github.com/golang/go
synced 2024-11-21 23:14:40 -07:00
cmd/gc: don't believe that variables mentioned 256 times are unused.
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
This commit is contained in:
parent
c9bb042287
commit
f2ad374ae6
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
277
test/fixedbugs/bug423.go
Normal file
277
test/fixedbugs/bug423.go
Normal file
@ -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")
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user