diff --git a/go/pointer/analysis.go b/go/pointer/analysis.go index c2f5a962..bc68795f 100644 --- a/go/pointer/analysis.go +++ b/go/pointer/analysis.go @@ -212,6 +212,9 @@ func (a *analysis) computeTrackBits() { // always succeed. An error can occur only due to an internal bug. // func Analyze(config *Config) (result *Result, err error) { + if config.Mains == nil { + return nil, fmt.Errorf("no main/test packages to analyze (check $GOROOT/$GOPATH)") + } defer func() { if p := recover(); p != nil { err = fmt.Errorf("internal error in pointer analysis: %v (please report this bug)", p) diff --git a/go/pointer/gen.go b/go/pointer/gen.go index 8643545c..e2b7da9e 100644 --- a/go/pointer/gen.go +++ b/go/pointer/gen.go @@ -226,7 +226,7 @@ func (a *analysis) valueNode(v ssa.Value) nodeid { if a.log != nil { comment = v.String() } - id = a.addOneNode(v.Type(), comment, nil) + id = a.addNodes(v.Type(), comment) if obj := a.objectNode(nil, v); obj != 0 { a.addressOf(v.Type(), id, obj) } diff --git a/go/pointer/testdata/func.go b/go/pointer/testdata/func.go index c2ab58f8..25f67dba 100644 --- a/go/pointer/testdata/func.go +++ b/go/pointer/testdata/func.go @@ -156,6 +156,39 @@ func func8(x ...int) { print(&x[0]) // @pointsto varargs[*]@varargs:15 } +type E struct { + x1, x2, x3, x4, x5 *int +} + +func (e E) f() {} + +func func9() { + // Regression test for bug reported by Jon Valdes on golang-dev, Jun 19 2014. + // The receiver of a bound method closure may be of a multi-node type, E. + // valueNode was reserving only a single node for it, so the + // nodes used by the immediately following constraints + // (e.g. param 'i') would get clobbered. + + var e E + e.x1 = &a + e.x2 = &a + e.x3 = &a + e.x4 = &a + e.x5 = &a + + _ = e.f // form a closure---must reserve sizeof(E) nodes + + func(i I) { + i.f() // must not crash the solver + }(new(D)) + + print(e.x1) // @pointsto main.a + print(e.x2) // @pointsto main.a + print(e.x3) // @pointsto main.a + print(e.x4) // @pointsto main.a + print(e.x5) // @pointsto main.a +} + func main() { func1() func2() @@ -165,6 +198,7 @@ func main() { func6() func7() func8(1, 2, 3) // @line varargs + func9() } // @calls -> main.main