RyanJsonFuzzerParse.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include "RyanJsonFuzzer.h"
  2. RyanJsonBool_e RyanJsonFuzzerTestParse(RyanJson_t pJson, const char *data, uint32_t size)
  3. {
  4. isEnableRandomMemFail = RyanJsonFalse;
  5. RyanJson_t testItem = RyanJsonCreateObject();
  6. RyanJson_t testItem2 = RyanJsonCreateObject();
  7. RyanJsonSetType(testItem, 0);
  8. RyanJsonSetType(testItem2, 0);
  9. RyanJsonAssert(NULL == RyanJsonPrint(testItem, 100, RyanJsonFalse, NULL));
  10. RyanJsonAssert(NULL == RyanJsonDuplicate(testItem));
  11. RyanJsonAssert(RyanJsonFalse == RyanJsonCompare(testItem, testItem2));
  12. RyanJsonAssert(RyanJsonFalse == RyanJsonCompareOnlyKey(testItem, testItem2));
  13. // 测试pJson类型错误情况
  14. RyanJsonAssert(RyanJsonFalse == RyanJsonInsert(testItem, 0, RyanJsonCreateString("key", "true")));
  15. RyanJsonAssert(RyanJsonFalse == RyanJsonInsert(testItem2, UINT32_MAX, RyanJsonCreateString("key", "true")));
  16. RyanJsonSetType(testItem, RyanJsonTypeObject);
  17. RyanJsonSetType(testItem2, RyanJsonTypeObject);
  18. // 测试pJson为obj,但是item没有key的情况
  19. RyanJsonAssert(RyanJsonFalse == RyanJsonInsert(pJson, 0, RyanJsonCreateString(NULL, "true")));
  20. RyanJsonAssert(RyanJsonFalse == RyanJsonInsert(pJson, UINT32_MAX, RyanJsonCreateString(NULL, "true")));
  21. RyanJsonAssert(RyanJsonTrue == RyanJsonInsert(pJson, 0, RyanJsonCreateString("key", "true")));
  22. RyanJsonDelete(testItem);
  23. RyanJsonDelete(testItem2);
  24. isEnableRandomMemFail = RyanJsonTrue;
  25. RyanJsonAssert(NULL == RyanJsonPrint(NULL, 100, RyanJsonFalse, NULL));
  26. RyanJsonAssert(NULL == RyanJsonPrintPreallocated(NULL, NULL, 100, RyanJsonFalse, NULL));
  27. RyanJsonAssert(NULL == RyanJsonPrintPreallocated(pJson, NULL, 100, RyanJsonFalse, NULL));
  28. RyanJsonAssert(NULL == RyanJsonPrintPreallocated(NULL, (char *)data, 100, RyanJsonFalse, NULL));
  29. RyanJsonAssert(NULL == RyanJsonPrintPreallocated(pJson, (char *)data, 0, RyanJsonFalse, NULL));
  30. uint32_t len = 0;
  31. char *jsonStr = RyanJsonPrint(pJson, size % 5 ? 100 : 0, size % 2 ? RyanJsonFalse : RyanJsonTrue, &len);
  32. RyanJsonCheckReturnFalse(NULL != jsonStr && len > 0);
  33. char *jsonStrCopy = RyanJsonPrint(pJson, size % 5 ? 100 : 0, size % 2 ? RyanJsonFalse : RyanJsonTrue, NULL); // 不传递len
  34. RyanJsonAssert(0 == strncmp(jsonStr, jsonStrCopy, len));
  35. RyanJsonFree(jsonStr);
  36. RyanJsonFree(jsonStrCopy);
  37. uint32_t bufLen = len * 3;
  38. if (bufLen < size * 2) { bufLen = size * 2; }
  39. if (bufLen < 2048) { bufLen = 2048; }
  40. char *buf = (char *)malloc((size_t)bufLen);
  41. {
  42. uint32_t len2 = 0;
  43. char *jsonStr2 = RyanJsonPrintPreallocated(pJson, buf, bufLen, size % 2 ? RyanJsonFalse : RyanJsonTrue, &len2);
  44. // printf("len: %d, len2: %d, str: %s\r\n", len, len2, NULL == jsonStr2 ? "NULL" : jsonStr2);
  45. RyanJsonCheckCode(NULL != jsonStr2 && len == len2, {
  46. free(buf);
  47. return RyanJsonFalse;
  48. });
  49. }
  50. memcpy(buf, data, (size_t)size);
  51. buf[size] = 0;
  52. RyanJson_t jsonRoot = RyanJsonParse(buf);
  53. RyanJsonCheckCode(NULL != jsonRoot, {
  54. free(buf);
  55. return RyanJsonFalse;
  56. });
  57. // 测试多次打印结果是否一致
  58. {
  59. uint32_t len3 = 0;
  60. char *jsonStr3 = RyanJsonPrint(jsonRoot, 100, size % 2 ? RyanJsonFalse : RyanJsonTrue, &len3); // 以带格式方式将数据打印出来
  61. RyanJsonCheckCode(NULL != jsonStr3 && len == len3, {
  62. free(buf);
  63. if (jsonStr3) { RyanJsonFree(jsonStr3); }
  64. RyanJsonDelete(jsonRoot);
  65. return RyanJsonFalse;
  66. });
  67. RyanJsonFree(jsonStr3);
  68. }
  69. {
  70. RyanJsonPrintPreallocated(jsonRoot, buf, bufLen / 15, RyanJsonTrue, NULL);
  71. }
  72. free(buf);
  73. RyanJsonDelete(jsonRoot);
  74. return RyanJsonTrue;
  75. }
  76. RyanJsonBool_e RyanJsonFuzzerTestMinify(const char *data, uint32_t size)
  77. {
  78. char *buf = (char *)malloc(size + 100);
  79. memcpy(buf, data, size);
  80. memset(buf + size, 0, 100);
  81. uint32_t size2 = RyanJsonMinify(buf, (int32_t)size);
  82. // 非法情况
  83. {
  84. RyanJsonCheckReturnFalse(0 == RyanJsonMinify(NULL, 0));
  85. RyanJsonCheckReturnFalse(0 == RyanJsonMinify(NULL, 10));
  86. RyanJsonCheckReturnFalse(0 == RyanJsonMinify(NULL, -10));
  87. RyanJsonCheckReturnFalse(0 == RyanJsonMinify(buf, -10));
  88. }
  89. // 内存泄漏就是上面出错了
  90. RyanJson_t pJson2 = RyanJsonParseOptions(buf, size2, size % 2 ? RyanJsonTrue : RyanJsonFalse, NULL);
  91. free(buf);
  92. if (NULL != pJson2)
  93. {
  94. uint32_t len = 0;
  95. char *jsonStr = RyanJsonPrint(pJson2, 100, RyanJsonFalse, &len); // 以带格式方式将数据打印出来
  96. RyanJsonCheckCode(NULL != jsonStr && len > 0, {
  97. RyanJsonDelete(pJson2);
  98. return RyanJsonFalse;
  99. });
  100. RyanJsonFree(jsonStr);
  101. RyanJsonDelete(pJson2);
  102. }
  103. else
  104. {
  105. return RyanJsonFalse;
  106. }
  107. return RyanJsonTrue;
  108. }