Upgrade to Pro — share decks privately, control downloads, hide ads and more …

gob バイナリが Go バージョンによって 出力が変わることについて調べてみた / Inve...

convto
September 13, 2024

gob バイナリが Go バージョンによって 出力が変わることについて調べてみた / Investigating How gob Binary Output Changes Across Go Versions

Asakusa.go #3 での発表資料です

convto

September 13, 2024
Tweet

More Decks by convto

Other Decks in Technology

Transcript

  1. なんか typedef / value の id がずれてそう - たしかに出力は変わっている -

    id の値が変わっている - id = 65 だと typedef がちょうど 1byte で表現できないため、古い方は ちょっと勿体無い - 先頭 1bit が終端判定、末尾 1bit が正負判定。値が 6bit で収まる なら 1byte で表現できる。65 はちょうどたりない
  2. どこで入った? - 霊感で 1.21 まで比べてみたら 1.23 と一致してた $ diff -s

    <(go1.21.0 run main.go) <(go1.23.0 run main.go) Files /dev/fd/11 and /dev/fd/12 are identical - 1.20.1 系では挙動に差がない $ diff -s <(go1.20.1 run main.go) <(go1.20.14 run main.go) Files /dev/fd/11 and /dev/fd/12 are identical - 1.21 に上がる時に入っているはず!
  3. id ずれた理由 - firstUserId = 64 が定義されてて user 定義の型は id

    = 64 から始ま る - とりあえず nextId +1 から確保してたのが止まって 64 から使えるように なったという話っぽい!
  4. 感想 - marshal/unmarshal の互換を担保した上で encoded な値が変わるこ とはちょいちょいある - よくあるのはフィールド順番担保されないとか。今回は typeid

    が揃わな かった - encoded な値に対して一致するか確認する、みたいな処理は秘孔をつく 可能性があるのでやめておきましょう