Closed
Description
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