| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- #include "RyanJsonFuzzer.h"
- /**
- * @brief 一次性校验最基础的全局前置条件
- *
- * 这里只放与输入无关、且每轮重复执行没有价值的断言,
- * 例如 Hook 初始化、空指针保护和基础类型判定。
- */
- static void RyanJsonFuzzerSelfTestInitHooks(void)
- {
- // 这组断言的目标不是覆盖输入空间,而是锁死 fuzzer 运行时最基础的前置条件:
- // hooks 必须能拒绝非法组合,也必须能成功安装合法组合。
- assert(RyanJsonFalse == RyanJsonInitHooks(NULL, RyanJsonFuzzerFree, RyanJsonFuzzerRealloc));
- assert(RyanJsonFalse == RyanJsonInitHooks(RyanJsonFuzzerMalloc, NULL, RyanJsonFuzzerRealloc));
- assert(RyanJsonFalse == RyanJsonInitHooks(NULL, NULL, NULL));
- assert(RyanJsonTrue == RyanJsonInitHooks(RyanJsonFuzzerMalloc, RyanJsonFuzzerFree, RyanJsonFuzzerRealloc));
- // ParseOptions 的空指针/零长度保护同样属于全局 guard。
- // 这类路径与 corpus 内容无关,放在一次性自检比放热路径更稳定。
- assert(NULL == RyanJsonParseOptions(NULL, 100, RyanJsonFalse, NULL));
- assert(NULL == RyanJsonParseOptions("{}", 0, RyanJsonFalse, NULL));
- // 全局异常测试
- assert(RyanJsonFalse == RyanJsonIsKey(NULL));
- assert(RyanJsonFalse == RyanJsonIsNull(NULL));
- assert(RyanJsonFalse == RyanJsonIsBool(NULL));
- assert(RyanJsonFalse == RyanJsonIsNumber(NULL));
- assert(RyanJsonFalse == RyanJsonIsString(NULL));
- assert(RyanJsonFalse == RyanJsonIsArray(NULL));
- assert(RyanJsonFalse == RyanJsonIsObject(NULL));
- assert(RyanJsonFalse == RyanJsonIsInt(NULL));
- assert(RyanJsonFalse == RyanJsonIsDouble(NULL));
- }
- /**
- * @brief Fuzzer 自检入口(仅执行一次)
- *
- * 用于放置与输入无关的确定性断言,避免每轮重复执行。
- */
- void RyanJsonFuzzerSelfTestOnce(void)
- {
- static RyanJsonBool_e selfTestOnce = RyanJsonFalse;
- // 先置位再执行,避免自检内部若再次间接进入入口时重复执行。
- if (RyanJsonTrue == selfTestOnce) { return; }
- selfTestOnce = RyanJsonTrue;
- RyanJsonBool_e lastIsEnableMemFail;
- // 自检目标是稳定覆盖固定 guard;随机 OOM 会把断言变成概率事件。
- RyanJsonFuzzerMemFailPush(lastIsEnableMemFail, RyanJsonFalse);
- // 调用顺序保持“全局前置条件 -> Parse/文本预处理 -> 结构变异类 case”。
- // 这样后续维护时更容易判断某条手动覆盖到底应该归属哪一类 self-test。
- RyanJsonFuzzerSelfTestInitHooks();
- RyanJsonFuzzerSelfTestParseCases();
- RyanJsonFuzzerSelfTestMinifyCases();
- RyanJsonFuzzerSelfTestCreateCases();
- RyanJsonFuzzerSelfTestModifyCases();
- RyanJsonFuzzerSelfTestGetCases();
- RyanJsonFuzzerSelfTestReplaceCases();
- RyanJsonFuzzerSelfTestDuplicateCases();
- RyanJsonFuzzerMemFailPop(lastIsEnableMemFail);
- }
|