ugorji / go

idiomatic codec and rpc lib for msgpack, cbor, json, etc. msgpack.org[Go]
MIT License
1.85k stars 295 forks source link

MsgPack decoding triple embedded structure #350

Closed ghts closed 3 years ago

ghts commented 3 years ago

Dear ugorji.

This is subsequent report after issue #348 (decoding MsgPack encoded embedded structure).

After long busy days & delay, finally got some time to dig in.

Here is a more simplified reproducing test case.

In summary, there is some difference between 1.13 and 1.14, decoding 'triple' nested struct.

Decoding error : 'msgpack decode error [pos 15]: runtime error: invalid memory address or nil pointer dereference'

I don't log in github.com so often, if you want more information, would you please ping me by e-mail?

Being a happy 1.13 user. thank you for your greate code.

import (
    "bytes"
    "fmt"
    "github.com/ugorji/go/codec"
    "testing"
)

func TestDecoding_1_14(t *testing.T) {
    msgPackHandler := new(codec.MsgpackHandle)
    encoding_buffer := new(bytes.Buffer)
    value_to_be_encoded := new(STRUCT_A)

    if err := codec.NewEncoder(encoding_buffer, msgPackHandler).Encode(value_to_be_encoded); err != nil {
        println("Encoding error.")
        t.FailNow()
    }

    byte_slice := encoding_buffer.Bytes()
    restored_pointer_value := new(STRUCT_A)

    if err := codec.NewDecoderBytes(byte_slice, msgPackHandler).Decode(restored_pointer_value); err != nil {
        fmt.Printf("Decoding error : '%v'\n", err)
        t.FailNow()
    }
}

type STRUCT_A struct {
    *STRUCT_B
    Member_of_A_1 string
}

type STRUCT_B struct {
    *STRUCT_C
    Member_of_B_1 string
    Member_of_B_2 int64
}

type STRUCT_C struct {
    Member_of_C_1 string
}
ghts commented 3 years ago

That was fast!

I confirm that with 1.2.2 there is no error for embedded struct.

Now being a happy 1.2.2 user (not stuck in 1.13 anymore), thank you for great code.