未定義的符號是一個實現清潔劑檢查的功能。如果你看一下生成的代碼:
沒有消毒:
_Z3foof: # @_Z3foof
.cfi_startproc
# BB#0:
xorps %xmm1, %xmm1
divss %xmm1, %xmm0
ret
帶消毒:
_Z3foof: # @_Z3foof
.cfi_startproc
.long 1413876459 # 0x54460aeb
.quad _ZTIFffE
# BB#0:
pushq %rax
.Ltmp1:
.cfi_def_cfa_offset 16
movss %xmm0, 4(%rsp) # 4-byte Spill
movd %xmm0, %esi
movl $__unnamed_1, %edi
xorl %edx, %edx
callq __ubsan_handle_divrem_overflow
xorps %xmm1, %xmm1
movss 4(%rsp), %xmm0 # 4-byte Reload
divss %xmm1, %xmm0
popq %rax
ret
你看它添加的代碼做使用該功能的檢查。
編譯器應在適當的消毒庫自動鏈接,然後我下面的完整的程序:
float foo(float f) { return (f/0); }
int main() {
foo(1.0f);
}
可生產執行時的輸出如下:我建
main.cpp:1:32: runtime error: division by zero
,並使用跑指令clang++ -fsanitize=undefined main.cpp && ./a.out
如果您希望編譯時檢查您希望啓用更多編譯器警告或靜態分析器。但是,似乎沒有任何警告或靜態分析檢查浮點除零錯誤。
下面是產生一個分析報告的程序:
#include <malloc.h>
int main() {
int *i = (int*) malloc(sizeof(int));
}
與clang++ -std=c++11 main.cpp
編譯它不產生任何診斷,但clang++ -std=c++11 --analyze main.cpp
編譯它報告如下:
main.cpp:4:10: warning: Value stored to 'i' during its initialization is never read
int *i = (int*) malloc(sizeof(int));
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:5:1: warning: Potential leak of memory pointed to by 'i'
}
^
死者店也可以用-Weverything [-Wunused-value]檢測到,但泄漏只能由分析儀檢測到。
默認全分析結果寫入plist文件。你也可以用下面的命令運行分析:
clang++ --analyze -Xanalyzer -analyzer-output=text main.cpp
clang++ --analyze -Xanalyzer -analyzer-output=html -o html-dir main.cpp
要獲得的檢測問題進行了詳細穿行在標準輸出或通過分別的註釋的源代碼的HTML顯示,而不是在plist中。
分析儀檢查列表here。
請注意,要使分析儀最好地工作,需要分析整個程序,這意味着它需要連接到構建系統。通常的界面是通過IDE(Xcode)或者帶有make的scan-build
工具。 CMake有一些鏗鏘聲的功能,比如產生叮聲號JSON compilation database files,但如果CMake內置了對鐺分析器的內置支持,我不確定。
您應該將您的程序鏈接到可執行文件並運行它。消毒劑是運行時間的工具。 – osgx
@osgx有趣的是,在我發現沒有人編譯過的文檔中,運行帶有'main'函數的東西......所以我開始意識到這是編譯時工具。 – user2485710
user2485710,哪些文檔?鏗鏘的手冊說:http://clang.llvm.org/docs/UsersManual.html「控制代碼生成... -fsanitize = ...打開**運行時檢查**各種形式的未定義或可疑的行爲...如果檢查失敗,在運行時會產生一個診斷消息來解釋問題。「 – osgx