Skip to content

fix infinite loop when input json array is unclosed - #155

Open
howz97 wants to merge 1 commit into
bytedance:dev/boltfrom
howz97:fix_infinite_loop
Open

howz97 wants to merge 1 commit into
bytedance:dev/boltfrom
howz97:fix_infinite_loop

Conversation

@howz97

@howz97 howz97 commented Nov 11, 2026 •

Copy link
Copy Markdown
Contributor

Fix infinite loop TestFail("[8 ", "$[0]");

这个修复纠正了 peek() 在 EOF 时错误回退游标的行为。

peek() 的正常逻辑是:调用 SkipSpaceSafe() 跳过空白、读取一个字符,再执行 pos_ -= 1,让调用者后续还能消费这个字符。

但对于 "[8",读完 8 后,pos_ == len_ == 2。旧版 SkipSpaceSafe() 此时没有前进,却返回了最后一个字符 8;peek() 又无条件把位置退回到 1,于是数组解析反复读取同一个 8:

flowchart LR
    A["读完 8:pos = 2"] --> B["旧 peek:退回 pos = 1"]
    B --> C["再次跳过 8:pos = 2"]
    C --> B
    A --> D["修复后:保留 pos = 2,设置 EOF"]
    D --> E["错误检查终止解析"]
Loading

新增的两个判断分别处理:

  • 调用前已经到末尾:pos_ >= len_,直接设置 kParseErrorEof 并返回 0,不再回退。
  • 跳过空白后到末尾:例如 "[8, ",扫描器返回最后一个空白字符,也应报告 EOF,不再退回这个空白。

注意,返回 0 本身不会结束 while (peek() != ']'),因为 0 != ']'。真正终止循环的是紧接着的 RETURN_FALSE_IF_PARSE_ERROR(...):它检测到已经设置的 EOF 错误后返回 false。

最终结果是 "8" 和 kParseErrorEof:保留已经提取的值,同时明确报告数组缺少闭合 ]。

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