golang/go

encoding/gob: pointers to zero values are not initialized in Decode

dvyukov opened this issue · 1 comments

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

This would be a profound change to the logic and the semantics. Pointers do not exist in the model, so a pointer to a zero value is a zero value.

To say this is unfortunate is I think the best we can do here.