2016-08-02 31 views
4

Xcode 7允許使用地址清理器來查找C/C++中的內存問題。爲什麼Xcode在創建地址清理版本時定義_LIBCPP_HAS_NO_ASAN?

https://github.com/google/sanitizers/wiki/AddressSanitizer

上地址車削消毒劑通過編譯和鏈接器標記-fsanitize=address並且還定義_LIBCPP_HAS_NO_ASAN

當從命令行構建我的庫並在未定義_LIBCPP_HAS_NO_ASAN的消毒版本上運行測試時,我看到非重複的地址清理器報告的內存訪問問題。正如Xcode所定義的那樣,定義_LIBCPP_HAS_NO_ASAN可以消除衛生消毒劑的問題,但我很好奇它爲什麼需要這樣做。

爲什麼我需要用AppleClang7定義_LIBCPP_HAS_NO_ASAN以避免在libcxx中出現內存訪問問題?

+1

你確定它正在定義'_LIBCXX_HAS_NO_ASAN'嗎? 所有libC++指定的標誌都以「_LIBCPP」開頭(不是CXX) –

+0

它是_LIBCPP_HAS_NO_ASAN。謝謝馬歇爾。問題已更新。 – jbcoe

回答

2

從肖恩·麥克布賴德(誰不是StackOverflow上)存在已知問題與虛假的記憶出界外的錯誤當混合儀表和非改動的代碼討論:

從安娜·扎克斯上http://lists.apple.com/archives/xcode-users/2016/Jan/msg00077.html

「通常,不需要重新編譯鏈接到已清理代碼中的任何代碼。」如果libC++容器從檢測到的(用ASan重建)到未檢測到的代碼交叉,Address Sanitizer可能會報告容器溢出,但是,在C++容器溢出檢查中有一個角落案例, (想象兩個庫,都使用相同的std :: vector,只有其中一個被檢測到,來自非檢測模塊的push_back不會將新添加的元素的內存標記爲有效。代碼,會觸發誤報)。「

我希望這個問題可以幫助別人,因爲這個問題已經消耗了相當多的時間。牙山很棒,但這個信息很難找到。

相關問題