簡體   English   中英

Visual Studio 調試迭代器

[英]Visual Studio debug iterators

_SECURE_SCL_HAS_ITERATOR_DEBUGGING之間有什么關系。 是否可以打開/關閉范圍檢查並保持二進制兼容性?

2008版和2010版有區別嗎?

Stephan 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 文檔解釋。 這背后的故事很有趣。 _HAS_ITERATOR_DEBUGGING 功能由 Dinkumware 提供,該公司授權他們最成功的標准庫實現以包含在 Visual Studio 中。 _SECURE_SCL 功能由 Microsoft 添加,以提高在 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) 一起使用,但如果它執行更復雜的事情就會失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM