chore: 规范标点
This commit is contained in:
1 parent
15e79887fa
commit
3dd2231c70
81 files changed
+1751
-1751
No files matched your search
+13
-13
@@ -1,19 +1,19 @@
|
||||
/* fuzz.c - 对抗性模糊测试:JSON 解析器 + Markdown 渲染器
|
||||
/* fuzz.c - 对抗性模糊测试: JSON 解析器 + Markdown 渲染器
|
||||
*
|
||||
* 这两个模块是"解析不可信输入"的地方 (服务端响应、模型输出),
|
||||
* 也是最可能出崩溃/越界/泄漏的地方. 所以用随机输入去砸它们.
|
||||
*
|
||||
* 检查的不变量:
|
||||
* 检查的不变量:
|
||||
* JSON
|
||||
* 1. 任何输入都不能崩溃、不能泄漏 (靠 ASan/UBSan/LeakSanitizer)
|
||||
* 2. 解析成功 => dump 再 parse 再 dump, 两次 dump 必须一致 (幂等)
|
||||
* 3. 随机生成的合法 JSON 必须解析成功并完整往返
|
||||
* Markdown
|
||||
* 4. 任何输入都不能崩溃、不能泄漏
|
||||
* 5. 分片不变性:一次性喂 与 任意分片喂 的输出必须逐字节一致
|
||||
* 5. 分片不变性: 一次性喂 与 任意分片喂 的输出必须逐字节一致
|
||||
* 6. 不含任何元字符的输入必须原样输出
|
||||
*
|
||||
* 用法: fuzz [迭代次数] [随机种子]
|
||||
* 用法: fuzz [迭代次数] [随机种子]
|
||||
*/
|
||||
#include "json.h"
|
||||
#include "markdown.h"
|
||||
@@ -104,7 +104,7 @@ static int fuzz_json_once(char *err, size_t errlen)
|
||||
|
||||
int mutate = (int)rnd_below(2);
|
||||
if (mutate) {
|
||||
/* 变异模式:先造合法 JSON, 再随机破坏 */
|
||||
/* 变异模式: 先造合法 JSON, 再随机破坏 */
|
||||
gen_json(&sb, 0);
|
||||
size_t n = sb.len;
|
||||
if (n == 0) { sb_free(&sb); return 0; }
|
||||
@@ -156,7 +156,7 @@ static int fuzz_json_once(char *err, size_t errlen)
|
||||
|
||||
/* 交给解析器的必须是真正 NUL 结尾的缓冲区 */
|
||||
if (strlen(input) != inlen) {
|
||||
snprintf(err, errlen, "测试器自身出错:缓冲区未正确结尾");
|
||||
snprintf(err, errlen, "测试器自身出错: 缓冲区未正确结尾");
|
||||
sb_free(&sb);
|
||||
return 1;
|
||||
}
|
||||
@@ -167,7 +167,7 @@ static int fuzz_json_once(char *err, size_t errlen)
|
||||
char *d2 = NULL;
|
||||
JsonValue *v2 = json_parse(d1, err, errlen);
|
||||
if (!v2) {
|
||||
snprintf(err, errlen, "解析成功的 JSON 却无法重新解析:%.120s", d1);
|
||||
snprintf(err, errlen, "解析成功的 JSON 却无法重新解析: %.120s", d1);
|
||||
free(d1);
|
||||
json_free(v);
|
||||
sb_free(&sb);
|
||||
@@ -175,7 +175,7 @@ static int fuzz_json_once(char *err, size_t errlen)
|
||||
}
|
||||
d2 = json_dump(v2);
|
||||
if (strcmp(d1, d2) != 0) {
|
||||
snprintf(err, errlen, "dump 不幂等:\n 输入 %.200s\n 一次 %.200s\n 二次 %.200s",
|
||||
snprintf(err, errlen, "dump 不幂等: \n 输入 %.200s\n 一次 %.200s\n 二次 %.200s",
|
||||
input, d1, d2);
|
||||
free(d1); free(d2);
|
||||
json_free(v); json_free(v2);
|
||||
@@ -264,7 +264,7 @@ static int fuzz_md_once(char *err, size_t errlen)
|
||||
char *whole = md_render(src, len, 0);
|
||||
if (!whole) { sb_free(&sb); return 0; }
|
||||
if (strlen(whole) > MD_RENDER_LIMIT * 4) {
|
||||
snprintf(err, errlen, "输出异常膨胀:输入 %zu 字节 => %zu 字节",
|
||||
snprintf(err, errlen, "输出异常膨胀: 输入 %zu 字节 => %zu 字节",
|
||||
len, strlen(whole));
|
||||
free(whole); sb_free(&sb);
|
||||
return 1;
|
||||
@@ -292,7 +292,7 @@ static int fuzz_md_once(char *err, size_t errlen)
|
||||
/* 无元字符 => 必须逐字节原样 */
|
||||
if (pure) {
|
||||
if (strcmp(whole, src) != 0) {
|
||||
snprintf(err, errlen, "纯净文本被改写了:\n 输入 %.300s\n 输出 %.300s",
|
||||
snprintf(err, errlen, "纯净文本被改写了: \n 输入 %.300s\n 输出 %.300s",
|
||||
src, whole);
|
||||
free(whole); sb_free(&sb);
|
||||
return 1;
|
||||
@@ -315,13 +315,13 @@ int main(int argc, char **argv)
|
||||
char err[512];
|
||||
long json_fail = 0, md_fail = 0;
|
||||
|
||||
printf("模糊测试:JSON %ld 轮 + Markdown %ld 轮 (种子 %llu)\n",
|
||||
printf("模糊测试: JSON %ld 轮 + Markdown %ld 轮 (种子 %llu)\n",
|
||||
iters, iters, (unsigned long long)RNG);
|
||||
|
||||
for (long i = 0; i < iters; i++) {
|
||||
err[0] = '\0';
|
||||
if (fuzz_json_once(err, sizeof err)) {
|
||||
printf(" ✗ JSON 第 %ld 轮失败:%s\n", i, err);
|
||||
printf(" ✗ JSON 第 %ld 轮失败: %s\n", i, err);
|
||||
if (++json_fail >= 3) break;
|
||||
}
|
||||
}
|
||||
@@ -330,7 +330,7 @@ int main(int argc, char **argv)
|
||||
for (long i = 0; i < iters; i++) {
|
||||
err[0] = '\0';
|
||||
if (fuzz_md_once(err, sizeof err)) {
|
||||
printf(" ✗ Markdown 第 %ld 轮失败:%s\n", i, err);
|
||||
printf(" ✗ Markdown 第 %ld 轮失败: %s\n", i, err);
|
||||
if (++md_fail >= 3) break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user