encoding/gob: pointers to zero values are not initialized in Decode (original) (raw)
The following program crashes with nil deref in println statement:
package main
import ( "bytes" "encoding/gob" )
type X struct { A *int }
func main() { gob.Register(X{}) x := &X{A: new(int)} // *x.A = 1 buf := new(bytes.Buffer) gob.NewEncoder(buf).Encode(x) x1 := &X{} gob.NewDecoder(buf).Decode(x1) println(*x1.A) }
If "*x.A = 1" is uncommented the program does not crash.
It is perfectly fine to save wire bandwidth for zero values, but a variable value should not affect program behavior in such radical way. If a field points to a zero value, it is not zero, so it does not qualify for If a field has the zero value for its type, it is omitted from the transmission. I think that pointers to zero values should be explicitly transmitted as zero values, that will force Decode to restore the pointers.
go version devel +b0532a9 Mon Jun 8 05:13:15 2015 +0000 linux/amd64