fuzzerSelfTest.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include "RyanJsonFuzzer.h"
  2. /**
  3. * @brief 一次性校验最基础的全局前置条件
  4. *
  5. * 这里只放与输入无关、且每轮重复执行没有价值的断言,
  6. * 例如 Hook 初始化、空指针保护和基础类型判定。
  7. */
  8. static void RyanJsonFuzzerSelfTestInitHooks(void)
  9. {
  10. // 这组断言的目标不是覆盖输入空间,而是锁死 fuzzer 运行时最基础的前置条件:
  11. // hooks 必须能拒绝非法组合,也必须能成功安装合法组合。
  12. assert(RyanJsonFalse == RyanJsonInitHooks(NULL, RyanJsonFuzzerFree, RyanJsonFuzzerRealloc));
  13. assert(RyanJsonFalse == RyanJsonInitHooks(RyanJsonFuzzerMalloc, NULL, RyanJsonFuzzerRealloc));
  14. assert(RyanJsonFalse == RyanJsonInitHooks(NULL, NULL, NULL));
  15. assert(RyanJsonTrue == RyanJsonInitHooks(RyanJsonFuzzerMalloc, RyanJsonFuzzerFree, RyanJsonFuzzerRealloc));
  16. // ParseOptions 的空指针/零长度保护同样属于全局 guard。
  17. // 这类路径与 corpus 内容无关,放在一次性自检比放热路径更稳定。
  18. assert(NULL == RyanJsonParseOptions(NULL, 100, RyanJsonFalse, NULL));
  19. assert(NULL == RyanJsonParseOptions("{}", 0, RyanJsonFalse, NULL));
  20. // 全局异常测试
  21. assert(RyanJsonFalse == RyanJsonIsKey(NULL));
  22. assert(RyanJsonFalse == RyanJsonIsNull(NULL));
  23. assert(RyanJsonFalse == RyanJsonIsBool(NULL));
  24. assert(RyanJsonFalse == RyanJsonIsNumber(NULL));
  25. assert(RyanJsonFalse == RyanJsonIsString(NULL));
  26. assert(RyanJsonFalse == RyanJsonIsArray(NULL));
  27. assert(RyanJsonFalse == RyanJsonIsObject(NULL));
  28. assert(RyanJsonFalse == RyanJsonIsInt(NULL));
  29. assert(RyanJsonFalse == RyanJsonIsDouble(NULL));
  30. }
  31. /**
  32. * @brief Fuzzer 自检入口(仅执行一次)
  33. *
  34. * 用于放置与输入无关的确定性断言,避免每轮重复执行。
  35. */
  36. void RyanJsonFuzzerSelfTestOnce(void)
  37. {
  38. static RyanJsonBool_e selfTestOnce = RyanJsonFalse;
  39. // 先置位再执行,避免自检内部若再次间接进入入口时重复执行。
  40. if (RyanJsonTrue == selfTestOnce) { return; }
  41. selfTestOnce = RyanJsonTrue;
  42. RyanJsonBool_e lastIsEnableMemFail;
  43. // 自检目标是稳定覆盖固定 guard;随机 OOM 会把断言变成概率事件。
  44. RyanJsonFuzzerMemFailPush(lastIsEnableMemFail, RyanJsonFalse);
  45. // 调用顺序保持“全局前置条件 -> Parse/文本预处理 -> 结构变异类 case”。
  46. // 这样后续维护时更容易判断某条手动覆盖到底应该归属哪一类 self-test。
  47. RyanJsonFuzzerSelfTestInitHooks();
  48. RyanJsonFuzzerSelfTestParseCases();
  49. RyanJsonFuzzerSelfTestMinifyCases();
  50. RyanJsonFuzzerSelfTestCreateCases();
  51. RyanJsonFuzzerSelfTestModifyCases();
  52. RyanJsonFuzzerSelfTestGetCases();
  53. RyanJsonFuzzerSelfTestReplaceCases();
  54. RyanJsonFuzzerSelfTestDuplicateCases();
  55. RyanJsonFuzzerMemFailPop(lastIsEnableMemFail);
  56. }