关于LibFuzzer中cov字段代表块覆盖还是分支/边覆盖的技术咨询
LibFuzzer中
cov:字段代表块覆盖还是分支/边覆盖? 我来帮你理清这个困惑——很多人都会在LibFuzzer的cov:字段定义上犯迷糊,毕竟不同资料说法不一,很容易搞混。
先看你贴出的LibFuzzer运行日志:
#1 INITED cov: 18 ft: 15 corp: 1/1b exec/s: 0 rss: 27Mb #15 NEW cov: 23 ft: 16 corp: 2/5b exec/s: 0 rss: 27Mb L: 4 MS: 4 InsertByte-... #262144 pulse cov: 23 ft: 16 corp: 2/5b exec/s: 131072 rss: 45Mb #524288 pulse cov: 23 ft: 16 corp: 2/5b exec/s: 131072 rss: 62Mb #1048576 pulse cov: 23 ft: 16 corp: 2/5b exec/s: 116508 rss: 97Mb #2097152 pulse cov: 23 ft: 16 corp: 2/5b exec/s: 110376 rss: 167Mb #4194304 pulse cov: 23 ft: 16 corp: 2/5b exec/s: 107546 rss: 306Mb #8388608 pulse cov: 23 ft: 16 corp: 2/5b exec/s: 106184 rss: 584Mb
关于cov:的定义,LibFuzzer官方文档的描述是最权威的,它明确说:
Total number of code blocks or edges covered by executing the current corpus.
这里的核心点你一定要注意:cov:到底统计的是块还是边,完全取决于你编译目标程序时用的Sanitizer插桩配置:
- 如果你用的是最常见的默认组合
-fsanitize=address,fuzzer(ASan+LibFuzzer),那么cov:统计的是基本块(basic block)覆盖的数量; - 但如果你在编译时额外添加了
-fsanitize-coverage=edge参数(或者直接用-fsanitize=coverage,fuzzer这类配置),此时cov:就会切换为统计边(edge,也就是分支对应的跳转边)覆盖的数量。
这就是为什么你查资料会得到不同答案的原因——很多分享者没把编译配置这个前提说清楚,导致信息不对等。
顺便提一句日志里的ft:字段,它代表的是LibFuzzer追踪的“features”(覆盖特征),这是LibFuzzer用来引导模糊测试的核心数据,和cov:是两个不同的统计维度,不用和它混淆。
备注:内容来源于stack exchange,提问作者oxyuranus
相关产品推荐
相关产品推荐

