web-dev-qa-db-fra.com

Est-il possible de faire ignorer à valgrind certaines bibliothèques?

Ou de préférence tous, au lieu de juste mon code? Mon programme utilise Gtk, Loudmouth et quelques autres choses, et ces deux (et certains derrière eux, libgcrypto, libssl) causent tellement d'erreurs que je ne peux pas détecter les miennes. Est-il possible de faire ignorer à valgrind des choses venant de plus profond que mon propre code?

51
tadzik

Vous pouvez générer des suppressions pour les erreurs pour les bibliothèques, mais je ne pense pas que vous puissiez exclure les bibliothèques en général.

Il est également difficile de savoir automatiquement si une erreur de mémoire dans la bibliothèque est causée par un problème dans votre code ou non.

10
Douglas Leeder

En supposant que vous exécutez l'outil memcheck et que vous souhaitez ignorer les erreurs de fuite dans libcrypto uniquement, vous pouvez mettre une suppression comme:

{
   ignore_libcrypto_conditional_jump_errors
   Memcheck:Leak
   ...
   obj:*/libcrypto.so.*
}

... dans un fichier et passez-le à valgrind avec --suppressions=*FILENAME*.

Pour ignorer les erreurs de fuite dans toutes les bibliothèques partagées sous n'importe quelle lib répertoire (/lib , /lib64 , /usr/lib , /usr/lib64 , ...):

{
   ignore_unversioned_libs
   Memcheck:Leak
   ...
   obj:*/lib*/lib*.so
}
{
   ignore_versioned_libs
   Memcheck:Leak
   ...
   obj:*/lib*/lib*.so.*
}

Il est peu probable, mais vous devrez peut-être ajouter des variantes supplémentaires du modèle de répertoire pour tenir compte des emplacements des bibliothèques X11 et GTK.

Attention, cela ignorera les erreurs provoquées par les rappels que vous avez écrits qui ont été invoqués par les bibliothèques. Les erreurs de capture dans ces rappels pourraient presque se faire avec:

{
   ignore_unversioned_libs
   Memcheck:Leak
   obj:*/lib*/lib*.so
   ...
   obj:*/lib*/lib*.so
}
{
   ignore_versioned_libs
   Memcheck:Leak
   obj:*/lib*/lib*.so.*
   ...
   obj:*/lib*/lib*.so.*
}

... mais cela révèle des erreurs dans les appels par une bibliothèque qui utilise le malloc Valgrind. Puisque valgrind malloc est injecté directement dans le texte du programme - non chargé en tant que bibliothèque dynamique - il apparaît dans la pile de la même manière que votre propre code. Cela permet à Valgrind de suivre les allocations, mais rend également plus difficile de faire exactement ce que vous avez demandé.

Pour info: j'utilise valgrind 3.5.

38
mormegil

Avec OpenSSL en particulier, c'est très difficile. Les clés de chiffrement SSL sont partiellement basées sur des déchets de pile non initialisés, ce qui signifie que toutes les données déchiffrées sont également contaminées. Cette contamination a tendance à se propager au-delà d'OpenSSL lui-même.

La compilation d'OpenSSL avec une option "PURIFY" peut aider ici. Malheureusement, en raison de certaines actions mal pensées d'une grande distribution Linux, il est peu probable que cela devienne par défaut.

Une solution de contournement très simple est le --undef-value-errors=no option.

6
jilles