RyanJsonFuzzer.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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(`fuzzerDriver`):负责状态管理、伪随机数生成和确定性控制。
  16. * - Runner(`entry.c`):作为 `LLVMFuzzerTestOneInput` 入口,负责初始化、模式分发和清理。
  17. * - Case(`cases/`):承载具体测试逻辑,覆盖 Parse/Create/Modify/Structure 等模块。
  18. *
  19. * 确定性与可复现性:
  20. * - 以输入数据为种子驱动 PRNG,保证同一输入触发同一随机路径。
  21. * - `FuzzerState` 记录当前种子、输入缓冲区和读取位置。
  22. * - 通过 PRNG 控制内存失败注入,稳定覆盖 OOM 路径。
  23. *
  24. * 分发策略:
  25. * - 若首字节为 `0xFF`,进入 API 序列模式(预留扩展)。
  26. * - 其他输入进入解析模式,执行 Parse/Minify 与后续结构化变异测试。
  27. * - 该策略对普通 Json corpus 透明兼容。
  28. *
  29. * 目录说明:
  30. * - `runner/`:入口调度代码。
  31. * - `cases/`:各类测试用例。
  32. * - `utils/`:内存钩子、生成器、驱动实现。
  33. * - `include/`:公共声明。
  34. */
  35. /**
  36. * @brief Fuzzer 运行状态上下文
  37. * 用于在各个测试用例间传递状态,保证无全局副作用,实现可重入和确定性。
  38. */
  39. typedef struct
  40. {
  41. uint32_t seed; // PRNG 种子,由 Input Data 初始化
  42. const uint8_t *data; // 原始输入数据指针
  43. size_t size; // 原始输入数据大小
  44. size_t pos; // 当前读取位置
  45. bool isEnableMemFail; // 是否启用内存分配失败
  46. } RyanJsonFuzzerState;
  47. /**
  48. * @brief 驱动层接口
  49. * 定义在 utils/fuzzerDriver.c
  50. */
  51. extern void RyanJsonFuzzerInit(const uint8_t *data, size_t size);
  52. extern uint32_t RyanJsonFuzzerNextRand();
  53. extern RyanJsonBool_e RyanJsonFuzzerShouldFail(uint32_t probability);
  54. /**
  55. * @brief 公共宏定义
  56. */
  57. #define RyanJsonCheckGotoExit(EX) \
  58. RyanJsonCheckCode(EX, { \
  59. result = RyanJsonFalse; \
  60. goto exit__; \
  61. })
  62. #define fuzzTestWithMemFail(func) \
  63. do \
  64. { \
  65. uint32_t lastIsEnableMemFail = g_fuzzerState.isEnableMemFail; \
  66. g_fuzzerState.isEnableMemFail = false; \
  67. func; \
  68. g_fuzzerState.isEnableMemFail = true; \
  69. } while (0)
  70. /**
  71. * @brief 全局变量声明
  72. */
  73. extern RyanJsonFuzzerState g_fuzzerState;
  74. /**
  75. * @brief 内存钩子函数
  76. */
  77. extern void *RyanJsonFuzzerMalloc(size_t size);
  78. extern void RyanJsonFuzzerFree(void *block);
  79. extern void *RyanJsonFuzzerRealloc(void *block, size_t size);
  80. /**
  81. * @brief 解析与基础功能测试
  82. * 覆盖 Json 解析、压缩和基础打印功能。
  83. */
  84. extern RyanJsonBool_e RyanJsonFuzzerTestParse(RyanJson_t pJson, const char *data, uint32_t size);
  85. extern RyanJsonBool_e RyanJsonFuzzerTestMinify(const char *data, uint32_t size);
  86. /**
  87. * @brief 深度复制与比较测试
  88. * 验证复制结果与原对象的一致性。
  89. */
  90. extern RyanJsonBool_e RyanJsonFuzzerTestDuplicate(RyanJson_t pJson);
  91. /**
  92. * @brief 结构修改与访问测试
  93. * 测试对 Json 结构的修改(改值、改 key)以及数据访问安全性。
  94. */
  95. extern RyanJsonBool_e RyanJsonFuzzerTestModify(RyanJson_t pJson, uint32_t size);
  96. extern RyanJsonBool_e RyanJsonFuzzerTestGet(RyanJson_t pJson, uint32_t size);
  97. extern RyanJsonBool_e RyanJsonFuzzerVerifyGet(RyanJson_t lastJson, RyanJson_t pJson, uint32_t index, uint32_t size);
  98. /**
  99. * @brief 结构变异与增删测试
  100. * 测试节点的创建、替换、分离和删除,模拟复杂的 DOM 操作序列。
  101. */
  102. extern RyanJson_t RyanJsonFuzzerCreateRandomNode(RyanJson_t pJson);
  103. extern RyanJson_t RyanJsonFuzzerCreateRandomNodeWithKey(RyanJson_t pJson, const char *key);
  104. extern RyanJsonBool_e RyanJsonFuzzerTestCreate(RyanJson_t pJson, uint32_t size);
  105. extern RyanJsonBool_e RyanJsonFuzzerTestReplace(RyanJson_t pJson, uint32_t size);
  106. extern RyanJsonBool_e RyanJsonFuzzerTestDetach(RyanJson_t pJson, uint32_t size);
  107. extern RyanJsonBool_e RyanJsonFuzzerTestDelete(RyanJson_t pJson, uint32_t size);
  108. #ifdef __cplusplus
  109. }
  110. #endif
  111. #endif