2017-01-12 80 views
0

我正在嘗試使用LLVM項目的libFuzzer嘗試爲音頻信號處理庫生成輸入。LLVM libFuzzer rss內存增加

爲了簡單起見,我使用-max_len = 65536開始使用恆定爲零的64kb PCM作爲初始語料庫。每個庫調用的內存消耗約爲200kB,應該按預期釋放。

我不知道什麼是顯示爲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英尺量),所以內存是不是每個模糊器目標調用泄露。

它是一個設置問題或泄漏,導致rss內存增加?

如果沒有,什麼是具有-rss_limit_mb選項提供給模糊器,如果每個模糊器目標調用後未設置內存消耗回來的理由?

+0

你有泄漏。 – Joky

回答

1

一些原因增加內存是:

  • 阿三的「隔離」:阿三不斷釋放的內存在檢疫檢測釋放後使用錯誤自由。當沒有檢疫限制的模糊化時,內存增長是無限的。嘗試將quarantine_size_mb ASan option更改爲不同於-1的值,這意味着無限制。

  • libFuzzer的內部數據結構,但它們不應該變得非常大。

  • 由您的代碼分配的內存isn't returned to the OS after being freed。 RSS值通常會反映任何測試輸入使用的最大值,並且在此之後不會下降。當然,所有釋放的內存都可用於後續分配。

  • 另一種解釋是你的代碼確實有內存泄漏。使用默認情況下啓用的​​檢測到許多泄漏。但是,像緩存這樣的全球數據結構也可能會不斷增長,這在模糊時無法檢測到。

使用quarantine_size_mb選項,RSS應該最終收斂。

+0

有趣的點。代碼本身不太可能泄漏,因爲內存的增加預計會隨着運行次數線性擴展,而且我知道沒有泄漏,因爲基本上每次運行一個malloc和一個free。當我有時間時,我會嘗試'quarantine_size_mb'。 – nucleon