2017-01-12 8 views
0

Я экспериментирую с libFuzzer проекта LLVM, пытаясь генерировать входы для библиотеки обработки аудиосигнала.LLVM libFuzzer rss memory увеличение

Для простоты я начал с PCM с постоянной величиной 64 Кбит в качестве исходного корпуса, используя -max_len = 65536. Потребление памяти на вызов библиотеки составляет около 200 КБ, которое должно быть освобождено, как ожидалось.

Что мне интересно, о том, является потребление памяти отображается как RSS в журнале fuzzer:

#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 Метрика неуклонно растет?

Обратите внимание, что увеличение, кажется, сходится (по аналогии с его и футов величины), поэтому память не просочилась в целевой fuzzer вызова.

Это проблема с установкой или утечкой, что приводит к увеличению памяти rss?

Если нет, то в чем смысл использования опции -rss_limit_mb, доступной для fuzzer, если потребление памяти не будет установлено после каждого запуска целевого объекта fuzzer?

+0

У вас есть утечка. – Joky

ответ

1

Некоторые причины для увеличения памяти являются:

  • Асан в «карантин»: Асан сохраняет освобожденной памяти в карантине, чтобы обнаружить использование после освобождения ошибок. При размывании без ограничения размера карантина рост памяти неограничен. Попытайтесь изменить quarantine_size_mb ASan option на другое значение, чем -1, что означает неограниченный.

  • Внутренние структуры данных libFuzzer, но они не должны расти очень большими.

  • Память выделена вашим кодом isn't returned to the OS after being freed. Значение RSS часто отражает максимальное значение, используемое любым из тестовых входов, и после этого не будет уменьшаться. Разумеется, вся свободная память доступна для последующих распределений.

  • Другим объяснением является то, что ваш код действительно имеет утечку памяти. Многие утечки обнаруживаются с помощью detect_leaks option, который включен по умолчанию. Но также возможно, что глобальная структура данных, такая как кеш, постоянно растет, что невозможно обнаружить при размывании.

С опцией quarantine_size_mb RSS должен сходиться в конечном счете.

+0

Интересные моменты. Маловероятно, что сам код имеет утечки, поскольку ожидается, что увеличение памяти будет линейно масштабироваться с количеством прогонов, и хорошо - я знаю, что утечек нет, так как в основном один malloc и один свободный за ход. Я буду экспериментировать с 'quarantine_size_mb', когда у меня будет время. – nucleon