davecgh / go-spew

Implements a deep pretty printer for Go data structures to aid in debugging

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

panic during Sdump when sorting struct with private fields

zachmu opened this issue · comments

I ran into this when running a test that uses testify, which uses Sdump to print pretty diffs. This bug was originally reported here:

stretchr/testify#480

Here's a minimal program that reproduces the buggy behavior (also attached as .zip file):

package main

import "github.com/davecgh/go-spew/spew"

type s struct {
f map[[1]byte]int
}

func main() {

v1 := s{
	f: map[[1]byte]int{
		[1]byte{0x1}: 0,
		[1]byte{0x2}: 0,
	},
}

var spewConfig = spew.ConfigState{
	Indent:                  " ",
	DisablePointerAddresses: true,
	DisableCapacities:       true,
	SortKeys:                true,
}

spewConfig.Sdump(v1) // panic

}

Stack trace:

GOROOT=/usr/local/go #gosetup
GOPATH=/Users/zachmu/liquidata/go-workspace #gosetup
/usr/local/go/bin/go build -o /private/var/folders/gc/qlp9wrp95y59cbwc48pphkm00000gn/T/__go_build_spewbug_go__1 /Users/zachmu/liquidata/go-workspace/src/github.com/liquidata-inc/ld/dolt/go/spewbug.go #gosetup
/private/var/folders/gc/qlp9wrp95y59cbwc48pphkm00000gn/T/__go_build_spewbug_go__1 #gosetup
panic: reflect.Value.Interface: cannot return value obtained from unexported field or method

goroutine 1 [running]:
reflect.valueInterface(0x10d4fc0, 0xc0000a4199, 0xa8, 0x1, 0x10d4fc0, 0xc0000a4198)
/usr/local/go/src/reflect/value.go:990 +0x1bf
reflect.Value.Interface(...)
/usr/local/go/src/reflect/value.go:979
github.com/davecgh/go-spew/spew.valueSortLess(0x10d6c40, 0xc0000a4199, 0xb1, 0x10d6c40, 0xc0000a4198, 0xb1, 0x0)
/Users/zachmu/liquidata/go-workspace/pkg/mod/github.com/davecgh/go-spew@v1.1.1/spew/common.go:315 +0x183
github.com/davecgh/go-spew/spew.(*valuesSorter).Less(0xc0000d6040, 0x1, 0x0, 0x100b558)
/Users/zachmu/liquidata/go-workspace/pkg/mod/github.com/davecgh/go-spew@v1.1.1/spew/common.go:328 +0xf7
sort.insertionSort(0x111bee0, 0xc0000d6040, 0x0, 0x2)
/usr/local/go/src/sort/sort.go:27 +0xc4
sort.quickSort(0x111bee0, 0xc0000d6040, 0x0, 0x2, 0x4)
/usr/local/go/src/sort/sort.go:209 +0x201
sort.Sort(0x111bee0, 0xc0000d6040)
/usr/local/go/src/sort/sort.go:218 +0x79
github.com/davecgh/go-spew/spew.sortValues(0xc00009a330, 0x2, 0x2, 0xc0000a2100)
/Users/zachmu/liquidata/go-workspace/pkg/mod/github.com/davecgh/go-spew@v1.1.1/spew/common.go:340 +0x70
github.com/davecgh/go-spew/spew.(*dumpState).dump(0xc0000b5eb0, 0x10dc1e0, 0xc00009a210, 0x35)
/Users/zachmu/liquidata/go-workspace/pkg/mod/github.com/davecgh/go-spew@v1.1.1/spew/dump.go:388 +0x60f
github.com/davecgh/go-spew/spew.(*dumpState).dump(0xc0000b5eb0, 0x10e0900, 0xc00009a210, 0x19)
/Users/zachmu/liquidata/go-workspace/pkg/mod/github.com/davecgh/go-spew@v1.1.1/spew/dump.go:421 +0xdca
github.com/davecgh/go-spew/spew.fdump(0xc0000a2100, 0x111b480, 0xc00009a240, 0xc0000b5f78, 0x1, 0x1)
/Users/zachmu/liquidata/go-workspace/pkg/mod/github.com/davecgh/go-spew@v1.1.1/spew/dump.go:465 +0x15b
github.com/davecgh/go-spew/spew.(*ConfigState).Sdump(0xc0000a2100, 0xc0000b5f78, 0x1, 0x1, 0xc00006e058, 0x0)
/Users/zachmu/liquidata/go-workspace/pkg/mod/github.com/davecgh/go-spew@v1.1.1/spew/config.go:281 +0x78
main.main()
spewbug.go:25 +0x10b

Process finished with exit code 2

Works fine if the SortKeys option is unspecified.

spewbug.go.zip

@zachmu, thanks for the minimal example!

I just encountered this via testify as well. It would be great to apply the fix in #111 or some other fix.