2016-06-10 7 views
3

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.

+2

Eh bien, vous savez ce qu'ils disent sur le comportement indéfini. –

+0

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

+2

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). –

Répondre

1

I ont également permis builds avec clang 3,5/3,6/3,7/3,8 et 3,5 se révèle clang se comporte de la même façon ...

clang 3.6 donne cependant plus de puissance!

20 6c 98 01 00 00 00 00 20 6c 98 01 00 00 00 00 20 6c 98 01 
      ^
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../include/c++/4.6/bits/stl_tree.h:247:17: runtime error: upcast of address 0x00000115e090 with insufficient space for an object of type 'std::_Rb_tree_node<doctest::detail::TestData>' 
0x00000115e090: note: pointer points here 
00 00 00 00 00 00 00 00 00 00 00 00 20 6c 98 01 00 00 00 00 20 6c 98 01 00 00 00 00 20 6c 98 01 

clang 3.7 et 3.8 donnent le même résultat que 3,6

J'utilise libstdc++ donc je vais passer à libc++ pour enlever, espérons cette erreur (qui je pense est pas de mon code!)

J'utilisais une structure simple TestData à l'intérieur d'un std::set<> ...