fuzzerDriver.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include "RyanJsonFuzzer.h"
  2. #include <string.h>
  3. #include "RyanJsonFuzzer.h"
  4. #include <string.h>
  5. /**
  6. * @brief 初始化 Fuzzer 状态
  7. *
  8. * 使用输入数据的前 4 个字节初始化 PRNG 种子,确保 Fuzzing 的确定性。
  9. *
  10. * @param state Fuzzer 状态指针
  11. * @param data 原始输入数据
  12. * @param size 输入数据大小
  13. */
  14. void RyanJsonFuzzerInit(const uint8_t *data, size_t size)
  15. {
  16. g_fuzzerState.data = data;
  17. g_fuzzerState.size = size;
  18. g_fuzzerState.pos = 0;
  19. g_fuzzerState.isEnableMemFail = true;
  20. if (0 == g_fuzzerState.seed) { g_fuzzerState.seed = time(NULL); }
  21. if (size >= 4)
  22. {
  23. uint32_t seed_input;
  24. memcpy(&seed_input, data, 4);
  25. g_fuzzerState.seed ^= seed_input;
  26. }
  27. else
  28. {
  29. for (size_t i = 0; i < size; i++)
  30. {
  31. g_fuzzerState.seed ^= ((uint32_t)data[i] << (i * 8));
  32. }
  33. }
  34. }
  35. /**
  36. * @brief 生成下一个伪随机数 (Xorshift32)
  37. *
  38. * 一个极其快速且轻量级的 PRNG,适合 Fuzzer 环境。
  39. *
  40. * @return uint32_t 随机数
  41. */
  42. uint32_t RyanJsonFuzzerNextRand()
  43. {
  44. uint32_t x = g_fuzzerState.seed;
  45. x ^= x << 13;
  46. x ^= x >> 17;
  47. x ^= x << 5;
  48. g_fuzzerState.seed = x;
  49. return x;
  50. }
  51. /**
  52. * @brief 决定是否应该触发失败
  53. *
  54. * 用于模拟内存分配失败等随机错误路径。
  55. *
  56. * @param probability 概率倒数 (例如 100 表示 1/100 的概率)
  57. * @return RyanJsonBool_e RyanJsonTrue 表示应该触发失败
  58. */
  59. RyanJsonBool_e RyanJsonFuzzerShouldFail(uint32_t probability)
  60. {
  61. if (false == g_fuzzerState.isEnableMemFail) { return RyanJsonFalse; }
  62. if (0 == probability) { return RyanJsonTrue; }
  63. return (0 == RyanJsonFuzzerNextRand() % probability) ? RyanJsonTrue : RyanJsonFalse;
  64. }