2017-01-12 1 views
0

J'expérimente libFuzzer du projet LLVM en essayant de générer des entrées pour une bibliothèque de traitement du signal audio. Par souci de simplicité, j'ai commencé avec un PCM de 64 kb à constante constante comme corpus initial, en utilisant -max_len = 65536. La consommation de mémoire par appel de bibliothèque est d'environ 200 Ko, ce qui devrait être libéré comme prévu.LLVM libFuzzer rss augmentation de la mémoire

Ce que je me demande est la consommation de mémoire apparaît comme rss dans le journal 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"- 

Pourquoi la métrique rss en constante augmentation?

Notez que l'augmentation semble converger (similaire à la cov et pieds quantités), de sorte que la mémoire ne soit pas divulgué par appel cible fuzzer.

Est-ce un problème de configuration ou une fuite qui augmente la mémoire rss?

Sinon, quelle est la raison pour laquelle une option -rss_limit_mb est disponible pour le fuzzer, si la consommation de mémoire n'est pas annulée après chaque invocation de cible de fuzzer?

+0

Vous avez une fuite. – Joky

Répondre

1

Quelques raisons pour l'augmentation de la mémoire sont:

  • « en quarantaine » de Asan: Asan conserve la mémoire libérée en quarantaine pour détecter les erreurs d'utilisation ultérieure libre. Lorsque le fuzzing sans limite de taille de la quarantaine, la croissance de la mémoire est illimitée. Essayez de changer le quarantine_size_mb ASan option à une valeur différente de -1, ce qui signifie illimité.

  • Les structures de données internes de libFuzzer, mais celles-ci ne devraient pas devenir très grandes.

  • Mémoire allouée par votre code isn't returned to the OS after being freed. La valeur RSS reflètera souvent le maximum utilisé par l'une des entrées de test et ne diminuera pas par la suite. Toute la mémoire libérée est disponible pour les allocations suivantes, bien sûr.

  • Une autre explication est que votre code a vraiment une fuite de mémoire. De nombreuses fuites sont détectées avec le detect_leaks option qui est activé par défaut. Mais il est également possible qu'une structure de données globale telle qu'un cache croisse constamment et ne puisse être détectée lors du fuzzing.

Avec l'option quarantine_size_mb, les flux RSS devraient finalement converger.

+0

Points intéressants. Il est peu probable que le code lui-même ait des fuites, car l'augmentation de la mémoire devrait être proportionnelle au nombre de passages, et bien - je sais qu'il n'y a pas de fuites car il y a essentiellement un malloc et un gratuit par passage. Je vais expérimenter avec 'quarantine_size_mb', quand j'ai le temps. – nucleon