entry.c 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include "RyanJsonFuzzer.h"
  2. #include <string.h>
  3. /**
  4. * @brief LLVM LibFuzzer 主入口
  5. *
  6. * 每轮 Fuzz 迭代都会调用该函数。
  7. *
  8. * 主要流程:
  9. * - 初始化 Fuzzer 状态与随机源。
  10. * - 检查首字节是否为 `0xFF`,决定执行 API 序列模式或解析模式。
  11. * - 注册内存 Hook,确保测试过程中资源可控并可回收。
  12. */
  13. int LLVMFuzzerTestOneInput(const char *data, uint32_t size)
  14. {
  15. // 初始化覆盖率/随机状态
  16. uint8_t magicByte = 0;
  17. if (size > 0) { magicByte = (uint8_t)data[0]; }
  18. if (0xFF == magicByte) { RyanJsonFuzzerInit((const uint8_t *)data + 1, size - 1); }
  19. if (0 == g_fuzzerState.seed) { RyanJsonFuzzerInit((const uint8_t *)data, size); }
  20. g_fuzzerState.isEnableMemFail = true;
  21. assert(RyanJsonFalse == RyanJsonInitHooks(NULL, RyanJsonFuzzerFree, RyanJsonFuzzerRealloc));
  22. assert(RyanJsonFalse == RyanJsonInitHooks(RyanJsonFuzzerMalloc, NULL, RyanJsonFuzzerRealloc));
  23. assert(RyanJsonFalse == RyanJsonInitHooks(NULL, NULL, NULL));
  24. assert(RyanJsonTrue == RyanJsonInitHooks(RyanJsonFuzzerMalloc, RyanJsonFuzzerFree, 0 != size % 2 ? NULL : RyanJsonFuzzerRealloc));
  25. assert(NULL == RyanJsonParseOptions(NULL, 100, RyanJsonFalse, NULL));
  26. assert(NULL == RyanJsonParseOptions(data, 0, RyanJsonFalse, NULL));
  27. const char *parseEndPtr = NULL;
  28. RyanJson_t pJson = RyanJsonParseOptions(data, size, 0 != size % 3 ? RyanJsonTrue : RyanJsonFalse, &parseEndPtr);
  29. if (NULL != pJson)
  30. {
  31. RyanJsonFuzzerTestMinify(data, size);
  32. RyanJsonFuzzerTestParse(pJson, data, size);
  33. RyanJsonFuzzerTestGet(pJson, size);
  34. RyanJsonFuzzerTestDuplicate(pJson);
  35. RyanJsonCheckCode(RyanJsonFuzzerTestModify(pJson, size), { goto exit__; });
  36. RyanJsonCheckCode(RyanJsonFuzzerTestCreate(pJson, size), { goto exit__; });
  37. RyanJsonCheckCode(RyanJsonFuzzerTestDelete(pJson, size), { goto exit__; });
  38. RyanJsonCheckCode(RyanJsonFuzzerTestReplace(pJson, size), { goto exit__; });
  39. // 测试分离
  40. {
  41. g_fuzzerState.isEnableMemFail = false;
  42. RyanJson_t pJson2 = RyanJsonDuplicate(pJson);
  43. g_fuzzerState.isEnableMemFail = true;
  44. RyanJsonDelete(pJson);
  45. RyanJsonFuzzerTestDetach(pJson2, size);
  46. RyanJsonDelete(pJson2);
  47. }
  48. }
  49. return 0;
  50. exit__:
  51. RyanJsonDelete(pJson);
  52. return 0;
  53. }