RyanJsonFuzzer.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758
  1. #include "RyanJsonTest.h"
  2. #include <signal.h>
  3. #define RyanJsonCheckGotoExit(EX) \
  4. RyanJsonCheckCode(EX, { \
  5. result = RyanJsonFalse; \
  6. goto __exit; \
  7. })
  8. RyanJsonBool_e isEnableRandomMemFail = RyanJsonTrue;
  9. static RyanJsonBool_e RyanJsonFuzzerTestByParseAndPrint(RyanJson_t pJson, const char *data, uint32_t size)
  10. {
  11. RyanJsonAssert(NULL == RyanJsonPrint(NULL, 100, RyanJsonFalse, NULL));
  12. RyanJsonAssert(NULL == RyanJsonPrintPreallocated(NULL, NULL, 100, RyanJsonFalse, NULL));
  13. RyanJsonAssert(NULL == RyanJsonPrintPreallocated(pJson, NULL, 100, RyanJsonFalse, NULL));
  14. RyanJsonAssert(NULL == RyanJsonPrintPreallocated(NULL, data, 100, RyanJsonFalse, NULL));
  15. RyanJsonAssert(NULL == RyanJsonPrintPreallocated(pJson, data, 0, RyanJsonFalse, NULL));
  16. uint32_t len = 0;
  17. char *jsonStr =
  18. RyanJsonPrint(pJson, size % 5 ? 100 : 0, size % 2 ? RyanJsonFalse : RyanJsonTrue, &len); // 以带格式方式将数据打印出来
  19. RyanJsonCheckReturnFalse(NULL != jsonStr && len > 0);
  20. RyanJsonFree(jsonStr);
  21. uint32_t bufLen = len * 3;
  22. if (bufLen < size * 2) { bufLen = size * 2; }
  23. if (bufLen < 4096) { bufLen = 4096; }
  24. char *buf = malloc((size_t)bufLen);
  25. {
  26. uint32_t len2 = 0;
  27. char *jsonStr2 = RyanJsonPrintPreallocated(pJson, buf, bufLen, size % 2 ? RyanJsonFalse : RyanJsonTrue, &len2);
  28. // printf("len: %d, len2: %d, str: %s\r\n", len, len2, NULL == jsonStr2 ? "NULL" : jsonStr2);
  29. RyanJsonCheckCode(NULL != jsonStr2 && len == len2, {
  30. free(buf);
  31. return RyanJsonFalse;
  32. });
  33. }
  34. memcpy(buf, data, (size_t)size);
  35. buf[size] = 0;
  36. RyanJson_t jsonRoot = RyanJsonParse(buf);
  37. RyanJsonCheckCode(NULL != jsonRoot, {
  38. free(buf);
  39. return RyanJsonFalse;
  40. });
  41. // 测试多次打印结果是否一致
  42. {
  43. uint32_t len3 = 0;
  44. char *jsonStr3 = RyanJsonPrint(jsonRoot, 100, size % 2 ? RyanJsonFalse : RyanJsonTrue, &len3); // 以带格式方式将数据打印出来
  45. RyanJsonCheckCode(NULL != jsonStr3 && len == len3, {
  46. free(buf);
  47. if (jsonStr3) { RyanJsonFree(jsonStr3); }
  48. RyanJsonDelete(jsonRoot);
  49. return RyanJsonFalse;
  50. });
  51. RyanJsonFree(jsonStr3);
  52. }
  53. {
  54. RyanJsonPrintPreallocated(jsonRoot, buf, bufLen / 15, RyanJsonTrue, NULL);
  55. }
  56. free(buf);
  57. RyanJsonDelete(jsonRoot);
  58. return RyanJsonTrue;
  59. }
  60. static RyanJsonBool_e RyanJsonFuzzerTestByDup(RyanJson_t pJson)
  61. {
  62. RyanJsonBool_e result = RyanJsonTrue;
  63. char *jsonStr = NULL;
  64. char *jsonStrDup = NULL;
  65. RyanJson_t pJsonDup = NULL;
  66. // 测试打印和复制功能
  67. uint32_t len = 0;
  68. jsonStr = RyanJsonPrint(pJson, 100, RyanJsonFalse, &len);
  69. RyanJsonCheckGotoExit(NULL != jsonStr && len > 0);
  70. pJsonDup = RyanJsonDuplicate(pJson);
  71. RyanJsonCheckGotoExit(NULL != pJsonDup);
  72. // 测试dup失败情况
  73. RyanJsonCheckGotoExit(NULL == RyanJsonDuplicate(NULL));
  74. // 判断复制json的size是否一致
  75. RyanJsonCheckGotoExit(0 == RyanJsonGetSize(NULL));
  76. RyanJsonCheckGotoExit(RyanJsonGetSize(pJson) == RyanJsonGetSize(pJsonDup));
  77. RyanJsonCompare(pJson, pJsonDup);
  78. RyanJsonCompareOnlyKey(pJson, pJsonDup);
  79. // assert(RyanJsonTrue == RyanJsonCompare(pJson, pJsonDup)); // 大浮点数判断容易出错
  80. // RyanJsonCheckGotoExit(RyanJsonTrue == RyanJsonCompareOnlyKey(pJson, pJsonDup)); // 重复key也会失败
  81. // 测试compare特殊情况
  82. RyanJsonCheckGotoExit(RyanJsonTrue == RyanJsonCompare(pJson, pJson));
  83. RyanJsonCheckGotoExit(RyanJsonFalse == RyanJsonCompare(NULL, pJsonDup));
  84. RyanJsonCheckGotoExit(RyanJsonFalse == RyanJsonCompare(pJson, NULL));
  85. RyanJsonCheckGotoExit(RyanJsonFalse == RyanJsonCompare(NULL, NULL));
  86. // 测试compareKey特殊情况
  87. RyanJsonCheckGotoExit(RyanJsonTrue == RyanJsonCompareOnlyKey(pJson, pJson));
  88. RyanJsonCheckGotoExit(RyanJsonFalse == RyanJsonCompareOnlyKey(NULL, pJsonDup));
  89. RyanJsonCheckGotoExit(RyanJsonFalse == RyanJsonCompareOnlyKey(pJson, NULL));
  90. RyanJsonCheckGotoExit(RyanJsonFalse == RyanJsonCompareOnlyKey(NULL, NULL));
  91. uint32_t dupLen = 0;
  92. jsonStrDup = RyanJsonPrint(pJsonDup, 100, RyanJsonFalse, &dupLen); // 以带格式方式将数据打印出来
  93. RyanJsonCheckGotoExit(NULL != jsonStrDup && dupLen > 0);
  94. RyanJsonCheckCode(len == dupLen && 0 == memcmp(jsonStr, jsonStrDup, (size_t)len), {
  95. printf("len:%" PRIu32 ", dupLen:%" PRIu32 "\r\n", len, dupLen);
  96. printf("jsonStr:%s, jsonStrDup:%s\r\n", jsonStr, jsonStrDup);
  97. RyanJsonCheckGotoExit(0);
  98. });
  99. if (RyanJsonIsArray(pJson) || RyanJsonIsObject(pJson))
  100. {
  101. // 测试size不相等
  102. RyanJsonDelete(RyanJsonDetachByIndex(pJson, 0));
  103. if (RyanJsonIsArray(pJson) || RyanJsonIsObject(pJson))
  104. {
  105. // 改变key
  106. RyanJson_t item;
  107. RyanJsonObjectForEach(pJson, item)
  108. {
  109. if (RyanJsonIsKey(item))
  110. {
  111. RyanJsonChangeKey(item, "key12231123");
  112. break;
  113. }
  114. }
  115. // 改变value
  116. RyanJsonObjectForEach(pJson, item)
  117. {
  118. if (RyanJsonIsBool(item))
  119. {
  120. RyanJsonChangeBoolValue(item, !RyanJsonGetBoolValue(item));
  121. break;
  122. }
  123. }
  124. // 改变obj的key
  125. RyanJsonObjectForEach(pJson, item)
  126. {
  127. if (RyanJsonIsKey(item) && RyanJsonIsObject(item))
  128. {
  129. RyanJsonChangeKey(item, "key12231123");
  130. break;
  131. }
  132. }
  133. }
  134. RyanJsonCompare(pJson, pJsonDup);
  135. RyanJsonCompareOnlyKey(pJson, pJsonDup);
  136. }
  137. __exit:
  138. if (jsonStr)
  139. {
  140. RyanJsonFree(jsonStr);
  141. jsonStr = NULL;
  142. }
  143. if (pJsonDup)
  144. {
  145. RyanJsonDelete(pJsonDup);
  146. pJsonDup = NULL;
  147. }
  148. if (jsonStrDup)
  149. {
  150. RyanJsonFree(jsonStrDup);
  151. jsonStrDup = NULL;
  152. }
  153. return result;
  154. }
  155. static RyanJsonBool_e RyanJsonFuzzerTestByForEachChange(RyanJson_t pJson, uint32_t size)
  156. {
  157. RyanJsonIsNull(pJson);
  158. if (RyanJsonIsKey(pJson))
  159. {
  160. char *key = malloc(strlen(RyanJsonGetKey(pJson)) + 1);
  161. if (key)
  162. {
  163. memcpy(key, RyanJsonGetKey(pJson), strlen(RyanJsonGetKey(pJson)));
  164. key[strlen(RyanJsonGetKey(pJson))] = 0;
  165. RyanJsonChangeKey(pJson, "key");
  166. RyanJsonChangeKey(pJson, key);
  167. free(key);
  168. }
  169. }
  170. if (RyanJsonIsBool(pJson)) { RyanJsonChangeBoolValue(pJson, !RyanJsonGetBoolValue(pJson)); }
  171. if (RyanJsonIsNumber(pJson))
  172. {
  173. if (RyanJsonIsInt(pJson))
  174. {
  175. int32_t value = RyanJsonGetIntValue(pJson);
  176. RyanJsonChangeIntValue(pJson, (int32_t)size);
  177. RyanJsonChangeIntValue(pJson, value);
  178. }
  179. if (RyanJsonIsDouble(pJson))
  180. {
  181. double value = RyanJsonGetDoubleValue(pJson);
  182. RyanJsonChangeDoubleValue(pJson, size * 1.123456789);
  183. RyanJsonChangeDoubleValue(pJson, value);
  184. }
  185. }
  186. if (RyanJsonIsString(pJson))
  187. {
  188. char *value = malloc(strlen(RyanJsonGetStringValue(pJson)) + 1);
  189. if (value)
  190. {
  191. memcpy(value, RyanJsonGetStringValue(pJson), strlen(RyanJsonGetStringValue(pJson)));
  192. value[strlen(RyanJsonGetStringValue(pJson))] = 0;
  193. RyanJsonChangeStringValue(pJson, "hello world");
  194. RyanJsonChangeStringValue(pJson, value);
  195. free(value);
  196. }
  197. }
  198. if (RyanJsonIsArray(pJson) || RyanJsonIsObject(pJson))
  199. {
  200. RyanJson_t item;
  201. RyanJsonArrayForEach(pJson, item)
  202. { RyanJsonCheckReturnFalse(RyanJsonTrue == RyanJsonFuzzerTestByForEachChange(item, size)); }
  203. }
  204. return RyanJsonTrue;
  205. }
  206. static RyanJsonBool_e RyanJsonFuzzerTestByForEachGet2(RyanJson_t lastJson, RyanJson_t pJson, uint32_t index, uint32_t size)
  207. {
  208. RyanJsonIsNull(pJson);
  209. RyanJsonAssert(NULL == RyanJsonGetValue(NULL));
  210. RyanJsonAssert(NULL == RyanJsonGetKey(NULL));
  211. RyanJsonAssert(NULL == RyanJsonGetStringValue(NULL));
  212. RyanJsonAssert(NULL == RyanJsonGetObjectByKey(NULL, NULL));
  213. RyanJsonAssert(NULL == RyanJsonGetObjectByKey(pJson, NULL));
  214. RyanJsonAssert(NULL == RyanJsonGetObjectByKey(NULL, "NULL"));
  215. if (!RyanJsonIsObject(pJson)) // pJson类型错误
  216. {
  217. RyanJsonAssert(NULL == RyanJsonGetObjectByKey(pJson, "NULL"));
  218. }
  219. RyanJsonAssert(NULL == RyanJsonGetObjectByIndex(NULL, 10));
  220. if (!RyanJsonIsArray(pJson) && !RyanJsonIsObject(pJson)) // pJson类型错误
  221. {
  222. RyanJsonAssert(NULL == RyanJsonGetObjectByIndex(pJson, 0));
  223. }
  224. if (RyanJsonIsKey(pJson)) { RyanJsonGetObjectToKey(lastJson, RyanJsonGetKey(pJson)); }
  225. else
  226. {
  227. RyanJsonGetObjectToIndex(lastJson, index);
  228. }
  229. if (RyanJsonIsArray(pJson) || RyanJsonIsObject(pJson))
  230. {
  231. RyanJson_t item;
  232. RyanJsonObjectForEach(pJson, item) { RyanJsonFuzzerTestByForEachGet2(pJson, item, index, size); }
  233. }
  234. return RyanJsonTrue;
  235. }
  236. static RyanJsonBool_e RyanJsonFuzzerTestByForEachGet(RyanJson_t pJson, uint32_t size)
  237. {
  238. if (RyanJsonIsArray(pJson) || RyanJsonIsObject(pJson))
  239. {
  240. RyanJson_t item;
  241. uint32_t index = 0;
  242. RyanJsonObjectForEach(pJson, item)
  243. {
  244. RyanJsonFuzzerTestByForEachGet2(pJson, item, index, size);
  245. index++;
  246. }
  247. }
  248. return RyanJsonTrue;
  249. }
  250. static RyanJson_t RyanJsonFuzzerCreateRandomNode(RyanJson_t pJson)
  251. {
  252. static int32_t count = 0;
  253. static int32_t count2 = 0;
  254. count++;
  255. char *key = "true";
  256. if (count % 10 > 5) { key = NULL; }
  257. switch (count % 50)
  258. {
  259. case 0: return RyanJsonCreateArray();
  260. case 1: return RyanJsonCreateObject();
  261. case 2:
  262. count2++;
  263. if (0 == count2 % 10) { return RyanJsonDuplicate(pJson); }
  264. case 11:
  265. case 12:
  266. case 13: return RyanJsonCreateBool(key, RyanJsonTrue);
  267. case 20:
  268. case 21:
  269. case 22: return RyanJsonCreateInt(key, count);
  270. case 31:
  271. case 32:
  272. case 33: return RyanJsonCreateDouble(key, count * 1.123456789);
  273. default: return RyanJsonCreateString(key, "true");
  274. }
  275. }
  276. static RyanJsonBool_e RyanJsonFuzzerTestByForEachCreate(RyanJson_t pJson, uint32_t size)
  277. {
  278. // RyanJsonInsert的特殊情况
  279. RyanJsonCheckReturnFalse(RyanJsonFalse == RyanJsonInsert(NULL, UINT32_MAX, RyanJsonCreateString("key", "string")));
  280. RyanJsonCheckReturnFalse(RyanJsonFalse == RyanJsonInsert(pJson, UINT32_MAX, NULL));
  281. RyanJsonCheckReturnFalse(RyanJsonFalse == RyanJsonInsert(NULL, 0, NULL));
  282. RyanJsonAssert(NULL == RyanJsonCreateString(NULL, NULL));
  283. RyanJsonAssert(NULL == RyanJsonCreateString("NULL", NULL));
  284. RyanJsonAssert(RyanJsonFalse == RyanJsonChangeStringValue(NULL, NULL));
  285. RyanJsonAssert(RyanJsonFalse == RyanJsonChangeStringValue(pJson, NULL));
  286. RyanJsonAssert(RyanJsonFalse == RyanJsonChangeStringValue(NULL, "NULL"));
  287. if (!RyanJsonIsKey(pJson) && !RyanJsonIsString(pJson)) // pJson类型错误
  288. {
  289. RyanJsonAssert(RyanJsonFalse == RyanJsonChangeStringValue(pJson, "NULL"));
  290. }
  291. RyanJsonAssert(RyanJsonFalse == RyanJsonChangeKey(NULL, NULL));
  292. RyanJsonAssert(RyanJsonFalse == RyanJsonChangeKey(pJson, NULL));
  293. RyanJsonAssert(RyanJsonFalse == RyanJsonChangeKey(NULL, "NULL"));
  294. if (!RyanJsonIsKey(pJson) && !RyanJsonIsString(pJson)) // pJson类型错误
  295. {
  296. RyanJsonAssert(RyanJsonFalse == RyanJsonChangeKey(pJson, "NULL"));
  297. }
  298. RyanJsonAssert(RyanJsonFalse == RyanJsonAddItemToObject(NULL, NULL, NULL));
  299. RyanJsonAssert(RyanJsonFalse == RyanJsonAddItemToObject(pJson, NULL, NULL));
  300. RyanJsonAssert(NULL == RyanJsonCreateIntArray(NULL, 0));
  301. RyanJsonAssert(NULL == RyanJsonCreateDoubleArray(NULL, 0));
  302. RyanJsonAssert(NULL == RyanJsonCreateStringArray(NULL, 0));
  303. RyanJsonAssert(RyanJsonFalse == RyanJsonHasObjectToKey(NULL, "0", "1", "2", "3"));
  304. RyanJsonAssert(RyanJsonFalse == RyanJsonHasObjectToIndex(NULL, 0, 1, 2, 3));
  305. RyanJsonAssert(RyanJsonFalse == RyanJsonHasObjectToKey(pJson, "0", "1", "2", "3"));
  306. RyanJsonAssert(RyanJsonFalse == RyanJsonHasObjectToIndex(pJson, 0, 1, 2, 3));
  307. char *key = "keyaaa";
  308. RyanJsonAddNullToObject(pJson, key);
  309. if (RyanJsonIsKey(pJson)) { key = RyanJsonGetKey(pJson); }
  310. if (RyanJsonIsBool(pJson)) { RyanJsonAddBoolToObject(pJson, key, RyanJsonGetBoolValue(pJson)); }
  311. if (RyanJsonIsNumber(pJson))
  312. {
  313. if (RyanJsonIsInt(pJson))
  314. {
  315. RyanJsonAddIntToObject(pJson, key, RyanJsonGetIntValue(pJson));
  316. int arrayInt[] = {RyanJsonGetIntValue(pJson), RyanJsonGetIntValue(pJson), RyanJsonGetIntValue(pJson),
  317. RyanJsonGetIntValue(pJson), RyanJsonGetIntValue(pJson)};
  318. RyanJsonAddItemToObject(pJson, (size % 2) ? key : "arrayString",
  319. RyanJsonCreateIntArray(arrayInt, sizeof(arrayInt) / sizeof(arrayInt[0])));
  320. }
  321. if (RyanJsonIsDouble(pJson))
  322. {
  323. RyanJsonAddDoubleToObject(pJson, key, RyanJsonGetDoubleValue(pJson));
  324. double arrayDouble[] = {RyanJsonGetDoubleValue(pJson), RyanJsonGetDoubleValue(pJson), RyanJsonGetDoubleValue(pJson),
  325. RyanJsonGetDoubleValue(pJson), RyanJsonGetDoubleValue(pJson)};
  326. RyanJsonAddItemToObject(pJson, (size % 2) ? key : "arrayString",
  327. RyanJsonCreateDoubleArray(arrayDouble, sizeof(arrayDouble) / sizeof(arrayDouble[0])));
  328. }
  329. }
  330. if (RyanJsonIsString(pJson))
  331. {
  332. RyanJsonAddStringToObject(pJson, key, RyanJsonGetStringValue(pJson));
  333. const char *arrayString[] = {RyanJsonGetStringValue(pJson), RyanJsonGetStringValue(pJson), RyanJsonGetStringValue(pJson),
  334. RyanJsonGetStringValue(pJson), RyanJsonGetStringValue(pJson)};
  335. RyanJsonAddItemToObject(pJson, (size % 2) ? key : "arrayString",
  336. RyanJsonCreateStringArray(arrayString, sizeof(arrayString) / sizeof(arrayString[0])));
  337. }
  338. if (RyanJsonIsArray(pJson) || RyanJsonIsObject(pJson))
  339. {
  340. RyanJson_t item;
  341. RyanJsonObjectForEach(pJson, item) { RyanJsonFuzzerTestByForEachCreate(item, size); }
  342. RyanJson_t pJson2 = RyanJsonFuzzerCreateRandomNode(pJson);
  343. RyanJsonAddItemToObject(pJson, key, pJson2);
  344. if (RyanJsonIsArray(pJson))
  345. {
  346. RyanJsonAddNullToArray(pJson);
  347. RyanJsonAddBoolToArray(pJson, size % 2 ? RyanJsonTrue : RyanJsonFalse);
  348. RyanJsonAddItemToArray(pJson, RyanJsonFuzzerCreateRandomNode(RyanJsonGetArrayValue(pJson)));
  349. }
  350. }
  351. return RyanJsonTrue;
  352. }
  353. /**
  354. * @brief 测试 Json 的 Replace 功能(保护根节点)
  355. *
  356. * @param pJson 待测试的 Json 节点
  357. * @param size 用于计算 index 的模数
  358. * @param isFirst 是否为第一次调用(根节点)
  359. * @return RyanJsonBool_e
  360. */
  361. static RyanJsonBool_e RyanJsonFuzzerTestByForEachReplace(RyanJson_t pJson, uint32_t size)
  362. {
  363. {
  364. isEnableRandomMemFail = RyanJsonFalse;
  365. RyanJson_t strItem = RyanJsonCreateString("", "NULL");
  366. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByKey(NULL, NULL, NULL));
  367. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByKey(pJson, NULL, NULL));
  368. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByKey(NULL, "NULL", NULL));
  369. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByKey(NULL, NULL, strItem));
  370. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByKey(pJson, "NULL", NULL));
  371. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByKey(NULL, "NULL", strItem));
  372. if (!RyanJsonIsObject(pJson)) // pJson类型错误
  373. {
  374. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByKey(pJson, "NULL", strItem));
  375. }
  376. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByIndex(NULL, 0, NULL));
  377. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByIndex(pJson, 0, NULL));
  378. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByIndex(NULL, 0, strItem));
  379. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByIndex(pJson, 0, NULL));
  380. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByIndex(NULL, 0, strItem));
  381. if (!RyanJsonIsArray(pJson) && !RyanJsonIsObject(pJson)) // pJson类型错误
  382. {
  383. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByIndex(pJson, 0, strItem));
  384. }
  385. RyanJson_t objItem = RyanJsonCreateObject();
  386. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByKey(objItem, "NULL", strItem));
  387. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByIndex(objItem, 0, strItem));
  388. RyanJsonAddItemToObject(objItem, "item", RyanJsonCreateObject());
  389. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByKey(objItem, "NULL222", strItem));
  390. RyanJsonAssert(RyanJsonFalse == RyanJsonReplaceByIndex(objItem, INT32_MAX, strItem));
  391. isEnableRandomMemFail = RyanJsonTrue;
  392. RyanJsonDelete(objItem);
  393. RyanJsonDelete(strItem);
  394. }
  395. // 只处理数组或对象
  396. if (!(RyanJsonIsArray(pJson) || RyanJsonIsObject(pJson))) { return RyanJsonTrue; }
  397. // 递归替换子节点
  398. RyanJson_t item = NULL;
  399. RyanJson_t LastItem = NULL;
  400. RyanJsonObjectForEach(pJson, item)
  401. {
  402. if (RyanJsonTrue != RyanJsonFuzzerTestByForEachReplace(item, size)) { return RyanJsonFalse; }
  403. LastItem = item;
  404. }
  405. // 只有非根节点才做替换
  406. // 按 key 替换(仅对象)
  407. // 不要动第一个节点
  408. if (RyanJsonIsObject(pJson))
  409. {
  410. if (LastItem && RyanJsonIsKey(LastItem))
  411. {
  412. RyanJson_t newNode = RyanJsonFuzzerCreateRandomNode(pJson);
  413. if (RyanJsonFalse == RyanJsonReplaceByKey(pJson, RyanJsonGetKey(LastItem), newNode))
  414. {
  415. if (newNode) { RyanJsonDelete(newNode); }
  416. return RyanJsonFalse;
  417. }
  418. }
  419. }
  420. // 按 index 替换
  421. {
  422. uint32_t idx = RyanJsonGetSize(pJson) % size;
  423. RyanJson_t newNode = RyanJsonFuzzerCreateRandomNode(pJson);
  424. if (RyanJsonFalse == RyanJsonReplaceByIndex(pJson, (size % 25) ? idx : 0, newNode))
  425. {
  426. if (newNode) { RyanJsonDelete(newNode); }
  427. return RyanJsonFalse;
  428. }
  429. }
  430. return RyanJsonTrue;
  431. }
  432. /**
  433. * @brief 测试 Json 的 Detach 分离功能(保护根节点)
  434. *
  435. * @param pJson 待测试的 Json 节点
  436. * @param size 用于计算 index 的模数
  437. * @param isFirst 是否为第一次调用(根节点)
  438. * @return RyanJsonBool_e
  439. */
  440. static RyanJsonBool_e RyanJsonFuzzerTestByForEachDetach(RyanJson_t pJson, uint32_t size)
  441. {
  442. RyanJsonAssert(RyanJsonFalse == RyanJsonDetachByKey(NULL, NULL));
  443. RyanJsonAssert(RyanJsonFalse == RyanJsonDetachByKey(pJson, NULL));
  444. RyanJsonAssert(RyanJsonFalse == RyanJsonDetachByKey(NULL, "NULL"));
  445. if (!RyanJsonIsObject(pJson)) // pJson类型错误
  446. {
  447. RyanJsonAssert(NULL == RyanJsonDetachByKey(pJson, "NULL"));
  448. }
  449. RyanJsonAssert(NULL == RyanJsonDetachByIndex(NULL, 10));
  450. if (!RyanJsonIsArray(pJson) && !RyanJsonIsObject(pJson)) // pJson类型错误
  451. {
  452. RyanJsonAssert(NULL == RyanJsonDetachByIndex(pJson, 0));
  453. }
  454. if (!(RyanJsonIsArray(pJson) || RyanJsonIsObject(pJson))) { return RyanJsonTrue; }
  455. // 递归遍历子节点
  456. RyanJson_t item = NULL;
  457. RyanJson_t LastItem = NULL;
  458. RyanJsonObjectForEach(pJson, item)
  459. {
  460. RyanJsonFuzzerTestByForEachDetach(item, size);
  461. LastItem = item;
  462. }
  463. // 只有非根节点才做 detach
  464. // 按 key 分离(仅对象)
  465. if (RyanJsonIsObject(pJson))
  466. {
  467. if (LastItem && RyanJsonIsKey(LastItem))
  468. {
  469. RyanJson_t detached = RyanJsonDetachByKey(pJson, RyanJsonGetKey(LastItem));
  470. if (detached) { RyanJsonDelete(detached); }
  471. // RyanJsonAssert(RyanJsonFalse == RyanJsonDetachByKey(pJson, RyanJsonGetKey(LastItem)));
  472. }
  473. }
  474. // 按 index 分离
  475. {
  476. uint32_t idx = RyanJsonGetSize(pJson) % size;
  477. RyanJson_t detached = RyanJsonDetachByIndex(pJson, (size % 25) ? idx : 0);
  478. if (detached) { RyanJsonDelete(detached); }
  479. }
  480. return RyanJsonTrue;
  481. }
  482. /**
  483. * @brief 测试 Json 的 Delete 功能(保护根节点)
  484. *
  485. * @param pJson 待测试的 Json 节点
  486. * @param size 用于计算 index 的模数
  487. * @param isFirst 是否为第一次调用(根节点)
  488. * @return RyanJsonBool_e
  489. */
  490. static RyanJsonBool_e RyanJsonFuzzerTestByForEachDelete(RyanJson_t pJson, uint32_t size)
  491. {
  492. if (!(RyanJsonIsArray(pJson) || RyanJsonIsObject(pJson))) { return RyanJsonTrue; }
  493. // -------- 测试错误的 delete 调用 --------
  494. // Key 删除错误用例
  495. RyanJsonDeleteByKey(pJson, "non_exist_key");
  496. RyanJsonDeleteByKey(NULL, "some_key");
  497. RyanJsonDeleteByKey(pJson, NULL);
  498. RyanJsonDeleteByKey(NULL, NULL);
  499. // Index 删除错误用例
  500. RyanJsonDeleteByIndex(pJson, RyanJsonGetSize(pJson)); // 越界
  501. RyanJsonDeleteByIndex(NULL, (RyanJsonGetSize(pJson) % size));
  502. RyanJsonDeleteByIndex(pJson, -size); // 负数
  503. RyanJsonDeleteByIndex(NULL, -size);
  504. // 递归遍历子节点
  505. RyanJson_t item = NULL;
  506. RyanJson_t LastItem = NULL;
  507. RyanJsonObjectForEach(pJson, item)
  508. {
  509. RyanJsonFuzzerTestByForEachDelete(item, size);
  510. LastItem = item;
  511. }
  512. // -------- 正常删除逻辑(保护根节点) --------
  513. // 按 key 删除(仅对象)
  514. if (RyanJsonIsObject(pJson))
  515. {
  516. if (LastItem && RyanJsonIsKey(LastItem))
  517. {
  518. // printf("key is %d %s\r\n", RyanJsonGetType(LastItem),
  519. // RyanJsonGetKey(LastItem) == NULL ? "NULL" : RyanJsonGetKey(LastItem));
  520. RyanJsonDeleteByKey(pJson, RyanJsonGetKey(LastItem));
  521. }
  522. }
  523. // 按 index 删除
  524. uint32_t idx = RyanJsonGetSize(pJson) % size;
  525. RyanJsonDeleteByIndex(pJson, (size % 25) ? idx : 0);
  526. return RyanJsonTrue;
  527. }
  528. static RyanJsonBool_e RyanJsonFuzzerTestByMinify(const char *data, uint32_t size)
  529. {
  530. char *buf = malloc(size + 100);
  531. memcpy(buf, data, size);
  532. memset(buf + size, 0, 100);
  533. uint32_t size2 = RyanJsonMinify(buf, (int32_t)size);
  534. // 非法情况
  535. {
  536. RyanJsonCheckReturnFalse(0 == RyanJsonMinify(NULL, 0));
  537. RyanJsonCheckReturnFalse(0 == RyanJsonMinify(NULL, 10));
  538. RyanJsonCheckReturnFalse(0 == RyanJsonMinify(NULL, -10));
  539. RyanJsonCheckReturnFalse(0 == RyanJsonMinify(buf, -10));
  540. }
  541. // 内存泄漏就是上面出错了
  542. RyanJson_t pJson2 = RyanJsonParseOptions(buf, size2, size % 2 ? RyanJsonTrue : RyanJsonFalse, NULL);
  543. free(buf);
  544. if (NULL != pJson2)
  545. {
  546. uint32_t len = 0;
  547. char *jsonStr = RyanJsonPrint(pJson2, 100, RyanJsonFalse, &len); // 以带格式方式将数据打印出来
  548. RyanJsonCheckCode(NULL != jsonStr && len > 0, {
  549. RyanJsonDelete(pJson2);
  550. return RyanJsonFalse;
  551. });
  552. RyanJsonFree(jsonStr);
  553. RyanJsonDelete(pJson2);
  554. }
  555. else
  556. {
  557. return RyanJsonFalse;
  558. }
  559. return RyanJsonTrue;
  560. }
  561. static void *RyanJsonFuzzerMalloc(size_t size)
  562. {
  563. static int32_t count = 0;
  564. count++;
  565. if (RyanJsonTrue == isEnableRandomMemFail)
  566. {
  567. if (0 == count % 598) { return NULL; }
  568. }
  569. return (char *)v_malloc(size);
  570. }
  571. static void RyanJsonFuzzerFree(void *block) { v_free(block); }
  572. static void *RyanJsonFuzzerRealloc(void *block, size_t size)
  573. {
  574. static int32_t count = 0;
  575. count++;
  576. if (RyanJsonTrue == isEnableRandomMemFail)
  577. {
  578. if (0 == count % 508) { return NULL; }
  579. }
  580. return (char *)v_realloc(block, size);
  581. }
  582. int LLVMFuzzerTestOneInput(const char *data, uint32_t size)
  583. {
  584. // !检查分支覆盖率的时候要把这个取消掉,否则不知道是这个测试用例还是Fuzzer触发的,期望的是Fuzzer触发
  585. {
  586. // // 执行基础测试
  587. // static bool isFirst = true;
  588. // if (true == isFirst)
  589. // {
  590. // RyanJsonBool_e result = RyanJsonBaseTest();
  591. // if (RyanJsonTrue != result)
  592. // {
  593. // printf("%s:%d RyanJsonTest fail\r\n", __FILE__, __LINE__);
  594. // return -1;
  595. // }
  596. // RFC8259JsonTest();
  597. // isFirst = false;
  598. // }
  599. }
  600. // for (int i = 0; i < size; i++) { printf("%c", size, data[i]); }
  601. // printf("\r\n");
  602. RyanJsonInitHooks(NULL, RyanJsonFuzzerFree, RyanJsonFuzzerRealloc);
  603. RyanJsonInitHooks(RyanJsonFuzzerMalloc, NULL, RyanJsonFuzzerRealloc);
  604. RyanJsonInitHooks(RyanJsonFuzzerMalloc, RyanJsonFuzzerFree, NULL);
  605. RyanJsonInitHooks(NULL, NULL, NULL);
  606. RyanJsonInitHooks(RyanJsonFuzzerMalloc, RyanJsonFuzzerFree, size % 2 ? NULL : RyanJsonFuzzerRealloc);
  607. RyanJsonAssert(NULL == RyanJsonParseOptions(NULL, 100, RyanJsonFalse, NULL));
  608. RyanJsonAssert(NULL == RyanJsonParseOptions(data, 0, RyanJsonFalse, NULL));
  609. const char *parseEndPtr = NULL;
  610. RyanJson_t pJson = RyanJsonParseOptions(data, size, size % 3 ? RyanJsonTrue : RyanJsonFalse, &parseEndPtr);
  611. if (NULL != pJson)
  612. {
  613. assert(NULL != parseEndPtr && parseEndPtr - data <= size);
  614. {
  615. isEnableRandomMemFail = RyanJsonFalse;
  616. RyanJson_t pJson2 = RyanJsonDuplicate(pJson);
  617. isEnableRandomMemFail = RyanJsonTrue;
  618. RyanJsonCheckCode(RyanJsonFuzzerTestByForEachDelete(pJson2, size), {
  619. RyanJsonDelete(pJson2);
  620. goto __exit;
  621. });
  622. RyanJsonDelete(pJson2);
  623. }
  624. {
  625. isEnableRandomMemFail = RyanJsonFalse;
  626. RyanJson_t pJson2 = RyanJsonDuplicate(pJson);
  627. isEnableRandomMemFail = RyanJsonTrue;
  628. RyanJsonCheckCode(RyanJsonFuzzerTestByForEachDetach(pJson2, size), {
  629. RyanJsonDelete(pJson2);
  630. goto __exit;
  631. });
  632. RyanJsonDelete(pJson2);
  633. }
  634. RyanJsonFuzzerTestByMinify(data, size);
  635. RyanJsonFuzzerTestByParseAndPrint(pJson, data, size);
  636. RyanJsonFuzzerTestByForEachGet(pJson, size);
  637. RyanJsonFuzzerTestByDup(pJson);
  638. RyanJsonCheckCode(RyanJsonFuzzerTestByForEachChange(pJson, size), { goto __exit; });
  639. RyanJsonCheckCode(RyanJsonFuzzerTestByForEachCreate(pJson, size), { goto __exit; });
  640. RyanJsonCheckCode(RyanJsonFuzzerTestByForEachReplace(pJson, size), { goto __exit; });
  641. RyanJsonDelete(pJson);
  642. }
  643. return 0;
  644. __exit:
  645. RyanJsonDelete(pJson);
  646. return 0;
  647. }