2011-05-23 132 views
5

_SECURE_SCL_HAS_ITERATOR_DEBUGGING之間的關係是什麼。 是否可以打開/關閉範圍檢查並保持二進制兼容性?Visual Studio調試迭代器

2008年和2010年版本之間的任何區別?

+2

第9頻道的Stephen T. Lavavej在不久前做了一個演講。不確定它是否會回答你的問題,但對你而言可能很有趣。 http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Stephan-T-Lavavej-Advanced-STL-3-of-n – 2011-05-23 21:38:43

+0

@Benjamin:這是首先想到的,直接在閱讀_SECURE_STL和_HAS_ITERATOR_DEBUGGING之後。 :) – Xeo 2011-05-23 23:41:20

回答

7

斯蒂芬Lavavej已經提供了一些細節上的這個_SECURE_SCL_HAS_ITERATOR_DEBUGGING

http://blogs.msdn.com/b/vcblog/archive/2007/08/10/the-future-of-the-c-language.aspx

迭代器調試,通過 _HAS_ITERATOR_DEBUGGING啓用,執行有力的正確性驗證。 迭代器檢查,由 啓用_SECURE_SCL,執行最小檢查,作爲安全的最後一行 辯護。例如,_SECURE_SCL 將終止一個程序,該程序觸發 堆向量迭代器溢出。

所有這一切都由MSDN 文檔解釋。這個 背後的故事很有趣。 Dinkumware提供 _HAS_ITERATOR_DEBUGGING功能, 公司許可其最多 凱旋執行 標準庫,以包含在 Visual Studio中。 Microsoft增加了_SECURE_SCL 功能, 爲了提高在Windows上運行的 程序的安全性。爲了執行它們的檢查, 都使用 _HAS_ITERATOR_DEBUGGING和_SECURE_SCL使迭代器包含其他數據成員,例如 指向其父容器的指針。 _HAS_ITERATOR_DEBUGGING,因爲它在調試模式下默認啓用(並且 無法在發佈模式下獲得),所以 也會生成單向鏈接列表,允許 容器引用其所有 迭代器。這是昂貴的 性能明智,但性能是 在調試模式下不是關鍵,並且這個 使能優秀檢查。

_SECURE_SCL,因爲它在發佈模式下默認啓用,致力於 施加最小的性能損失。 因此,當它被啓用時, 儘管迭代器指向它們的容器的指針返回 ,容器不會有 指針指向它們的迭代器。 (更新「迭代器列表」太 耗時釋放模式。)

需要注意的是在VS 2010中開始,_SECURE_SCL不再默認情況下在釋放模式啓用(上面摘錄來自2007年)。

由於這個錯誤報告(http://connect.microsoft.com/VisualStudio/feedback/details/334315/has-iterator-debugging-0-causes-crash)中描述,這兩個_SECURE_SCL_HAS_ITERATOR_DEBUGGING影響ABI:

_SECURE_SCL和_HAS_ITERATOR_DEBUGGING顯著改變行爲和STL容器的 交涉和 迭代器。VC9(Visual Studio 2008) 使STL 容器和迭代器的表示更強烈地依賴於_SECURE_SCL和 _HAS_ITERATOR_DEBUGGING(這是爲了修復一致性錯誤)。

因爲這些宏改變STL對象的 表示,你 必須遵守一定的規則,當 從他們 默認改變這些宏。我在此描述了規則: http://blogs.msdn.com/vcblog/archive/2007/08/10/the-future-of-the-c-language.aspx#4617984總而言之,宏必須在每個二進制文件(EXE或 DLL)內保持一致,此外, 必須通過STL對象的二進制文件必須有 具有一致的宏設置。您的 示例涉及一個EXE和DLL 自身之間傳遞一個向量在 之間,因此EXE和DLL需要 具有相同的_SECURE_SCL和 _HAS_ITERATOR_DEBUGGING設置。

這些規則適用於VC8,VC9和所有 未來版本。你的代碼發生在 與VC8(Visual Studio 2005), 一起工作,但如果它做了更多複雜的事情,將會失敗。

+0

也許在VS2010中增加一個關於_ITERATOR_DEBUGLEVEL的解釋。 – Xeo 2011-05-23 23:42:24

+2

對於任何稍後訪問此答案的人員,只要給出FYI:如上所述,在VS2010中,選中的迭代器在發佈模式下被禁用,但隨後在VS2012中再次啓用,並在VS2013中再次禁用。不知道爲什麼表面複雜的感覺。 – Miral 2014-04-22 03:33:30