RyanJsonFuzzer.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #ifndef RyanJsonFuzzer_h
  2. #define RyanJsonFuzzer_h
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. #include "testCommon.h"
  7. #include "RyanJsonInternal.h"
  8. #include <signal.h>
  9. #include <stdint.h>
  10. #include <stddef.h>
  11. /**
  12. * @brief RyanJson Fuzzer 架构说明
  13. *
  14. * 架构分层:
  15. * - Driver(`utils/fuzzerDriver.c`):负责状态初始化、PRNG 与故障注入概率控制。
  16. * - Entry(`test/fuzzer/entry.c`):作为 `LLVMFuzzerTestOneInput` 入口,负责初始化和主流程调度。
  17. * - SelfTest(`utils/fuzzerSelfTest.c`):集中放置一次性确定性断言,避免每轮 fuzz 重复执行。
  18. * - Cases(`cases/`):承载与输入相关的运行期测试逻辑。
  19. *
  20. * 当前原则:
  21. * - 热路径只保留与当前输入相关的行为。
  22. * - 与输入无关的防御分支覆盖移到 self-test。
  23. * - 只有在“运行期结构上很难稳定命中”时,才允许最小范围的确定性补齐。
  24. * - PRNG 仍由输入驱动,保证同一输入触发同一路径。
  25. */
  26. /**
  27. * @brief Fuzzer 运行状态上下文
  28. *
  29. * 只保留运行期真正需要的全局状态,避免挂未使用的输入缓存字段。
  30. */
  31. typedef struct
  32. {
  33. uint32_t seed; // PRNG 种子,由当前输入混合初始化
  34. bool isEnableMemFail; // 是否启用内存分配失败
  35. } RyanJsonFuzzerState;
  36. /**
  37. * @brief 驱动层接口
  38. * 定义在 utils/fuzzerDriver.c
  39. */
  40. extern void RyanJsonFuzzerInit(const uint8_t *data, size_t size);
  41. extern uint32_t RyanJsonFuzzerNextRand();
  42. extern RyanJsonBool_e RyanJsonFuzzerShouldFail(uint32_t probability);
  43. /**
  44. * @brief 公共宏定义
  45. */
  46. #define RyanJsonCheckGotoExit(EX) \
  47. RyanJsonCheckCode(EX, { \
  48. result = RyanJsonFalse; \
  49. goto exit__; \
  50. })
  51. /*
  52. * 临时关闭随机 OOM,执行需要稳定断言的代码块。
  53. * 这个宏只用于“已经确定要验证某条路径的后置状态”。
  54. * 不用于把运行期理论可达的路径整体搬进 self-test。
  55. */
  56. #define fuzzTestWithMemFail(func) \
  57. do \
  58. { \
  59. RyanJsonBool_e lastIsEnableMemFail; \
  60. RyanJsonFuzzerMemFailPush(lastIsEnableMemFail, RyanJsonFalse); \
  61. func; \
  62. RyanJsonFuzzerMemFailPop(lastIsEnableMemFail); \
  63. } while (0)
  64. /**
  65. * @brief 全局变量声明
  66. */
  67. extern RyanJsonFuzzerState g_fuzzerState;
  68. /**
  69. * @brief 内存钩子函数
  70. */
  71. extern void *RyanJsonFuzzerMalloc(size_t size);
  72. extern void RyanJsonFuzzerFree(void *block);
  73. extern void *RyanJsonFuzzerRealloc(void *block, size_t size);
  74. /**
  75. * @brief Fuzzer 入口自检(一次性)
  76. */
  77. extern void RyanJsonFuzzerSelfTestOnce(void);
  78. extern void RyanJsonFuzzerSelfTestParseCases(void);
  79. extern void RyanJsonFuzzerSelfTestMinifyCases(void);
  80. extern void RyanJsonFuzzerSelfTestCreateCases(void);
  81. extern void RyanJsonFuzzerSelfTestModifyCases(void);
  82. extern void RyanJsonFuzzerSelfTestGetCases(void);
  83. extern void RyanJsonFuzzerSelfTestReplaceCases(void);
  84. extern void RyanJsonFuzzerSelfTestDuplicateCases(void);
  85. /**
  86. * @brief 解析与基础功能测试
  87. * 覆盖 Json 解析、压缩和基础打印功能。
  88. */
  89. extern RyanJsonBool_e RyanJsonFuzzerTestParse(RyanJson_t pJson, const char *data, uint32_t size);
  90. extern RyanJsonBool_e RyanJsonFuzzerTestMinify(const char *data, uint32_t size);
  91. /**
  92. * @brief 深度复制与比较测试
  93. * 验证复制结果与原 Object 的一致性。
  94. */
  95. extern RyanJsonBool_e RyanJsonFuzzerTestDuplicate(RyanJson_t pJson);
  96. /**
  97. * @brief 结构修改与访问测试
  98. * 测试对 Json 结构的修改(改值、改 key)以及数据访问安全性。
  99. */
  100. extern RyanJsonBool_e RyanJsonFuzzerTestModify(RyanJson_t pJson, uint32_t size);
  101. extern RyanJsonBool_e RyanJsonFuzzerTestGet(RyanJson_t pJson, uint32_t size);
  102. extern RyanJsonBool_e RyanJsonFuzzerVerifyGet(RyanJson_t lastJson, RyanJson_t pJson, uint32_t index, uint32_t size);
  103. /**
  104. * @brief 结构变异与增删测试
  105. * 测试节点的创建、替换、分离和删除,模拟复杂的 DOM 操作序列。
  106. */
  107. extern RyanJson_t RyanJsonFuzzerCreateRandomNode(RyanJson_t pJson);
  108. extern RyanJson_t RyanJsonFuzzerCreateRandomNodeWithKey(RyanJson_t pJson, const char *key);
  109. extern RyanJsonBool_e RyanJsonFuzzerTestCreate(RyanJson_t pJson, uint32_t size);
  110. extern RyanJsonBool_e RyanJsonFuzzerTestReplace(RyanJson_t pJson, uint32_t size);
  111. extern RyanJsonBool_e RyanJsonFuzzerTestDetach(RyanJson_t pJson, uint32_t size);
  112. extern RyanJsonBool_e RyanJsonFuzzerTestDelete(RyanJson_t pJson, uint32_t size);
  113. /* 保存当前故障注入开关,并切换到新状态。 */
  114. #define RyanJsonFuzzerMemFailPush(saved, enable) \
  115. do \
  116. { \
  117. (saved) = g_fuzzerState.isEnableMemFail; \
  118. g_fuzzerState.isEnableMemFail = (enable); \
  119. } while (0)
  120. /* 恢复调用前的故障注入状态,避免影响后续用例。 */
  121. #define RyanJsonFuzzerMemFailPop(saved) \
  122. do \
  123. { \
  124. g_fuzzerState.isEnableMemFail = (saved); \
  125. } while (0)
  126. #ifdef __cplusplus
  127. }
  128. #endif
  129. #endif