Skip to content

fix: cicada/mvto insert で TupleBody の use-after-move を解消 (#57) - #110

Merged
thawk105 merged 1 commit into
masterfrom
fix-cicada-mvto-use-after-move
May 15, 2026
Merged

fix: cicada/mvto insert で TupleBody の use-after-move を解消 (#57)#110
thawk105 merged 1 commit into
masterfrom
fix-cicada-mvto-use-after-move

Conversation

@thawk105

Copy link
Copy Markdown
Owner

Summary

Closes #57

Test plan

  • CI (GCC 13) で cicada と mvto の全 workload (Release+Debug+ASan) がグリーンになる
  • ローカルで bomb_cicada.exe -extime=1 / bomb_mvto.exe -extime=1 が Debug+ASan で正常完了 (cicada 85619 tps, mvto 97042 tps)
  • INLINE_VERSION_OPT_CICADA=1 でビルドが通る (default の INLINE_VERSION_PROMOTION との組み合わせは pre-existing な別バグがあり今回は対象外)

Tuple::init() の 4 引数 overload で受け取る `TupleBody&& body` は本体で
未使用 (`[[maybe_unused]]`) なまま捨てられていた。呼び出し側 (cicada/mvto
の TxExecutor::insert) は newVersionGeneration() で `std::move(body)` した
直後に同じ `body` を再度 `std::move()` して init() に渡しており、典型的な
use-after-move となっていた。

cicada は `INLINE_VERSION_OPT=1` のとき init() 内で `body_ =
std::ref(inline_ver_.body_)` する。inline_ver_.body_ は default-construct
されたままで、insert で挿入したはずの値が消える (データロス)。デフォルト
ビルド (INLINE_VERSION_OPT=0) と mvto は `new_ver->body_` を参照するため
偶然動いていたが、コードスメルとしての use-after-move は残っていた。

Issue #57 の Intent B (推奨案) に従い、init() overload の 4 番目の引数を
削除し、呼び出し側も 3 引数の呼び出しに揃える。これにより:

- 二重 move による use-after-move を除去
- INLINE_VERSION_OPT=1 と =0 で body の所有経路が一致 (`new_ver->body_`)

なお INLINE_VERSION_OPT=1 で insert された tuple の body が
new_ver 経由でアクセスできることは元のコードでも保証されている。
@thawk105
thawk105 merged commit 073f5f2 into master May 15, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

cicada/mvto: Tuple::init() overload で TupleBody が use-after-move + INLINE_VERSION_OPT=1 でデータロス

1 participant