Skip to content

fix(writer): owning value move 改走 doc 所有权转移 - #2

Merged
BombaxCeiba merged 1 commit into
mainfrom
fix/owning-value-move
Jul 19, 2026
Merged

fix(writer): owning value move 改走 doc 所有权转移#2
BombaxCeiba merged 1 commit into
mainfrom
fix/owning-value-move

Conversation

@BombaxCeiba

@BombaxCeiba BombaxCeiba commented Jul 19, 2026

Copy link
Copy Markdown
Owner

owning value 之前的 move 会崩。operator=(value&&) 对 owning 和 reference 共用一套
set_value(内容覆盖 + 挂 children 保活),但 owning 被 move 之后 val_ 指向已经转走的
doc 节点、has_parent_ 被清空,再赋值就是写野指针 + 解引用空 shared_ptr —— 排个
vector 就炸。

改成 owning 的 move-assign 直接转 doc 所有权(doc_/val_/has_parent_),reference 保持
原样。get_has_parent 顺手挡了下空指针。count_children 几条断言按 doc 转移后的值调了
(owning move 不再往 children 挂 src doc)。

test_owning_value_move 覆盖 moved-from 重新赋值和 vector sort,本地跑过(含 Writer
suite 全过)。

@BombaxCeiba
BombaxCeiba force-pushed the fix/owning-value-move branch 2 times, most recently from 13d7bf9 to b483687 Compare July 19, 2026 05:53
fix(writer): owning value move transfers doc ownership

owning yyjson::value 的 operator=(value&&) 之前对 owning 和 reference 共用一套
set_value(内容覆盖 + 挂 children 保活)。但 owning 被 move 之后 val_ 还指向已经
转走的 doc 节点(悬挂)、has_parent_ 被清空,这时走 set_value 既写野指针(dst->tag)
又解引用空 shared_ptr。owning value 因此不满足 std::movable,塞进 vector 排个序
就崩。

现在 owning 的 move-assign 直接转移 doc_/val_/has_parent_ 三成员(doc 所有权转移),
reference value 仍走 set_value(node 编辑语义)。get_has_parent() 顺手对空 shared_ptr
做了保护。count_children 几条断言按 doc 转移后的实际值调整(owning move-assign 不
再往 children 挂 src doc)。

新增 test_owning_value_move,覆盖 moved-from 重新赋值和 vector<value> 排序。

operator=(value&&) previously shared one set_value between owning and reference
values (content overwrite + keep src doc alive via dst.children). After a move, an
owning value's val_ still points into the already-transferred doc (dangling) and
has_parent_ is emptied, so set_value writes a dangling pointer and dereferences an
empty shared_ptr. owning value thus isn't std::movable, and sorting a vector crashes.

Now owning move-assign transfers doc_/val_/has_parent_ directly; reference values
keep set_value. get_has_parent() guards empty shared_ptr. count_children assertions
adjusted to post-transfer values. Adds test_owning_value_move.
@BombaxCeiba
BombaxCeiba force-pushed the fix/owning-value-move branch from b483687 to 5d540c6 Compare July 19, 2026 11:17
@BombaxCeiba
BombaxCeiba merged commit 2ed9d20 into main Jul 19, 2026
13 of 15 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.

1 participant