Sur travis CI où j'utilise clang version 3.4 (tags/RELEASE_34/final)
qui est déjà installé, je construis mon code avec ceci:Sortie supplémentaire du programme construit avec le désinfectant pour les mains UB de Clang
clang++ main.cpp -m64 -fsanitize=undefined -Werror -std=c++98 -pedantic -pedantic-errors -fvisibility=hidden -fstrict-aliasing -Weverything -Qunused-arguments -fcolor-diagnostics -O3 -DNDEBUG
(cette commande est obtenue à partir compile_commands.json
qui est généré de cMake)
Et dans la sortie après que le programme se ferme quelques chiffres (comme la représentation hexadécimale de mémoire) apparaissent:
00 00 00 10 70 fb 01 00 00 00 00 10 70 fb 01
Je suppose que cela vient du désinfectant UB parce que quand je construis avec ASAN ou sans désinfectant, ces chiffres ne sont pas là.
Alors, que signifient-ils? Comment puis-je diagnostiquer mon erreur UB (si tel est le cas)?
Je pensais que lorsqu'un désinfectant rencontre une erreur, il plante le programme et imprime un gros message avec des explications. Alors qu'est-ce que c'est?
Ceci est un deal breaker pour moi parce que je compare la sortie de référence dans un fichier texte avec la sortie du programme de la construction actuelle et une telle sortie supplémentaire brise tout. J'ai essayé localement en utilisant Clang 3.6, qui est la valeur par défaut pour mon Ubuntu en utilisant la même commande de construction, mais quand j'exécute l'exécutable je n'obtiens aucune erreur ou une telle sortie supplémentaire. Est la construction qui échoue sur travis - et je ne pense pas que mon code soit pertinent car mon problème est que la sortie du désinfectant n'est pas utile du tout.
Eh bien, vous savez ce qu'ils disent sur le comportement indéfini. –
oui - mais n'est pas l'outil censé m'aider à diagnostiquer l'UB? et pas seulement pour dire «hey! il y a quelques UB''' – onqtam
Eh bien, l'outil injecte du code dans l'exécutable. Il est possible qu'un "comportement indéfini" empêche UBSan de fonctionner, ce qui n'est pas trop surprenant. Je suis sûr que vous avez des raisons valables mais je remarque aussi que vous désactivez beaucoup d'avertissements qui sont utiles pour attraper UB (avec vos pragmas). –