Files
garble/testdata/script/implement.txtar
Daniel Martí e0dbea2b3d hash structs via the bundled and altered typeutil.hash
As spotted by the protobuf package via check-third-party.sh,
the two structs below are identical:

    type alias1 = int64
    type Struct1 struct { Alias alias1 }

    type alias2 = int64
    type Struct2 struct { Alias alias2 }

Our previous approach with stripStructTags dealt with struct tags,
but it did not deal with aliases, which are now present in go/types
thanks to the new alias tracking.

The new approach properly ignores struct tags and unaliases any
type aliases, resulting in correct hashes of any type.
2025-01-18 05:51:03 +01:00

133 lines
2.1 KiB
Plaintext

go build
exec garble -debugdir=/tmp/test build
exec ./main
cmp stdout main.stdout
! binsubstr main$exe 'unexportedMethod' 'privateIface'
[short] stop # no need to verify this with -short
# Check that the program works as expected without garble.
go build
exec ./main
cmp stdout main.stdout
-- go.mod --
module test/main
go 1.23
-- main.go --
package main
import (
"fmt"
"test/main/lib1"
"test/main/lib2"
"test/main/lib3"
)
type T string
func (t T) String() string {
return "String method for " + string(t)
}
func (t T) unexportedMethod() string {
return "unexported method for " + string(t)
}
type privateInterface interface {
privateIface()
}
func (T) privateIface() {}
var _ privateInterface = T("")
type StructUnnamed = struct {
Foo int
Bar []*struct {
Nested *[]string
NestedTagged string
NestedAlias int64 // we can skip the alias too
}
Named lib3.Named
lib3.StructEmbed
Tagged string // no field tag
Alias int64 // we can skip the alias too
}
var _ = lib1.Struct1(lib2.Struct2{})
var _ = StructUnnamed(lib2.Struct2{})
func main() {
fmt.Println(T("foo"))
fmt.Println(T("foo").unexportedMethod())
}
-- main_linux.go --
package main
import "syscall"
// golang.org/x/sys/unix has a copy of syscall.Rlimit and converts with it.
// Note that syscall.Rlimit is only declared in some unix GOOSes.
type Rlimit2 struct {
Cur uint64
Max uint64
}
var _ = (*syscall.Rlimit)(new(Rlimit2))
-- lib1/lib1.go --
package lib1
import "test/main/lib3"
type Struct1 struct {
Foo int
Bar []*struct {
Nested *[]string
NestedTagged string `json:"tagged1"`
NestedAlias alias1
}
Named lib3.Named
lib3.StructEmbed
Tagged string `json:"tagged1"`
Alias alias1
}
type alias1 = int64
-- lib2/lib2.go --
package lib2
import "test/main/lib3"
type Struct2 struct {
Foo int
Bar []*struct {
Nested *[]string
NestedTagged string `json:"tagged2"`
NestedAlias alias2
}
Named lib3.Named
lib3.StructEmbed
Tagged string `json:"tagged2"`
Alias alias2
}
type alias2 = int64
-- lib3/lib3.go --
package lib3
type Named int
type StructEmbed struct {
Baz any
}
-- main.stdout --
String method for foo
unexported method for foo