2016-06-10 60 views
3

的UB消毒劑在哪裏使用已經安裝clang version 3.4 (tags/RELEASE_34/final)特拉維斯CI建成,我建立我的代碼以這樣的:從程序附加輸出與鏘

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使用相同的生成命令的默認值,但是當我運行可執行文件時,我沒有得到任何錯誤或這種額外的輸出。

here是travis上失敗的版本 - 我不認爲我的代碼是相關的,因爲我的問題是與消毒劑輸出沒有任何幫助。

+2

那麼你知道他們對未定義行爲的看法。 –

+0

是的 - 但不是應該幫助診斷UB的工具嗎?而不只是說'''嘿!有一些UB''' – onqtam

+2

嗯,該工具注入代碼到可執行文件中。 「未定義的行爲」可能會使UBSan停止工作,這並不令人感到意外。我相信你有正當的理由,但我也注意到你禁用了很多警告,這些警告對於捕捉UB(使用你的編譯指示)很有用。 –

回答

1

我也使建立鏗鏘3.5/3.6/3.7/3.8和原來鐺3.5的工作方式......然而

鐺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 

鐺3.7和3.8給出3.6

我使用libstdc++所以我會切換到libc++以儘可能消除這種誤差相同的輸出(我認爲這是不是從我的代碼!)

我在一個std::set<>裏面使用了一個簡單的TestData結構...