# RyanJson 核心优化工作流 ## 范围 - 本页仅覆盖“优化执行流程”。 - 交付结构见 `optimizationTemplate.md`。 - 模块风险细节见 `moduleHotspots.md`。 - 执行入口、覆盖目录、脚本参数基线见 `../../shared/ryanJsonCommon.md`。 ## 0) 前置条件(必须) - 在任何业务入口、测试入口、fuzzer 入口先调用 `RyanJsonInitHooks`。 - 默认建议使用统一封装分配器(即便最终仍转发到 `malloc/free/realloc`),便于统计和故障注入。 - 未初始化 hooks 时,不执行优化结论对比(避免基线不可比)。 - 当前实现没有默认 hooks 回退(全局 hooks 初始为 `NULL`),因此该前置条件是硬约束。 ## 1) 定义问题边界 - 明确是“行为错误修复”还是“性能/内存优化”。 - 明确是否允许改变历史行为(默认不允许)。 - 明确目标平台(32 位/64 位、是否 RTOS、是否启用 ASan/UBSan)。 ## 2) 建立可比较基线 - 功能:跑与改动模块相关的单元测试。 - 资源:记录内存峰值、分配次数、失败路径泄漏结果。 - 稳定性:保留至少一个历史 crash 样本回归。 - 覆盖:确认目标分支 true/false 双向是否可达。 ## 2.1) 回归入口策略 - 本地常规回归:先跑 `run_local_*`。 - 需要细调矩阵/并发/覆盖时,再直调 `scripts/ci/*`。 ## 3) 聚焦热点模块 - `RyanJsonParse.c`:数字解析、字符串转义、Unicode 代理对、状态推进。 - `RyanJsonPrint.c`:预分配边界、append 失败路径、double 打印策略。 - `RyanJsonItem.c`:Add/Insert/Replace/Detach/Delete 的所有权与链安全。 - `RyanJson.c`:Compare 有序/无序路径、深度与回溯。 ## 4) 设计最小改动 - 优先修复内存安全与语义一致性,再做微优化。 - 新防御逻辑要区分可恢复错误(返回 false/NULL)与不可恢复错误(启用 `RyanJsonEnableAssert` 时可 assert)。 - 避免引入额外常驻内存;若必须引入,先得到明确授权。 ## 5) 同步测试策略 - 不新增散文件,补到现有分类测试。 - 单元测试覆盖确定性语义,fuzzer 覆盖组合路径与未知输入。 - 新增每个分支至少一个触发样本,必要时固化到 corpus。 ## 6) 交付与复核 - 给出改动原因、收益、代价、兼容影响。 - 给出“已验证/未验证”边界。 - 给出剩余风险和下一轮优化建议。 ## 常见反模式 - 只看覆盖率,不看语义断言。 - 通过 assert 处理用户输入错误。 - 为了覆盖率引入会改变行为的冗余逻辑。 ## 依据(仓库内) - `RyanJson/RyanJson.c`:`RyanJsonInitHooks` 与全局 hooks 初始状态 - `RyanJson/RyanJson.h`:`Add/Insert`、`Replace` 失败语义注释 - `test/unityTest/cases/core/testCreate.c`、`test/unityTest/cases/core/testReplace.c`:失败所有权与宏分支断言 - `test/fuzzer/entry.c`:fuzzer 入口与稳定性回归链路 - `../../shared/ryanJsonCommon.md`:统一执行入口与覆盖口径