На Трэвисе CI, где я использую clang version 3.4 (tags/RELEASE_34/final)
который уже установлен, я строю свой код с этим:
clang++ main.cpp -m64 -fsanitize=undefined -Werror -std=c++98 -pedantic -pedantic-errors -fvisibility=hidden -fstrict-aliasing -Weverything -Qunused-arguments -fcolor-diagnostics -O3 -DNDEBUG
(эта команда получена из compile_commands.json
который генерируется из cmake)
И в выходных данных после выхода из программы появляются некоторые числа (например, шестнадцатеричное представление памяти):
00 00 00 10 70 fb 01 00 00 00 00 10 70 fb 01
Я предполагаю, что это из дезинфицирующего средства UB, потому что, когда я строю с ASAN или вообще без дезинфицирующего средства, эти цифры отсутствуют.
Так что они имеют в виду? Как мне диагностировать мою ошибку UB (если это действительно так)?
Я думал, что когда дезинфицирующее средство встречает ошибку, оно вылетает из программы и печатает большое сообщение с объяснением. и что это?
Для меня это прерыватель сделки, потому что я сравниваю справочный вывод в текстовом файле с выводом программы из текущей сборки, и такой дополнительный вывод нарушает все.
Я попытался локально, используя Clang 3.6, который по умолчанию для моего Ubuntu использует ту же команду сборки, но когда я запускаю исполняемый файл, я не получаю ошибок или такого дополнительного вывода.
Вот это неудачная сборка на travis — и я не думаю, что мой код актуален, потому что моя проблема в том, что вывод дезинфицирующего средства вообще не помогает.
Я также включил сборки с помощью clang 3.5 / 3.6 / 3.7 / 3.8 и оказалось, что clang 3.5 ведет себя так же …
Clang 3.6 однако дает больше продукции!
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 и 3.8 дают тот же результат, что и 3.6
я использую libstdc++
поэтому я переключусь на libc++
надеюсь удалить эту ошибку (которая, я думаю, не из моего кода!)
Я использовал простой TestData
структура внутри std::set<>
…
Других решений пока нет …