fuzzerMinify.c 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include "RyanJson.h"
  2. #include "RyanJsonFuzzer.h"
  3. /**
  4. * @brief minify 模块的一次性确定性自检
  5. *
  6. * 这里只保留运行期 harness 不会主动构造的非法入参。
  7. */
  8. void RyanJsonFuzzerSelfTestMinifyCases(void)
  9. {
  10. // 运行期总是传入非负 size,这里只补齐负长度保护。
  11. {
  12. uint8_t rawBuf[5] = {'a', 'b', 'c', '#', '#'};
  13. assert(0 == RyanJsonMinify((char *)rawBuf, -10));
  14. assert('a' == rawBuf[0]);
  15. assert('b' == rawBuf[1]);
  16. assert('c' == rawBuf[2]);
  17. assert('#' == rawBuf[3]);
  18. assert('#' == rawBuf[4]);
  19. }
  20. assert(0 == RyanJsonMinify(NULL, 0));
  21. assert(0 == RyanJsonMinify(NULL, 10));
  22. assert(0 == RyanJsonMinify(NULL, -10));
  23. }
  24. /**
  25. * @brief 压缩测试
  26. *
  27. * 测试 RyanJson 的 Minify 功能(去除空白字符)。
  28. * 覆盖场景:
  29. * Minify 功能:将原始 Json 文本压缩,验证是否能成功压缩。
  30. * 再次解析:解析压缩后的 Json 文本,验证压缩未破坏 Json 结构。
  31. *
  32. * @param state Fuzzer 状态上下文
  33. * @param data 原始输入数据文本
  34. * @param size 输入数据长度
  35. */
  36. RyanJsonBool_e RyanJsonFuzzerTestMinify(const char *data, uint32_t size)
  37. {
  38. // 准备缓冲区并拷贝数据
  39. // 分配比原始数据稍大的缓冲区,防止边界溢出
  40. char *buf = (char *)malloc((size_t)size + 1U);
  41. if (!buf) { return RyanJsonFalse; }
  42. memcpy(buf, data, size);
  43. buf[size] = '\0';
  44. // 执行 Minify
  45. // RyanJsonMinify 会原地修改缓冲区并移除空白字符
  46. uint32_t len = RyanJsonMinify(buf, (int32_t)size);
  47. assert(len > 0);
  48. assert(len <= size);
  49. // 验证 Minify 后数据有效性
  50. // 尝试解析压缩后的 Json 文本,确认结构未被破坏
  51. // 注意:Minify 只是去空格,如果原串合法,Minify 后也应合法。
  52. // 这里使用可选尾部模式(不强制 Null Terminator,虽然已补终止符)
  53. RyanJson_t pJson = RyanJsonParseOptions(buf, len, size % 2 ? RyanJsonTrue : RyanJsonFalse, NULL);
  54. free(buf);
  55. if (NULL != pJson)
  56. {
  57. // 如果解析成功,尝试打印回来,确保 Object 结构完整
  58. uint32_t lenPrint = 0;
  59. char *jsonStr = RyanJsonPrint(pJson, 100, RyanJsonFalse, &lenPrint);
  60. RyanJsonCheckCode(NULL != jsonStr && lenPrint > 0, {
  61. RyanJsonDelete(pJson);
  62. return RyanJsonFalse;
  63. });
  64. RyanJsonFree(jsonStr);
  65. RyanJsonDelete(pJson);
  66. }
  67. else
  68. {
  69. // 如果输入本身非法,解析失败是预期行为
  70. return RyanJsonFalse;
  71. }
  72. return RyanJsonTrue;
  73. }