diff options
Diffstat (limited to 'go/pointer')
27 files changed, 294 insertions, 256 deletions
diff --git a/go/pointer/pointer_go117_test.go b/go/pointer/pointer_go117_test.go index 7546a0660..50eb2135f 100644 --- a/go/pointer/pointer_go117_test.go +++ b/go/pointer/pointer_go117_test.go @@ -13,6 +13,7 @@ import ( "fmt" "io/ioutil" "os" + "path/filepath" "testing" ) @@ -34,8 +35,12 @@ func TestSliceToArrayPointer(t *testing.T) { if err != nil { t.Fatalf("couldn't read file '%s': %s", filename, err) } + fpath, err := filepath.Abs(filename) + if err != nil { + t.Errorf("couldn't get absolute path for '%s': %s", filename, err) + } - if !doOneInput(string(content), filename) { + if !doOneInput(t, string(content), fpath) { t.Fail() } } diff --git a/go/pointer/pointer_test.go b/go/pointer/pointer_test.go index 2f6e069f2..1ac5b6c9f 100644 --- a/go/pointer/pointer_test.go +++ b/go/pointer/pointer_test.go @@ -21,13 +21,15 @@ import ( "go/types" "io/ioutil" "os" + "path/filepath" "regexp" "strconv" "strings" "testing" + "unsafe" "golang.org/x/tools/go/callgraph" - "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/packages" "golang.org/x/tools/go/pointer" "golang.org/x/tools/go/ssa" "golang.org/x/tools/go/ssa/ssautil" @@ -123,7 +125,7 @@ var inputs = []string{ // type expectation struct { kind string // "pointsto" | "pointstoquery" | "types" | "calls" | "warning" - filename string + filepath string linenum int // source line number, 1-based args []string query string // extended query @@ -136,7 +138,7 @@ func (e *expectation) String() string { } func (e *expectation) errorf(format string, args ...interface{}) { - fmt.Printf("%s:%d: ", e.filename, e.linenum) + fmt.Printf("%s:%d: ", e.filepath, e.linenum) fmt.Printf(format, args...) fmt.Println() } @@ -149,44 +151,50 @@ func (e *expectation) needsProbe() bool { func findProbe(prog *ssa.Program, probes map[*ssa.CallCommon]bool, queries map[ssa.Value]pointer.Pointer, e *expectation) (site *ssa.CallCommon, pts pointer.PointsToSet) { for call := range probes { pos := prog.Fset.Position(call.Pos()) - if pos.Line == e.linenum && pos.Filename == e.filename { + if pos.Line == e.linenum && pos.Filename == e.filepath { // TODO(adonovan): send this to test log (display only on failure). // fmt.Printf("%s:%d: info: found probe for %s: %s\n", - // e.filename, e.linenum, e, p.arg0) // debugging + // e.filepath, e.linenum, e, p.arg0) // debugging return call, queries[call.Args[0]].PointsTo() } } return // e.g. analysis didn't reach this call } -func doOneInput(input, filename string) bool { - var conf loader.Config - - // Parsing. - f, err := conf.ParseFile(filename, input) +func doOneInput(t *testing.T, input, fpath string) bool { + cfg := &packages.Config{ + Mode: packages.LoadAllSyntax, + Tests: true, + } + pkgs, err := packages.Load(cfg, fpath) if err != nil { fmt.Println(err) return false } - - // Create single-file main package and import its dependencies. - conf.CreateFromFiles("main", f) - iprog, err := conf.Load() - if err != nil { - fmt.Println(err) + if packages.PrintErrors(pkgs) > 0 { + fmt.Println("loaded packages have errors") return false } - mainPkgInfo := iprog.Created[0].Pkg // SSA creation + building. - prog := ssautil.CreateProgram(iprog, ssa.SanityCheckFunctions) + prog, ssaPkgs := ssautil.AllPackages(pkgs, ssa.SanityCheckFunctions) prog.Build() - mainpkg := prog.Package(mainPkgInfo) + // main underlying packages.Package. + mainPpkg := pkgs[0] + mainpkg := ssaPkgs[0] ptrmain := mainpkg // main package for the pointer analysis if mainpkg.Func("main") == nil { - // No main function; assume it's a test. - ptrmain = prog.CreateTestMainPackage(mainpkg) + // For test programs without main, such as testdata/a_test.go, + // the package with the original code is "main [main.test]" and + // the package with the main is "main.test". + for i, pkg := range pkgs { + if pkg.ID == mainPpkg.ID+".test" { + ptrmain = ssaPkgs[i] + } else if pkg.ID == fmt.Sprintf("%s [%s.test]", mainPpkg.ID, mainPpkg.ID) { + mainpkg = ssaPkgs[i] + } + } } // Find all calls to the built-in print(x). Analytically, @@ -221,14 +229,14 @@ func doOneInput(input, filename string) bool { if matches := re.FindAllStringSubmatch(line, -1); matches != nil { match := matches[0] kind, rest := match[1], match[2] - e := &expectation{kind: kind, filename: filename, linenum: linenum} + e := &expectation{kind: kind, filepath: fpath, linenum: linenum} if kind == "line" { if rest == "" { ok = false e.errorf("@%s expectation requires identifier", kind) } else { - lineMapping[fmt.Sprintf("%s:%d", filename, linenum)] = rest + lineMapping[fmt.Sprintf("%s:%d", fpath, linenum)] = rest } continue } @@ -251,7 +259,7 @@ func doOneInput(input, filename string) bool { for _, typstr := range split(rest, "|") { var t types.Type = types.Typ[types.Invalid] // means "..." if typstr != "..." { - tv, err := types.Eval(prog.Fset, mainpkg.Pkg, f.Pos(), typstr) + tv, err := types.Eval(prog.Fset, mainpkg.Pkg, mainPpkg.Syntax[0].Pos(), typstr) if err != nil { ok = false // Don't print err since its location is bad. @@ -294,7 +302,7 @@ func doOneInput(input, filename string) bool { } var log bytes.Buffer - fmt.Fprintf(&log, "Input: %s\n", filename) + fmt.Fprintf(&log, "Input: %s\n", fpath) // Run the analysis. config := &pointer.Config{ @@ -308,7 +316,7 @@ probeLoop: v := probe.Args[0] pos := prog.Fset.Position(probe.Pos()) for _, e := range exps { - if e.linenum == pos.Line && e.filename == pos.Filename && e.kind == "pointstoquery" { + if e.linenum == pos.Line && e.filepath == pos.Filename && e.kind == "pointstoquery" { var err error e.extended, err = config.AddExtendedQuery(v, e.query) if err != nil { @@ -546,6 +554,9 @@ func TestInput(t *testing.T) { if testing.Short() { t.Skip("skipping in short mode; this test requires tons of memory; https://golang.org/issue/14113") } + if unsafe.Sizeof(unsafe.Pointer(nil)) <= 4 { + t.Skip("skipping memory-intensive test on platform with small address space; https://golang.org/issue/14113") + } ok := true wd, err := os.Getwd() @@ -567,7 +578,12 @@ func TestInput(t *testing.T) { continue } - if !doOneInput(string(content), filename) { + fpath, err := filepath.Abs(filename) + if err != nil { + t.Errorf("couldn't get absolute path for '%s': %s", filename, err) + } + + if !doOneInput(t, string(content), fpath) { ok = false } } diff --git a/go/pointer/stdlib_test.go b/go/pointer/stdlib_test.go index 2d5097f33..3ba42a171 100644 --- a/go/pointer/stdlib_test.go +++ b/go/pointer/stdlib_test.go @@ -19,13 +19,11 @@ package pointer import ( "flag" - "go/build" "go/token" "testing" "time" - "golang.org/x/tools/go/buildutil" - "golang.org/x/tools/go/loader" + "golang.org/x/tools/go/packages" "golang.org/x/tools/go/ssa" "golang.org/x/tools/go/ssa/ssautil" ) @@ -37,22 +35,18 @@ func TestStdlib(t *testing.T) { t.Skip("skipping (slow) stdlib test (use --stdlib)") } - // Load, parse and type-check the program. - ctxt := build.Default // copy - ctxt.GOPATH = "" // disable GOPATH - conf := loader.Config{Build: &ctxt} - if _, err := conf.FromArgs(buildutil.AllPackages(conf.Build), true); err != nil { - t.Errorf("FromArgs failed: %v", err) - return + cfg := &packages.Config{ + Mode: packages.LoadAllSyntax, + // Create test main packages with a main function. + Tests: true, } - - iprog, err := conf.Load() - if err != nil { + pkgs, err := packages.Load(cfg, "std") + if err != nil || packages.PrintErrors(pkgs) > 0 { t.Fatalf("Load failed: %v", err) } // Create SSA packages. - prog := ssautil.CreateProgram(iprog, 0) + prog, _ := ssautil.AllPackages(pkgs, 0) prog.Build() numPkgs := len(prog.AllPackages()) @@ -62,10 +56,9 @@ func TestStdlib(t *testing.T) { // Determine the set of packages/tests to analyze. var mains []*ssa.Package - for _, info := range iprog.InitialPackages() { - ssapkg := prog.Package(info.Pkg) - if main := prog.CreateTestMainPackage(ssapkg); main != nil { - mains = append(mains, main) + for _, ssapkg := range prog.AllPackages() { + if ssapkg.Pkg.Name() == "main" && ssapkg.Func("main") != nil { + mains = append(mains, ssapkg) } } if mains == nil { diff --git a/go/pointer/testdata/a_test.go b/go/pointer/testdata/a_test.go index 3baa9ac7e..c6058a0d2 100644 --- a/go/pointer/testdata/a_test.go +++ b/go/pointer/testdata/a_test.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package a @@ -11,7 +12,7 @@ import "testing" func log(f func(*testing.T)) { // The PTS of f is the set of called tests. TestingQuux is not present. - print(f) // @pointsto main.Test | main.TestFoo + print(f) // @pointsto command-line-arguments.Test | command-line-arguments.TestFoo } func Test(t *testing.T) { @@ -33,10 +34,11 @@ func BenchmarkFoo(b *testing.B) { } func ExampleBar() { + // Output: } // Excludes TestingQuux. -// @calls testing.tRunner -> main.Test -// @calls testing.tRunner -> main.TestFoo -// @calls testing.runExample -> main.ExampleBar -// @calls (*testing.B).runN -> main.BenchmarkFoo +// @calls testing.tRunner -> command-line-arguments.Test +// @calls testing.tRunner -> command-line-arguments.TestFoo +// @calls (*testing.B).runN -> command-line-arguments.BenchmarkFoo +// @calls testing.runExample -> command-line-arguments.ExampleBar diff --git a/go/pointer/testdata/another.go b/go/pointer/testdata/another.go index 12ed690e9..75b92c523 100644 --- a/go/pointer/testdata/another.go +++ b/go/pointer/testdata/another.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main @@ -29,8 +30,8 @@ func main() { // NB, an interface may never directly alias any global // labels, even though it may contain pointers that do. - print(i) // @pointsto makeinterface:func(x int) int | makeinterface:func(x int, y int) | makeinterface:func(int, int) | makeinterface:int | makeinterface:main.S - print(i.(func(int) int)) // @pointsto main.incr + print(i) // @pointsto makeinterface:func(x int) int | makeinterface:func(x int, y int) | makeinterface:func(int, int) | makeinterface:int | makeinterface:command-line-arguments.S + print(i.(func(int) int)) // @pointsto command-line-arguments.incr print() // regression test for crash } diff --git a/go/pointer/testdata/arrayreflect.go b/go/pointer/testdata/arrayreflect.go index 2b2367409..18c8707f6 100644 --- a/go/pointer/testdata/arrayreflect.go +++ b/go/pointer/testdata/arrayreflect.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main @@ -17,7 +18,7 @@ func reflectValueSlice() { rvsl := reflect.ValueOf(slice).Slice(0, 0) print(rvsl.Interface()) // @types []*int print(rvsl.Interface().([]*int)) // @pointsto makeslice@slice:15 - print(rvsl.Interface().([]*int)[42]) // @pointsto main.a + print(rvsl.Interface().([]*int)[42]) // @pointsto command-line-arguments.a // reflect.Value contains an array (non-addressable). array := [10]*int{&a} // @line array @@ -30,7 +31,7 @@ func reflectValueSlice() { rvparray := reflect.ValueOf(&array).Slice(0, 0) print(rvparray.Interface()) // @types []*int print(rvparray.Interface().([]*int)) // @pointsto array@array:2 - print(rvparray.Interface().([]*int)[42]) // @pointsto main.a + print(rvparray.Interface().([]*int)[42]) // @pointsto command-line-arguments.a // reflect.Value contains a string. rvstring := reflect.ValueOf("hi").Slice(0, 0) @@ -75,12 +76,12 @@ func reflectValueIndex() { slice := []*int{&a} // @line ar6slice rv1 := reflect.ValueOf(slice) print(rv1.Index(42).Interface()) // @types *int - print(rv1.Index(42).Interface().(*int)) // @pointsto main.a + print(rv1.Index(42).Interface().(*int)) // @pointsto command-line-arguments.a array := [10]*int{&a} rv2 := reflect.ValueOf(array) print(rv2.Index(42).Interface()) // @types *int - print(rv2.Index(42).Interface().(*int)) // @pointsto main.a + print(rv2.Index(42).Interface().(*int)) // @pointsto command-line-arguments.a rv3 := reflect.ValueOf("string") print(rv3.Index(42).Interface()) // @types rune @@ -97,9 +98,9 @@ func reflectValueElem() { var iface interface{} = &a rv1 := reflect.ValueOf(&iface).Elem() print(rv1.Interface()) // @types *int - print(rv1.Interface().(*int)) // @pointsto main.a + print(rv1.Interface().(*int)) // @pointsto command-line-arguments.a print(rv1.Elem().Interface()) // @types *int - print(rv1.Elem().Interface().(*int)) // @pointsto main.a + print(rv1.Elem().Interface().(*int)) // @pointsto command-line-arguments.a print(reflect.ValueOf(new(interface{})).Elem().Elem()) // @types @@ -107,7 +108,7 @@ func reflectValueElem() { ptr := &a rv2 := reflect.ValueOf(&ptr) print(rv2.Elem().Interface()) // @types *int - print(rv2.Elem().Interface().(*int)) // @pointsto main.a + print(rv2.Elem().Interface().(*int)) // @pointsto command-line-arguments.a // No other type works with (rV).Elem, not even those that // work with (rT).Elem: slice, array, map, chan. diff --git a/go/pointer/testdata/arrays.go b/go/pointer/testdata/arrays.go index e57a15b4b..96498f512 100644 --- a/go/pointer/testdata/arrays.go +++ b/go/pointer/testdata/arrays.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main @@ -14,10 +15,10 @@ func array1() { sliceB = append(sliceB, &b) // @line a1append print(sliceA) // @pointsto makeslice@a1make:16 - print(sliceA[0]) // @pointsto main.a + print(sliceA[0]) // @pointsto command-line-arguments.a print(sliceB) // @pointsto append@a1append:17 - print(sliceB[100]) // @pointsto main.b + print(sliceB[100]) // @pointsto command-line-arguments.b } func array2() { @@ -27,10 +28,10 @@ func array2() { sliceB := sliceA[:] print(sliceA) // @pointsto makeslice@a2make:16 - print(sliceA[0]) // @pointsto main.a + print(sliceA[0]) // @pointsto command-line-arguments.a print(sliceB) // @pointsto makeslice@a2make:16 - print(sliceB[0]) // @pointsto main.a + print(sliceB[0]) // @pointsto command-line-arguments.a } func array3() { @@ -65,18 +66,18 @@ func array4() { sl4a := append(sl4) // @line a4L4 print(sl4a) // @pointsto slicelit@a4L3:18 | append@a4L4:16 print(&sl4a[0]) // @pointsto slicelit[*]@a4L3:18 | append[*]@a4L4:16 - print(sl4a[0]) // @pointsto main.a + print(sl4a[0]) // @pointsto command-line-arguments.a var sl5 = []*int{&b} // @line a4L5 copy(sl5, sl4) print(sl5) // @pointsto slicelit@a4L5:18 print(&sl5[0]) // @pointsto slicelit[*]@a4L5:18 - print(sl5[0]) // @pointsto main.b | main.a + print(sl5[0]) // @pointsto command-line-arguments.b | command-line-arguments.a var sl6 = sl5[:0] print(sl6) // @pointsto slicelit@a4L5:18 print(&sl6[0]) // @pointsto slicelit[*]@a4L5:18 - print(sl6[0]) // @pointsto main.b | main.a + print(sl6[0]) // @pointsto command-line-arguments.b | command-line-arguments.a } func array5() { @@ -85,7 +86,7 @@ func array5() { arr[1] = &b var n int - print(arr[n]) // @pointsto main.a | main.b + print(arr[n]) // @pointsto command-line-arguments.a | command-line-arguments.b } func main() { diff --git a/go/pointer/testdata/arrays_go117.go b/go/pointer/testdata/arrays_go117.go index 7a66f6728..7ad9f5f35 100644 --- a/go/pointer/testdata/arrays_go117.go +++ b/go/pointer/testdata/arrays_go117.go @@ -18,10 +18,10 @@ func array1() { sliceB = append(sliceB, &b) // @line a1append print(sliceA) // @pointsto makeslice@a1make:16 - print(sliceA[0]) // @pointsto main.a + print(sliceA[0]) // @pointsto command-line-arguments.a print(sliceB) // @pointsto append@a1append:17 - print(sliceB[100]) // @pointsto main.b + print(sliceB[100]) // @pointsto command-line-arguments.b } func array2() { @@ -31,10 +31,10 @@ func array2() { sliceB := sliceA[:] print(sliceA) // @pointsto makeslice@a2make:16 - print(sliceA[0]) // @pointsto main.a + print(sliceA[0]) // @pointsto command-line-arguments.a print(sliceB) // @pointsto makeslice@a2make:16 - print(sliceB[0]) // @pointsto main.a + print(sliceB[0]) // @pointsto command-line-arguments.a } func array3() { @@ -69,18 +69,18 @@ func array4() { sl4a := append(sl4) // @line a4L4 print(sl4a) // @pointsto slicelit@a4L3:18 | append@a4L4:16 print(&sl4a[0]) // @pointsto slicelit[*]@a4L3:18 | append[*]@a4L4:16 - print(sl4a[0]) // @pointsto main.a + print(sl4a[0]) // @pointsto command-line-arguments.a var sl5 = []*int{&b} // @line a4L5 copy(sl5, sl4) print(sl5) // @pointsto slicelit@a4L5:18 print(&sl5[0]) // @pointsto slicelit[*]@a4L5:18 - print(sl5[0]) // @pointsto main.b | main.a + print(sl5[0]) // @pointsto command-line-arguments.b | command-line-arguments.a var sl6 = sl5[:0] print(sl6) // @pointsto slicelit@a4L5:18 print(&sl6[0]) // @pointsto slicelit[*]@a4L5:18 - print(sl6[0]) // @pointsto main.b | main.a + print(sl6[0]) // @pointsto command-line-arguments.b | command-line-arguments.a } func array5() { @@ -89,7 +89,7 @@ func array5() { arr[1] = &b var n int - print(arr[n]) // @pointsto main.a | main.b + print(arr[n]) // @pointsto command-line-arguments.a | command-line-arguments.b } func array6() { @@ -99,35 +99,35 @@ func array6() { ap0 := (*[1]*int)(sl0) ar0 := *ap0 - print(ap0[n]) // @pointsto main.a - print(sl0[n]) // @pointsto main.a - print(ar0[n]) // @pointsto main.a + print(ap0[n]) // @pointsto command-line-arguments.a + print(sl0[n]) // @pointsto command-line-arguments.a + print(ar0[n]) // @pointsto command-line-arguments.a sl1 := []*int{&a} ap1 := (*[1]*int)(sl1) ar1 := *ap1 ar1[0] = &b - print(ap1[n]) // @pointsto main.a - print(sl1[n]) // @pointsto main.a - print(ar1[n]) // @pointsto main.a | main.b + print(ap1[n]) // @pointsto command-line-arguments.a + print(sl1[n]) // @pointsto command-line-arguments.a + print(ar1[n]) // @pointsto command-line-arguments.a | command-line-arguments.b sl2 := []*int{&a} ap2 := (*[1]*int)(sl2) ar2 := *ap2 ap2[0] = &b - print(ap2[n]) // @pointsto main.a | main.b - print(sl2[n]) // @pointsto main.a | main.b - print(ar2[n]) // @pointsto main.a | main.b + print(ap2[n]) // @pointsto command-line-arguments.a | command-line-arguments.b + print(sl2[n]) // @pointsto command-line-arguments.a | command-line-arguments.b + print(ar2[n]) // @pointsto command-line-arguments.a | command-line-arguments.b sl3 := []*int{&b, nil} ap3 := (*[1]*int)(sl3) ar3 := *ap3 - print(sl3[n]) // @pointsto main.b - print(ap3[n]) // @pointsto main.b - print(ar3[n]) // @pointsto main.b + print(sl3[n]) // @pointsto command-line-arguments.b + print(ap3[n]) // @pointsto command-line-arguments.b + print(ar3[n]) // @pointsto command-line-arguments.b } func array7() { @@ -139,9 +139,9 @@ func array7() { ap1[0] = &a - print(sl0[n]) // @pointsto main.a - print(ap0[n]) // @pointsto main.a - print(ap1[n]) // @pointsto main.a + print(sl0[n]) // @pointsto command-line-arguments.a + print(ap0[n]) // @pointsto command-line-arguments.a + print(ap1[n]) // @pointsto command-line-arguments.a } func array8() { @@ -153,12 +153,12 @@ func array8() { pa2 := (*[1]*int)(sl2) sl1[0] = &a sl2[0] = &b - print(pa1[n]) // @pointsto main.a - print(pa2[n]) // @pointsto main.b + print(pa1[n]) // @pointsto command-line-arguments.a + print(pa2[n]) // @pointsto command-line-arguments.b pa2 = pa1 - print(pa1[n]) // @pointsto main.a - print(pa2[n]) // @pointsto main.a + print(pa1[n]) // @pointsto command-line-arguments.a + print(pa2[n]) // @pointsto command-line-arguments.a } func main() { diff --git a/go/pointer/testdata/channels.go b/go/pointer/testdata/channels.go index 377b68a56..c4f5150bf 100644 --- a/go/pointer/testdata/channels.go +++ b/go/pointer/testdata/channels.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main @@ -16,10 +17,10 @@ func chan1() { chB <- func(int) int { return 1 } print(chA) // @pointsto makechan@c1makeA:13 - print(<-chA) // @pointsto main.incr + print(<-chA) // @pointsto command-line-arguments.incr print(chB) // @pointsto makechan@c1makeB:13 - print(<-chB) // @pointsto main.decr | main.chan1$1 + print(<-chB) // @pointsto command-line-arguments.decr | command-line-arguments.chan1$1 } func chan2() { @@ -37,18 +38,18 @@ func chan2() { } print(chA) // @pointsto makechan@c2makeA:13 - print(<-chA) // @pointsto main.incr + print(<-chA) // @pointsto command-line-arguments.incr print(chB) // @pointsto makechan@c2makeB:13 - print(<-chB) // @pointsto main.decr | main.chan2$1 + print(<-chB) // @pointsto command-line-arguments.decr | command-line-arguments.chan2$1 print(chAB) // @pointsto makechan@c2makeA:13 | makechan@c2makeB:13 - print(<-chAB) // @pointsto main.incr | main.decr | main.chan2$1 + print(<-chAB) // @pointsto command-line-arguments.incr | command-line-arguments.decr | command-line-arguments.chan2$1 (<-chA)(3) } -// @calls main.chan2 -> main.incr +// @calls command-line-arguments.chan2 -> command-line-arguments.incr func chan3() { chA := make(chan func(int) int, 0) // @line c3makeA @@ -57,14 +58,14 @@ func chan3() { chB <- decr chB <- func(int) int { return 1 } print(chA) // @pointsto makechan@c3makeA:13 - print(<-chA) // @pointsto main.incr + print(<-chA) // @pointsto command-line-arguments.incr print(chB) // @pointsto makechan@c3makeB:13 - print(<-chB) // @pointsto main.decr | main.chan3$1 + print(<-chB) // @pointsto command-line-arguments.decr | command-line-arguments.chan3$1 (<-chA)(3) } -// @calls main.chan3 -> main.incr +// @calls command-line-arguments.chan3 -> command-line-arguments.incr func chan4() { chA := make(chan func(int) int, 0) // @line c4makeA @@ -74,16 +75,16 @@ func chan4() { case chA <- incr: case chB <- decr: case a := <-chA: - print(a) // @pointsto main.incr + print(a) // @pointsto command-line-arguments.incr case b := <-chB: - print(b) // @pointsto main.decr + print(b) // @pointsto command-line-arguments.decr default: print(chA) // @pointsto makechan@c4makeA:13 print(chB) // @pointsto makechan@c4makeB:13 } for k := range chA { - print(k) // @pointsto main.incr + print(k) // @pointsto command-line-arguments.incr } // Exercise constraint generation (regtest for a crash). for range chA { diff --git a/go/pointer/testdata/chanreflect.go b/go/pointer/testdata/chanreflect.go index 7d22efeb6..21f78b61f 100644 --- a/go/pointer/testdata/chanreflect.go +++ b/go/pointer/testdata/chanreflect.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main @@ -14,7 +15,7 @@ func chanreflect1() { crv.Send(reflect.ValueOf(&a)) print(crv.Interface()) // @types chan *int print(crv.Interface().(chan *int)) // @pointsto makechan@cr1make:12 - print(<-ch) // @pointsto main.a + print(<-ch) // @pointsto command-line-arguments.a } func chanreflect1i() { @@ -24,7 +25,7 @@ func chanreflect1i() { reflect.ValueOf(ch).Send(reflect.ValueOf(&a)) v := <-ch print(v) // @types *int - print(v.(*int)) // @pointsto main.a + print(v.(*int)) // @pointsto command-line-arguments.a } func chanreflect2() { @@ -33,7 +34,7 @@ func chanreflect2() { crv := reflect.ValueOf(ch) r, _ := crv.Recv() print(r.Interface()) // @types *int - print(r.Interface().(*int)) // @pointsto main.b + print(r.Interface().(*int)) // @pointsto command-line-arguments.b } func chanOfRecv() { @@ -60,8 +61,8 @@ func chanOfBoth() { ch.Send(reflect.ValueOf(&b)) ch.Interface().(chan *int) <- &a r, _ := ch.Recv() - print(r.Interface().(*int)) // @pointsto main.a | main.b - print(<-ch.Interface().(chan *int)) // @pointsto main.a | main.b + print(r.Interface().(*int)) // @pointsto command-line-arguments.a | command-line-arguments.b + print(<-ch.Interface().(chan *int)) // @pointsto command-line-arguments.a | command-line-arguments.b } var unknownDir reflect.ChanDir // not a constant diff --git a/go/pointer/testdata/context.go b/go/pointer/testdata/context.go index ed616e7ec..b76c20070 100644 --- a/go/pointer/testdata/context.go +++ b/go/pointer/testdata/context.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main @@ -16,29 +17,29 @@ func context1() { var t1, t2 T t1.SetX(&a) t2.SetX(&b) - print(t1.GetX()) // @pointsto main.a - print(t2.GetX()) // @pointsto main.b + print(t1.GetX()) // @pointsto command-line-arguments.a + print(t2.GetX()) // @pointsto command-line-arguments.b } func context2() { id := func(x *int) *int { - print(x) // @pointsto main.a | main.b + print(x) // @pointsto command-line-arguments.a | command-line-arguments.b return x } - print(id(&a)) // @pointsto main.a - print(id(&b)) // @pointsto main.b + print(id(&a)) // @pointsto command-line-arguments.a + print(id(&b)) // @pointsto command-line-arguments.b // Same again, but anon func has free vars. var c int // @line context2c id2 := func(x *int) (*int, *int) { - print(x) // @pointsto main.a | main.b + print(x) // @pointsto command-line-arguments.a | command-line-arguments.b return x, &c } p, q := id2(&a) - print(p) // @pointsto main.a + print(p) // @pointsto command-line-arguments.a print(q) // @pointsto c@context2c:6 r, s := id2(&b) - print(r) // @pointsto main.b + print(r) // @pointsto command-line-arguments.b print(s) // @pointsto c@context2c:6 } diff --git a/go/pointer/testdata/conv.go b/go/pointer/testdata/conv.go index 692f0ceba..5ef1fdf01 100644 --- a/go/pointer/testdata/conv.go +++ b/go/pointer/testdata/conv.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main @@ -26,23 +27,23 @@ func conv3() { // Conversion of same underlying types. type PI *int pi := PI(&a) - print(pi) // @pointsto main.a + print(pi) // @pointsto command-line-arguments.a pint := (*int)(pi) - print(pint) // @pointsto main.a + print(pint) // @pointsto command-line-arguments.a // Conversions between pointers to identical base types. var y *PI = &pi var x **int = (**int)(y) - print(*x) // @pointsto main.a - print(*y) // @pointsto main.a + print(*x) // @pointsto command-line-arguments.a + print(*y) // @pointsto command-line-arguments.a y = (*PI)(x) - print(*y) // @pointsto main.a + print(*y) // @pointsto command-line-arguments.a } func conv4() { // Handling of unsafe.Pointer conversion is unsound: - // we lose the alias to main.a and get something like new(int) instead. + // we lose the alias to command-line-arguments.a and get something like new(int) instead. p := (*int)(unsafe.Pointer(&a)) // @line c2p print(p) // @pointsto convert@c2p:13 } diff --git a/go/pointer/testdata/extended.go b/go/pointer/testdata/extended.go index b3dd20304..a95449c2e 100644 --- a/go/pointer/testdata/extended.go +++ b/go/pointer/testdata/extended.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main @@ -17,5 +18,5 @@ func fn() []t { func main() { x := fn() - print(x) // @pointstoquery <-(*x[i].a)[key] main.a + print(x) // @pointstoquery <-(*x[i].a)[key] command-line-arguments.a } diff --git a/go/pointer/testdata/finalizer.go b/go/pointer/testdata/finalizer.go index 97f25c904..7ee03da07 100644 --- a/go/pointer/testdata/finalizer.go +++ b/go/pointer/testdata/finalizer.go @@ -17,8 +17,8 @@ func runtimeSetFinalizer1() { runtime.SetFinalizer(x, final1b) // param type mismatch: no effect } -// @calls main.runtimeSetFinalizer1 -> main.final1a -// @calls main.runtimeSetFinalizer1 -> main.final1b +// @calls command-line-arguments.runtimeSetFinalizer1 -> command-line-arguments.final1a +// @calls command-line-arguments.runtimeSetFinalizer1 -> command-line-arguments.final1b func final2a(x *bool) { print(x) // @pointsto new@newbool1:10 | new@newbool2:10 @@ -38,8 +38,8 @@ func runtimeSetFinalizer2() { runtime.SetFinalizer(x, f) } -// @calls main.runtimeSetFinalizer2 -> main.final2a -// @calls main.runtimeSetFinalizer2 -> main.final2b +// @calls command-line-arguments.runtimeSetFinalizer2 -> command-line-arguments.final2a +// @calls command-line-arguments.runtimeSetFinalizer2 -> command-line-arguments.final2b type T int @@ -52,7 +52,7 @@ func runtimeSetFinalizer3() { runtime.SetFinalizer(x, (*T).finalize) } -// @calls main.runtimeSetFinalizer3 -> (*main.T).finalize$thunk +// @calls command-line-arguments.runtimeSetFinalizer3 -> (*command-line-arguments.T).finalize$thunk // I hope I never live to see this code in the wild. var setFinalizer = runtime.SetFinalizer @@ -75,8 +75,8 @@ func runtimeSetFinalizerNonpointer() { runtime.SetFinalizer((*T).finalize, nil) // f is a non-pointer } -// @calls main.runtimeSetFinalizerIndirect -> runtime.SetFinalizer -// @calls runtime.SetFinalizer -> main.final4 +// @calls command-line-arguments.runtimeSetFinalizerIndirect -> runtime.SetFinalizer +// @calls runtime.SetFinalizer -> command-line-arguments.final4 func main() { runtimeSetFinalizer1() diff --git a/go/pointer/testdata/flow.go b/go/pointer/testdata/flow.go index 6fb599e8d..9e8ce9355 100644 --- a/go/pointer/testdata/flow.go +++ b/go/pointer/testdata/flow.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main @@ -18,10 +19,10 @@ func flow1() { if somepred { r = s } - print(s) // @pointsto main.f1 - print(p) // @pointsto main.f2 - print(q) // @pointsto main.f2 - print(r) // @pointsto main.f1 | main.f2 + print(s) // @pointsto command-line-arguments.f1 + print(p) // @pointsto command-line-arguments.f2 + print(q) // @pointsto command-line-arguments.f2 + print(r) // @pointsto command-line-arguments.f1 | command-line-arguments.f2 } // Tracking concrete types in interfaces. @@ -50,10 +51,10 @@ func flow3() { if somepred { r = s } - print(s) // @pointsto main.g1 - print(p) // @pointsto main.g2 - print(q) // @pointsto main.g2 - print(r) // @pointsto main.g2 | main.g1 + print(s) // @pointsto command-line-arguments.g1 + print(p) // @pointsto command-line-arguments.g2 + print(q) // @pointsto command-line-arguments.g2 + print(r) // @pointsto command-line-arguments.g2 | command-line-arguments.g1 } func main() { diff --git a/go/pointer/testdata/fmtexcerpt.go b/go/pointer/testdata/fmtexcerpt.go index ee2a0e76c..422e31d41 100644 --- a/go/pointer/testdata/fmtexcerpt.go +++ b/go/pointer/testdata/fmtexcerpt.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore // This is a slice of the fmt package. @@ -39,4 +40,4 @@ func main() { Println("Hello, World!", S(0)) } -// @calls (*main.pp).doPrint -> (main.S).String +// @calls (*command-line-arguments.pp).doPrint -> (command-line-arguments.S).String diff --git a/go/pointer/testdata/func.go b/go/pointer/testdata/func.go index 2155f8ef7..11a713882 100644 --- a/go/pointer/testdata/func.go +++ b/go/pointer/testdata/func.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main @@ -23,14 +24,14 @@ func func1() { return f(x) } - print(g(&a)) // @pointsto main.a | main.b | h@f1h:6 - print(f(&a)) // @pointsto main.a | main.b - print(&a) // @pointsto main.a + print(g(&a)) // @pointsto command-line-arguments.a | command-line-arguments.b | h@f1h:6 + print(f(&a)) // @pointsto command-line-arguments.a | command-line-arguments.b + print(&a) // @pointsto command-line-arguments.a } -// @calls main.func1 -> main.func1$2 -// @calls main.func1 -> main.func1$1 -// @calls main.func1$2 -> main.func1$1 +// @calls command-line-arguments.func1 -> command-line-arguments.func1$2 +// @calls command-line-arguments.func1 -> command-line-arguments.func1$1 +// @calls command-line-arguments.func1$2 -> command-line-arguments.func1$1 func func2() { var x, y *int @@ -40,8 +41,8 @@ func func2() { go func() { y = &b }() - print(x) // @pointsto main.a - print(y) // @pointsto main.b + print(x) // @pointsto command-line-arguments.a + print(y) // @pointsto command-line-arguments.b } func func3() { @@ -53,8 +54,8 @@ func func3() { } return }() - print(x) // @pointsto main.a - print(y) // @pointsto main.b | main.c + print(x) // @pointsto command-line-arguments.a + print(y) // @pointsto command-line-arguments.b | command-line-arguments.c } func swap(x, y *int) (*int, *int) { // @line swap @@ -74,26 +75,26 @@ func func4() { print(q) // @pointsto makeslice[*]@func4make:11 f := &b - print(f) // @pointsto main.b + print(f) // @pointsto command-line-arguments.b } type T int func (t *T) f(x *int) *int { - print(t) // @pointsto main.a - print(x) // @pointsto main.c + print(t) // @pointsto command-line-arguments.a + print(x) // @pointsto command-line-arguments.c return &b } func (t *T) g(x *int) *int { - print(t) // @pointsto main.a - print(x) // @pointsto main.b + print(t) // @pointsto command-line-arguments.a + print(x) // @pointsto command-line-arguments.b return &c } func (t *T) h(x *int) *int { - print(t) // @pointsto main.a - print(x) // @pointsto main.b + print(t) // @pointsto command-line-arguments.a + print(x) // @pointsto command-line-arguments.b return &c } @@ -102,29 +103,29 @@ var h func(*T, *int) *int func func5() { // Static call of method. t := (*T)(&a) - print(t.f(&c)) // @pointsto main.b + print(t.f(&c)) // @pointsto command-line-arguments.b // Static call of method as function - print((*T).g(t, &b)) // @pointsto main.c + print((*T).g(t, &b)) // @pointsto command-line-arguments.c // Dynamic call (not invoke) of method. h = (*T).h - print(h(t, &b)) // @pointsto main.c + print(h(t, &b)) // @pointsto command-line-arguments.c } -// @calls main.func5 -> (*main.T).f -// @calls main.func5 -> (*main.T).g$thunk -// @calls main.func5 -> (*main.T).h$thunk +// @calls command-line-arguments.func5 -> (*command-line-arguments.T).f +// @calls command-line-arguments.func5 -> (*command-line-arguments.T).g$thunk +// @calls command-line-arguments.func5 -> (*command-line-arguments.T).h$thunk func func6() { A := &a f := func() *int { return A // (free variable) } - print(f()) // @pointsto main.a + print(f()) // @pointsto command-line-arguments.a } -// @calls main.func6 -> main.func6$1 +// @calls command-line-arguments.func6 -> command-line-arguments.func6$1 type I interface { f() @@ -138,18 +139,18 @@ func func7() { var i I = D{} imethodClosure := i.f imethodClosure() - // @calls main.func7 -> (main.I).f$bound - // @calls (main.I).f$bound -> (main.D).f + // @calls command-line-arguments.func7 -> (command-line-arguments.I).f$bound + // @calls (command-line-arguments.I).f$bound -> (command-line-arguments.D).f var d D cmethodClosure := d.f cmethodClosure() - // @calls main.func7 -> (main.D).f$bound - // @calls (main.D).f$bound ->(main.D).f + // @calls command-line-arguments.func7 -> (command-line-arguments.D).f$bound + // @calls (command-line-arguments.D).f$bound ->(command-line-arguments.D).f methodExpr := D.f methodExpr(d) - // @calls main.func7 -> (main.D).f$thunk + // @calls command-line-arguments.func7 -> (command-line-arguments.D).f$thunk } func func8(x ...int) { @@ -182,11 +183,11 @@ func func9() { 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 + print(e.x1) // @pointsto command-line-arguments.a + print(e.x2) // @pointsto command-line-arguments.a + print(e.x3) // @pointsto command-line-arguments.a + print(e.x4) // @pointsto command-line-arguments.a + print(e.x5) // @pointsto command-line-arguments.a } func main() { @@ -201,5 +202,5 @@ func main() { func9() } -// @calls <root> -> main.main -// @calls <root> -> main.init +// @calls <root> -> command-line-arguments.main +// @calls <root> -> command-line-arguments.init diff --git a/go/pointer/testdata/funcreflect.go b/go/pointer/testdata/funcreflect.go index a0a9a5faa..2b4315ba5 100644 --- a/go/pointer/testdata/funcreflect.go +++ b/go/pointer/testdata/funcreflect.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main @@ -8,7 +9,7 @@ var zero, a, b int var false2 bool func f(p *int, q hasF) *int { - print(p) // @pointsto main.a + print(p) // @pointsto command-line-arguments.a print(q) // @types *T print(q.(*T)) // @pointsto new@newT1:22 return &b @@ -26,10 +27,10 @@ func reflectValueCall() { reflect.ValueOf(&a), }) print(res[0].Interface()) // @types *int - print(res[0].Interface().(*int)) // @pointsto main.b + print(res[0].Interface().(*int)) // @pointsto command-line-arguments.b } -// @calls main.reflectValueCall -> main.f +// @calls command-line-arguments.reflectValueCall -> command-line-arguments.f func reflectValueCallIndirect() { rvf := reflect.ValueOf(g) @@ -45,14 +46,14 @@ func reflectValueCallIndirect() { }) res0 := res[0].Interface() print(res0) // @types *int | *bool | *T - print(res0.(*int)) // @pointsto main.b - print(res0.(*bool)) // @pointsto main.false2 + print(res0.(*int)) // @pointsto command-line-arguments.b + print(res0.(*bool)) // @pointsto command-line-arguments.false2 print(res0.(hasF)) // @types *T print(res0.(*T)) // @pointsto new@newT2:19 } -// @calls main.reflectValueCallIndirect -> (reflect.Value).Call$bound -// @calls (reflect.Value).Call$bound -> main.g +// @calls command-line-arguments.reflectValueCallIndirect -> (reflect.Value).Call$bound +// @calls (reflect.Value).Call$bound -> command-line-arguments.g func reflectTypeInOut() { var f func(float64, bool) (string, int) @@ -94,17 +95,17 @@ func reflectTypeMethodByName() { F, _ := TU.MethodByName("F") print(reflect.Zero(F.Type)) // @types func(T) | func(U, int) - print(F.Func) // @pointsto (main.T).F | (main.U).F + print(F.Func) // @pointsto (command-line-arguments.T).F | (command-line-arguments.U).F g, _ := TU.MethodByName("g") print(reflect.Zero(g.Type)) // @types func(T, int) | func(U, string) - print(g.Func) // @pointsto (main.T).g | (main.U).g + print(g.Func) // @pointsto (command-line-arguments.T).g | (command-line-arguments.U).g // Non-literal method names are treated less precisely. U := reflect.TypeOf(U{}) X, _ := U.MethodByName(nonconst) print(reflect.Zero(X.Type)) // @types func(U, int) | func(U, string) - print(X.Func) // @pointsto (main.U).F | (main.U).g + print(X.Func) // @pointsto (command-line-arguments.U).F | (command-line-arguments.U).g // Interface methods. rThasF := reflect.TypeOf(new(hasF)).Elem() @@ -118,7 +119,7 @@ func reflectTypeMethodByName() { func reflectTypeMethod() { m := reflect.TypeOf(T{}).Method(0) print(reflect.Zero(m.Type)) // @types func(T) | func(T, int) - print(m.Func) // @pointsto (main.T).F | (main.T).g + print(m.Func) // @pointsto (command-line-arguments.T).F | (command-line-arguments.T).g } func main() { diff --git a/go/pointer/testdata/hello.go b/go/pointer/testdata/hello.go index b81784b22..3967cbe00 100644 --- a/go/pointer/testdata/hello.go +++ b/go/pointer/testdata/hello.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main @@ -12,7 +13,7 @@ type S int var theS S func (s *S) String() string { - print(s) // @pointsto main.theS + print(s) // @pointsto command-line-arguments.theS return "" } @@ -23,5 +24,5 @@ func main() { fmt.Println("Hello, World!", &theS) } -// @calls main.main -> fmt.Println -// @calls (*fmt.pp).handleMethods -> (*main.S).String +// @calls command-line-arguments.main -> fmt.Println +// @calls (*fmt.pp).handleMethods -> (*command-line-arguments.S).String diff --git a/go/pointer/testdata/interfaces.go b/go/pointer/testdata/interfaces.go index 91c0fa9a9..2312e13ed 100644 --- a/go/pointer/testdata/interfaces.go +++ b/go/pointer/testdata/interfaces.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main @@ -34,13 +35,13 @@ func interface1() { print(j) // @types D print(k) // @types *int | D - print(i.(*int)) // @pointsto main.a + print(i.(*int)) // @pointsto command-line-arguments.a print(j.(*int)) // @pointsto - print(k.(*int)) // @pointsto main.a + print(k.(*int)) // @pointsto command-line-arguments.a print(i.(D).ptr) // @pointsto - print(j.(D).ptr) // @pointsto main.b - print(k.(D).ptr) // @pointsto main.b + print(j.(D).ptr) // @pointsto command-line-arguments.b + print(k.(D).ptr) // @pointsto command-line-arguments.b } func interface2() { @@ -54,21 +55,21 @@ func interface2() { print(i) // @types *C print(j) // @types D print(k) // @types *C | D - print(k) // @pointsto makeinterface:main.D | makeinterface:*main.C + print(k) // @pointsto makeinterface:command-line-arguments.D | makeinterface:*command-line-arguments.C k.f() - // @calls main.interface2 -> (*main.C).f - // @calls main.interface2 -> (main.D).f + // @calls command-line-arguments.interface2 -> (*command-line-arguments.C).f + // @calls command-line-arguments.interface2 -> (command-line-arguments.D).f - print(i.(*C)) // @pointsto main.a - print(j.(D).ptr) // @pointsto main.a - print(k.(*C)) // @pointsto main.a + print(i.(*C)) // @pointsto command-line-arguments.a + print(j.(D).ptr) // @pointsto command-line-arguments.a + print(k.(*C)) // @pointsto command-line-arguments.a switch x := k.(type) { case *C: - print(x) // @pointsto main.a + print(x) // @pointsto command-line-arguments.a case D: - print(x.ptr) // @pointsto main.a + print(x.ptr) // @pointsto command-line-arguments.a case *E: print(x) // @pointsto } @@ -94,15 +95,15 @@ func interface4() { j := i.(I) // interface narrowing type-assertion print(j) // @types D - print(j.(D).ptr) // @pointsto main.a + print(j.(D).ptr) // @pointsto command-line-arguments.a var l interface{} = j // interface widening assignment. print(l) // @types D - print(l.(D).ptr) // @pointsto main.a + print(l.(D).ptr) // @pointsto command-line-arguments.a m := j.(interface{}) // interface widening type-assertion. print(m) // @types D - print(m.(D).ptr) // @pointsto main.a + print(m.(D).ptr) // @pointsto command-line-arguments.a } // Interface method calls and value flow: @@ -128,19 +129,19 @@ func interface5() { print(j.f(&i)) // @pointsto p.x@i5p:6 print(&i) // @pointsto i@i5i:6 - print(j) // @pointsto makeinterface:*main.P + print(j) // @pointsto makeinterface:*command-line-arguments.P } -// @calls main.interface5 -> (*main.P).f +// @calls command-line-arguments.interface5 -> (*command-line-arguments.P).f func interface6() { f := I.f - print(f) // @pointsto (main.I).f$thunk + print(f) // @pointsto (command-line-arguments.I).f$thunk f(new(struct{ D })) } -// @calls main.interface6 -> (main.I).f$thunk -// @calls (main.I).f$thunk -> (*struct{main.D}).f +// @calls command-line-arguments.interface6 -> (command-line-arguments.I).f$thunk +// @calls (command-line-arguments.I).f$thunk -> (*struct{command-line-arguments.D}).f func main() { interface1() diff --git a/go/pointer/testdata/mapreflect.go b/go/pointer/testdata/mapreflect.go index bc5e7e6b7..d8c1d5a89 100644 --- a/go/pointer/testdata/mapreflect.go +++ b/go/pointer/testdata/mapreflect.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main @@ -25,11 +26,11 @@ func reflectMapKeysIndex() { print(k) // @pointsto <alloc in (reflect.Value).MapKeys> print(k) // @types *int print(k.Interface()) // @types *int - print(k.Interface().(*int)) // @pointsto main.a + print(k.Interface().(*int)) // @pointsto command-line-arguments.a v := mrv.MapIndex(k) print(v.Interface()) // @types *bool - print(v.Interface().(*bool)) // @pointsto main.b + print(v.Interface().(*bool)) // @pointsto command-line-arguments.b } } @@ -38,11 +39,11 @@ func reflectSetMapIndex() { mrv := reflect.ValueOf(m) mrv.SetMapIndex(reflect.ValueOf(&a), reflect.ValueOf(&b)) - print(m[nil]) // @pointsto main.b + print(m[nil]) // @pointsto command-line-arguments.b for _, k := range mrv.MapKeys() { print(k.Interface()) // @types *int - print(k.Interface().(*int)) // @pointsto main.a + print(k.Interface().(*int)) // @pointsto command-line-arguments.a } tmap := reflect.TypeOf(m) @@ -71,9 +72,9 @@ func reflectSetMapIndexInterface() { reflect.ValueOf(m).SetMapIndex(reflect.ValueOf(&a), reflect.ValueOf(&b)) for k, v := range m { print(k) // @types *int - print(k.(*int)) // @pointsto main.a + print(k.(*int)) // @pointsto command-line-arguments.a print(v) // @types *bool - print(v.(*bool)) // @pointsto main.b + print(v.(*bool)) // @pointsto command-line-arguments.b } } diff --git a/go/pointer/testdata/maps.go b/go/pointer/testdata/maps.go index f73a6ea19..cce4a1020 100644 --- a/go/pointer/testdata/maps.go +++ b/go/pointer/testdata/maps.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main @@ -11,8 +12,8 @@ func maps1() { m2 := make(map[*int]*int) // @line m1m2 m2[&b] = &a - print(m1[nil]) // @pointsto main.b | main.c - print(m2[nil]) // @pointsto main.a + print(m1[nil]) // @pointsto command-line-arguments.b | command-line-arguments.c + print(m2[nil]) // @pointsto command-line-arguments.a print(m1) // @pointsto makemap@m1m1:21 print(m2) // @pointsto makemap@m1m2:12 @@ -20,19 +21,19 @@ func maps1() { m1[&b] = &c for k, v := range m1 { - print(k) // @pointsto main.a | main.b - print(v) // @pointsto main.b | main.c + print(k) // @pointsto command-line-arguments.a | command-line-arguments.b + print(v) // @pointsto command-line-arguments.b | command-line-arguments.c } for k, v := range m2 { - print(k) // @pointsto main.b - print(v) // @pointsto main.a + print(k) // @pointsto command-line-arguments.b + print(v) // @pointsto command-line-arguments.a } // Lookup doesn't create any aliases. - print(m2[&c]) // @pointsto main.a + print(m2[&c]) // @pointsto command-line-arguments.a if _, ok := m2[&a]; ok { - print(m2[&c]) // @pointsto main.a + print(m2[&c]) // @pointsto command-line-arguments.a } } @@ -41,8 +42,8 @@ func maps2() { m2 := map[*int]*int{&b: &c} _ = []map[*int]*int{m1, m2} // (no spurious merging of m1, m2) - print(m1[nil]) // @pointsto main.b - print(m2[nil]) // @pointsto main.c + print(m1[nil]) // @pointsto command-line-arguments.b + print(m2[nil]) // @pointsto command-line-arguments.c } var g int @@ -54,7 +55,7 @@ func maps3() { // v components, so copying the map key or value may cause // miswiring if the key has >1 components. In the worst case, // this causes a crash. The test below used to report that - // pts(v) includes not just main.g but new(float64) too, which + // pts(v) includes not just command-line-arguments.g but new(float64) too, which // is ill-typed. // sizeof(K) > 1, abstractly @@ -63,7 +64,7 @@ func maps3() { m := map[K]*int{k: &g} for _, v := range m { - print(v) // @pointsto main.g + print(v) // @pointsto command-line-arguments.g } } @@ -78,17 +79,17 @@ func maps4() { m := map[K]*int{k: &g} for x, y := range m { - print(x.a) // @pointsto main.v - print(y) // @pointsto main.g + print(x.a) // @pointsto command-line-arguments.v + print(y) // @pointsto command-line-arguments.g } var i struct{ a *float64 } for i, _ = range m { - print(i.a) // @pointsto main.v + print(i.a) // @pointsto command-line-arguments.v } var j interface{} for _, j = range m { // TODO support the statement `print(j.(*int))` - print(j) // @pointsto main.g + print(j) // @pointsto command-line-arguments.g } for _, _ = range m { } @@ -96,7 +97,7 @@ func maps4() { // effects of indexing for _, j = range m { // TODO support the statement `print(j.(*int))` - print(j) // @pointsto main.g + print(j) // @pointsto command-line-arguments.g } } diff --git a/go/pointer/testdata/panic.go b/go/pointer/testdata/panic.go index ee8a7668e..3377d836d 100644 --- a/go/pointer/testdata/panic.go +++ b/go/pointer/testdata/panic.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main @@ -31,6 +32,6 @@ func main() { } ex := recover() print(ex) // @types myPanic | string | func(int) | func() string - print(ex.(func(int))) // @pointsto main.f - print(ex.(func() string)) // @pointsto main.g + print(ex.(func(int))) // @pointsto command-line-arguments.f + print(ex.(func() string)) // @pointsto command-line-arguments.g } diff --git a/go/pointer/testdata/recur.go b/go/pointer/testdata/recur.go index 4c7229de9..065676330 100644 --- a/go/pointer/testdata/recur.go +++ b/go/pointer/testdata/recur.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main @@ -8,4 +9,4 @@ func main() { main() } -// @calls main.main -> main.main +// @calls command-line-arguments.main -> command-line-arguments.main diff --git a/go/pointer/testdata/reflect.go b/go/pointer/testdata/reflect.go index 6b8d0f22e..cf3195a6a 100644 --- a/go/pointer/testdata/reflect.go +++ b/go/pointer/testdata/reflect.go @@ -1,9 +1,12 @@ +//go:build ignore // +build ignore package main -import "reflect" -import "unsafe" +import ( + "reflect" + "unsafe" +) var a, b int var unknown bool @@ -11,9 +14,9 @@ var unknown bool func reflectIndirect() { ptr := &a // Pointer: - print(reflect.Indirect(reflect.ValueOf(&ptr)).Interface().(*int)) // @pointsto main.a + print(reflect.Indirect(reflect.ValueOf(&ptr)).Interface().(*int)) // @pointsto command-line-arguments.a // Non-pointer: - print(reflect.Indirect(reflect.ValueOf([]*int{ptr})).Interface().([]*int)[0]) // @pointsto main.a + print(reflect.Indirect(reflect.ValueOf([]*int{ptr})).Interface().([]*int)[0]) // @pointsto command-line-arguments.a } func reflectNewAt() { @@ -21,7 +24,7 @@ func reflectNewAt() { print(reflect.NewAt(reflect.TypeOf(3), unsafe.Pointer(&x)).Interface()) // @types *int } -// @warning "unsound: main.reflectNewAt contains a reflect.NewAt.. call" +// @warning "unsound: command-line-arguments.reflectNewAt contains a reflect.NewAt.. call" func reflectTypeOf() { t := reflect.TypeOf(3) @@ -61,7 +64,7 @@ func metareflection() { print(v1a) // @types reflect.Value v0a := v1a.Interface().(reflect.Value) // unbox print(v0a) // @types *int - print(v0a.Interface().(*int)) // @pointsto main.a + print(v0a.Interface().(*int)) // @pointsto command-line-arguments.a // "box" an interface{} lvalue twice, unbox it twice. var iface interface{} = 3 diff --git a/go/pointer/testdata/rtti.go b/go/pointer/testdata/rtti.go index 88e1798d0..05b4a88c1 100644 --- a/go/pointer/testdata/rtti.go +++ b/go/pointer/testdata/rtti.go @@ -25,5 +25,5 @@ type I interface { func main() { type Y struct{ X } - print(reflect.Indirect(reflect.ValueOf(new(Y))).Interface().(I).F()) // @pointsto main.a + print(reflect.Indirect(reflect.ValueOf(new(Y))).Interface().(I).F()) // @pointsto command-line-arguments.a } diff --git a/go/pointer/testdata/structs.go b/go/pointer/testdata/structs.go index 9036d608d..085439e04 100644 --- a/go/pointer/testdata/structs.go +++ b/go/pointer/testdata/structs.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main @@ -12,12 +13,12 @@ type A struct { } func (a A) m1() { - print(a.f) // @pointsto main.p + print(a.f) // @pointsto command-line-arguments.p } func (a *A) m2() { print(a) // @pointsto complit.A@struct1s:9 - print(a.f) // @pointsto main.p + print(a.f) // @pointsto command-line-arguments.p } type B struct { @@ -32,21 +33,21 @@ func structs1() { b.f = &p b.g = b - print(b.h) // @pointsto main.q - print(b.f) // @pointsto main.p + print(b.h) // @pointsto command-line-arguments.q + print(b.f) // @pointsto command-line-arguments.p print(b.g) // @types *B ptr := &b.f - print(*ptr) // @pointsto main.p + print(*ptr) // @pointsto command-line-arguments.p b.m1() b.m2() } -// @calls main.structs1 -> (main.A).m1 -// @calls main.structs1 -> (*main.A).m2 -// @calls (*main.B).m1 -> (main.A).m1 -// @calls (*main.B).m2 -> (*main.A).m2 +// @calls command-line-arguments.structs1 -> (command-line-arguments.A).m1 +// @calls command-line-arguments.structs1 -> (*command-line-arguments.A).m2 +// @calls (*command-line-arguments.B).m1 -> (command-line-arguments.A).m1 +// @calls (*command-line-arguments.B).m2 -> (*command-line-arguments.A).m2 type T struct { x int |