| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- #include "RyanJson.h"
- #include "RyanJsonFuzzer.h"
- /**
- * @brief minify 模块的一次性确定性自检
- *
- * 这里只保留运行期 harness 不会主动构造的非法入参。
- */
- void RyanJsonFuzzerSelfTestMinifyCases(void)
- {
- // 运行期总是传入非负 size,这里只补齐负长度保护。
- {
- uint8_t rawBuf[5] = {'a', 'b', 'c', '#', '#'};
- assert(0 == RyanJsonMinify((char *)rawBuf, -10));
- assert('a' == rawBuf[0]);
- assert('b' == rawBuf[1]);
- assert('c' == rawBuf[2]);
- assert('#' == rawBuf[3]);
- assert('#' == rawBuf[4]);
- }
- assert(0 == RyanJsonMinify(NULL, 0));
- assert(0 == RyanJsonMinify(NULL, 10));
- assert(0 == RyanJsonMinify(NULL, -10));
- }
- /**
- * @brief 压缩测试
- *
- * 测试 RyanJson 的 Minify 功能(去除空白字符)。
- * 覆盖场景:
- * Minify 功能:将原始 Json 文本压缩,验证是否能成功压缩。
- * 再次解析:解析压缩后的 Json 文本,验证压缩未破坏 Json 结构。
- *
- * @param state Fuzzer 状态上下文
- * @param data 原始输入数据文本
- * @param size 输入数据长度
- */
- RyanJsonBool_e RyanJsonFuzzerTestMinify(const char *data, uint32_t size)
- {
- // 准备缓冲区并拷贝数据
- // 分配比原始数据稍大的缓冲区,防止边界溢出
- char *buf = (char *)malloc((size_t)size + 1U);
- if (!buf) { return RyanJsonFalse; }
- memcpy(buf, data, size);
- buf[size] = '\0';
- // 执行 Minify
- // RyanJsonMinify 会原地修改缓冲区并移除空白字符
- uint32_t len = RyanJsonMinify(buf, (int32_t)size);
- assert(len > 0);
- assert(len <= size);
- // 验证 Minify 后数据有效性
- // 尝试解析压缩后的 Json 文本,确认结构未被破坏
- // 注意:Minify 只是去空格,如果原串合法,Minify 后也应合法。
- // 这里使用可选尾部模式(不强制 Null Terminator,虽然已补终止符)
- RyanJson_t pJson = RyanJsonParseOptions(buf, len, size % 2 ? RyanJsonTrue : RyanJsonFalse, NULL);
- free(buf);
- if (NULL != pJson)
- {
- // 如果解析成功,尝试打印回来,确保 Object 结构完整
- uint32_t lenPrint = 0;
- char *jsonStr = RyanJsonPrint(pJson, 100, RyanJsonFalse, &lenPrint);
- RyanJsonCheckCode(NULL != jsonStr && lenPrint > 0, {
- RyanJsonDelete(pJson);
- return RyanJsonFalse;
- });
- RyanJsonFree(jsonStr);
- RyanJsonDelete(pJson);
- }
- else
- {
- // 如果输入本身非法,解析失败是预期行为
- return RyanJsonFalse;
- }
- return RyanJsonTrue;
- }
|