mirror of
https://github.com/burrowers/garble.git
synced 2025-10-06 16:26:57 +08:00

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.
133 lines
2.1 KiB
Plaintext
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
|