80 votes

Comment utiliser AddressSanitizer avec GCC ?

J'essaie de construire mon projet avec

g++ -O0 -g -fsanitize=address -fno-omit-frame-pointer

mais je reçois beaucoup d'erreurs comme :

/home/user/libs/opencv/include/opencv2/core/mat.hpp:715: undefined reference to `__asan_report_load8'

Comment compiler un projet avec le support d'AddressSanitize ?

Ma version de gcc est 4.8.4.

7 votes

Ce n'est pas la ligne de compilation complète, puisque vous n'avez pas le nom du fichier. Avez-vous compilé/lié en plusieurs étapes ? Vous avez également oublié de mentionner la version de gcc que vous utilisez...

2 votes

S'il vous plaît, mettez la réponse correcte @yugr un puisque celui que vous avez marqué n'est pas vraiment correct.

158voto

yugr Points 6089

Vous devez ajouter -fsanitize=address aux drapeaux du compilateur (à la fois CFLAGS y CXXFLAGS ) et les drapeaux de l'éditeur de liens ( LDFLAGS ). Vous l'avez probablement ajouté aux drapeaux de votre compilateur uniquement.

Notez que l'utilisation d'une -lasan a été largement déconseillée par les développeurs d'ASan (par ex. aquí ) car il manque d'autres drapeaux de liaison importants. La seule façon recommandée de lier est d'utiliser -fsanitize=address .

À titre d'information, pour des drapeaux de vérification plus agressifs, vérifiez les éléments suivants FAQ Asan (recherchez "diagnostics plus agressifs").

1 votes

Si je saute le -lasan Je reçois undefined reference to __asan_...

1 votes

@HeinrichStack Il est difficile de commenter sans repro. Notez que -fsanitize=address est équivalent à -lasan + quelques autres trucs.

2 votes

Lorsque vous utilisez -Wl,--no-undefined avec Clang, il faut aussi ajouter -shared-libasan aux drapeaux des linkers. Cela fait également partie de la FAQ officielle, mais juste au cas où, il est également agréable d'avoir cette information ici.

14voto

Jonny Points 31

Assurez-vous que vous avez installé libasan. Par exemple, dans Fedora :

dnf install libasan libasan-static

1 votes

En effet, cela peut provoquer une erreur similaire lorsque l'on applique Asan à une seule bibliothèque partagée et que l'on utilise -static-libasan . Sinon, gcc émettra des messages d'erreur distincts ( libasan_preinit.o: No such file or directory o cannot find -lasan ). Sur Ubuntu libasan est installé par défaut avec gcc .

9voto

Smeeheey Points 7790

Vous devez ajouter le commutateur -lasan -fsanitize=address a su les deux votre compile y link pour lier la bonne bibliothèque.

Note : la réponse originale -lasan est périmée et ne devrait pas être utilisée, selon les commentaires.

0 votes

Cela ne fonctionne ni sur WSL ni sur Windows. Avec toutes les versions de libasan installées.

2 votes

Dans mon expérience, lorsque cela est nécessaire, gcc est installé de manière incorrecte.

18 votes

Cela ne devrait pas être la réponse acceptée. La réponse ci-dessous de @yugr est correcte. J'ajoute juste ce commentaire pour que les gens n'arrêtent pas de lire après la réponse acceptée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X