diff --git a/go/loader/source_test.go b/go/loader/source_test.go index 1c5653ec..1b38fce4 100644 --- a/go/loader/source_test.go +++ b/go/loader/source_test.go @@ -60,11 +60,11 @@ func TestEnclosingFunction(t *testing.T) { // Function literal: {`package main func f() { println(func() { print(300) }) }`, - "300", "func@2.24"}, + "300", "f$1"}, // Doubly nested {`package main func f() { println(func() { print(func() { print(350) })})}`, - "350", "func@2.39"}, + "350", "f$1$1"}, // Implicit init for package-level var initializer. {"package main; var a = 400", "400", "main.init"}, // No code for constants: @@ -79,7 +79,7 @@ func TestEnclosingFunction(t *testing.T) { // init() containing FuncLit. {`package main func init() { println(func(){print(900)}) }`, - "900", "func@2.27"}, + "900", "init$1$1"}, } for _, test := range tests { conf := loader.Config{Fset: token.NewFileSet()} diff --git a/go/pointer/testdata/channels.go b/go/pointer/testdata/channels.go index db427d0b..454ff0f5 100644 --- a/go/pointer/testdata/channels.go +++ b/go/pointer/testdata/channels.go @@ -19,7 +19,7 @@ func chan1() { print(<-chA) // @pointsto main.incr print(chB) // @pointsto makechan@c1makeB:13 - print(<-chB) // @pointsto main.decr | func@16.9 + print(<-chB) // @pointsto main.decr | chan1$1 } func chan2() { @@ -40,10 +40,10 @@ func chan2() { print(<-chA) // @pointsto main.incr print(chB) // @pointsto makechan@c2makeB:13 - print(<-chB) // @pointsto main.decr | func@30.9 + print(<-chB) // @pointsto main.decr | chan2$1 print(chAB) // @pointsto makechan@c2makeA:13 | makechan@c2makeB:13 - print(<-chAB) // @pointsto main.incr | main.decr | func@30.9 + print(<-chAB) // @pointsto main.incr | main.decr | chan2$1 (<-chA)(3) } @@ -59,7 +59,7 @@ func chan3() { print(chA) // @pointsto makechan@c3makeA:13 print(<-chA) // @pointsto main.incr print(chB) // @pointsto makechan@c3makeB:13 - print(<-chB) // @pointsto main.decr | func@58.9 + print(<-chB) // @pointsto main.decr | chan3$1 (<-chA)(3) } diff --git a/go/pointer/testdata/func.go b/go/pointer/testdata/func.go index 7db652d6..a2cbd71c 100644 --- a/go/pointer/testdata/func.go +++ b/go/pointer/testdata/func.go @@ -28,9 +28,9 @@ func func1() { print(&a) // @pointsto main.a } -// @calls main.func1 -> func@19.7 -// @calls main.func1 -> func@11.7 -// @calls func@19.7 -> func@11.7 +// @calls main.func1 -> func1$2 +// @calls main.func1 -> func1$1 +// @calls func1$2 -> func1$1 func func2() { var x, y *int @@ -124,7 +124,7 @@ func func6() { print(f()) // @pointsto main.a } -// @calls main.func6 -> func@121.7 +// @calls main.func6 -> func6$1 type I interface { f() diff --git a/go/ssa/builder.go b/go/ssa/builder.go index 4e25dff7..4a03f632 100644 --- a/go/ssa/builder.go +++ b/go/ssa/builder.go @@ -468,9 +468,8 @@ func (b *builder) expr0(fn *Function, e ast.Expr) Value { panic("non-constant BasicLit") // unreachable case *ast.FuncLit: - posn := fn.Prog.Fset.Position(e.Type.Func) fn2 := &Function{ - name: fmt.Sprintf("func@%d.%d", posn.Line, posn.Column), + name: fmt.Sprintf("%s$%d", fn.Name(), 1+len(fn.AnonFuncs)), Signature: fn.Pkg.typeOf(e.Type).Underlying().(*types.Signature), pos: e.Type.Func, Enclosing: fn, diff --git a/go/ssa/func.go b/go/ssa/func.go index 6af67a32..d1abff97 100644 --- a/go/ssa/func.go +++ b/go/ssa/func.go @@ -457,7 +457,9 @@ func (f *Function) emit(instr Instruction) Value { // "(*sync.WaitGroup).Add" // a declared method // "(*Return).Block" // a promotion wrapper method (intra-package ref) // "(Instruction).Block" // an interface method wrapper (intra-package ref) -// "func@5.32" // an anonymous function +// "main$1" // an anonymous function +// "init$1" // a declared init function +// "init" // the synthesized package initializer // "bound$(*T).f" // a bound method wrapper // // If from==f.Pkg, suppress package qualification. diff --git a/go/ssa/interp/testdata/callstack.go b/go/ssa/interp/testdata/callstack.go index ea469843..56f3b281 100644 --- a/go/ssa/interp/testdata/callstack.go +++ b/go/ssa/interp/testdata/callstack.go @@ -15,7 +15,7 @@ func f() { for _, f := range pc { Func := runtime.FuncForPC(f) name := Func.Name() - if strings.Contains(name, "func") { + if strings.Contains(name, "$") || strings.Contains(name, ".func") { name = "func" // anon funcs vary across toolchains } file, line := Func.FileLine(0) diff --git a/oracle/testdata/src/main/callgraph-json.golden b/oracle/testdata/src/main/callgraph-json.golden index ea23bc9c..f0d10860 100644 --- a/oracle/testdata/src/main/callgraph-json.golden +++ b/oracle/testdata/src/main/callgraph-json.golden @@ -43,7 +43,7 @@ "pos": "testdata/src/main/callgraph-json.go:9:6" }, { - "name": "func@31.8", + "name": "main$1", "pos": "testdata/src/main/callgraph-json.go:31:8" } ] diff --git a/oracle/testdata/src/main/callgraph.golden b/oracle/testdata/src/main/callgraph.golden index 1b22397d..34a94261 100644 --- a/oracle/testdata/src/main/callgraph.golden +++ b/oracle/testdata/src/main/callgraph.golden @@ -11,7 +11,7 @@ Non-numbered nodes indicate back- or cross-edges to the node whose 3 A 4 B 5 call2 -6 func@33.8 +6 main$1 7 nop -------- @callgraph callgraph-complete -------- @@ -30,6 +30,6 @@ Non-numbered nodes indicate back- or cross-edges to the node whose 6 main.A 7 main.B 8 main.call2 -9 func@33.8 +9 main$1 10 main.nop diff --git a/oracle/testdata/src/main/calls-json.golden b/oracle/testdata/src/main/calls-json.golden index 574578af..f063bc0b 100644 --- a/oracle/testdata/src/main/calls-json.golden +++ b/oracle/testdata/src/main/calls-json.golden @@ -6,7 +6,7 @@ "desc": "dynamic function call", "callees": [ { - "name": "func@12.7", + "name": "main$1", "pos": "testdata/src/main/calls-json.go:12:7" } ] @@ -16,7 +16,7 @@ "mode": "callstack", "callstack": { "pos": "testdata/src/main/calls-json.go:12:7", - "target": "func@12.7", + "target": "main$1", "callers": [ { "pos": "testdata/src/main/calls-json.go:8:3", diff --git a/oracle/testdata/src/main/calls.golden b/oracle/testdata/src/main/calls.golden index 6aaf0ddb..96e3b389 100644 --- a/oracle/testdata/src/main/calls.golden +++ b/oracle/testdata/src/main/calls.golden @@ -35,11 +35,11 @@ main.store is called from these 2 sites: -------- @pointsto pointsto-result-f -------- this func() *int may point to these objects: - func@50.7 + main$1 -------- @callees callees-main.call-f -------- this dynamic function call dispatches to: - func@50.7 + main$1 -------- @callers callers-main.call -------- main.call is called from these 2 sites: diff --git a/oracle/testdata/src/main/pointsto.golden b/oracle/testdata/src/main/pointsto.golden index 1f8035e2..a4f9a5c2 100644 --- a/oracle/testdata/src/main/pointsto.golden +++ b/oracle/testdata/src/main/pointsto.golden @@ -31,7 +31,7 @@ this func() may point to these objects: -------- @pointsto ref-anon -------- this func() may point to these objects: - func@25.10 + main$1 -------- @pointsto ref-global -------- this *string may point to these objects: