LLVM libFuzzer rss内存增加

时间:2017-01-12 12:49:36

标签: c clang llvm fuzzing address-sanitizer

我正在试验LLVM项目的libFuzzer,试图为音频信号处理库生成输入。

为了简单起见,我开始使用常量为零的64kb PCM作为初始语料库,使用-max_len = 65536。每个库调用的内存消耗大约为200kB,应该按预期释放。

我想知道的是在fuzzer日志中显示为rss的内存消耗:

#1024   pulse  cov: 26153 ft: 40811 corp: 783/33Mb exec/s: 7 rss: 541Mb
#2048   pulse  cov: 26154 ft: 40811 corp: 783/33Mb exec/s: 8 rss: 573Mb
#4096   pulse  cov: 26154 ft: 40811 corp: 783/33Mb exec/s: 8 rss: 574Mb
#4895   NEW    cov: 26156 ft: 40815 corp: 784/33Mb exec/s: 8 rss: 576Mb L: 26935 MS: 1 InsertRepeatedBytes-
#8192   pulse  cov: 26157 ft: 40815 corp: 784/33Mb exec/s: 8 rss: 578Mb
#11875  NEW    cov: 26157 ft: 40816 corp: 785/33Mb exec/s: 8 rss: 579Mb L: 59394 MS: 1 InsertByte-
#12862  NEW    cov: 26157 ft: 40817 corp: 786/33Mb exec/s: 8 rss: 579Mb L: 51404 MS: 3 EraseBytes-EraseBytes-CopyPart-
#15357  NEW    cov: 26157 ft: 40818 corp: 787/33Mb exec/s: 8 rss: 579Mb L: 64536 MS: 3 CopyPart-ChangeBit-InsertRepeatedBytes-
#16384  pulse  cov: 26157 ft: 40818 corp: 787/33Mb exec/s: 8 rss: 579Mb
#23171  NEW    cov: 26157 ft: 40820 corp: 788/33Mb exec/s: 8 rss: 579Mb L: 49412 MS: 2 InsertRepeatedBytes-CMP- DE: "\x00\x00\x00\x00\x00\x00\x00\x00"-
#25426  NEW    cov: 26158 ft: 40825 corp: 789/33Mb exec/s: 8 rss: 579Mb L: 64443 MS: 2 CMP-CMP- DE: "\x00\x00\x00\x00"-"\xff\xff"-

为什么rss指标稳步上升?

请注意,增加似乎会收敛(类似于 cov ft 数量),因此每个模糊限定目标调用不会泄漏内存。

是设置问题还是泄漏,导致rss内存增加?

如果没有,如果在每个模糊限定目标调用后没有设置内存消耗,那么为模糊器提供 -rss_limit_mb 选项的理由是什么?

1 个答案:

答案 0 :(得分:3)

内存增加的一些原因是:

  • ASAN"隔离":ASan将隔离内存释放,以检测释放后使用错误。在没有隔离大小限制的模糊测试时,内存增长是无限的。 尝试将quarantine_size_mb ASan option更改为不同于-1的值,这意味着无限制。 ASan应该默认限制隔离区大小。

  • libFuzzer的内部数据结构,但这些结构应该在某些时候停止增长。

  • 您的代码isn't returned to the OS after being freed分配的内存。 RSS值通常会反映任何测试输入所使用的最大值,并且在此之后不会下降。当然,所有释放的内存都可用于后续分配。

  • 另一种解释是您的代码确实存在内存泄漏。使用默认启用的detect_leaks option检测到许多泄漏。但也有可能像缓存这样的全球数据结构不断增长,在模糊测试时无法检测到。

使用quarantine_size_mb选项,RSS最终会收敛。