2011-05-23 15 views
5

_SECURE_SCL और _HAS_ITERATOR_DEBUGGING के बीच संबंध क्या है। क्या सीमा जांच को चालू/बंद करना और बाइनरी संगतता को संरक्षित करना संभव है?विजुअल स्टूडियो डीबग इटरेटर

2008 और 2010 के संस्करणों के बीच कोई अंतर?

+2

चैनल 9 के स्टीफन टी। Lavavej इस बारे में एक व्याख्यान बहुत पहले नहीं किया था। सुनिश्चित नहीं है कि यह आपके प्रश्न का उत्तर देता है, लेकिन यह आपके लिए दिलचस्प नहीं हो सकता है। http://channel9.msdn.com/Shows/Going+Deep/C9- व्याख्याएं- स्टीफन- टी- लैववेज- उन्नत- STL-3-of-n –

+0

@ बेंजामिन: यह पहली बात थी जो सीधे दिमाग में आई थी _SECURE_STL और _HAS_ITERATOR_DEBUGGING पढ़ने के बाद। :) – Xeo

उत्तर

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 एक प्रोग्राम को समाप्त कर देगा जो को एक वेक्टर इटरेटर के साथ एक ढेर ओवररन करता है।

एमएसडीएन दस्तावेज़ीकरण द्वारा समझाया गया सभी। इस के पीछे की कहानी दिलचस्प है। _HAS_ITERATOR_DEBUGGING कार्यक्षमता Dinkumware, कंपनी दृश्य स्टूडियो में शामिल करने के लिए स्टैंडर्ड लाइब्रेरी के उनके सबसे विजयी कार्यान्वयन लाइसेंस कि द्वारा प्रदान किया गया। विंडोज़ पर चल रहे प्रोग्राम की सुरक्षा में सुधार के लिए _SECURE_SCL कार्यक्षमता माइक्रोसॉफ्ट, द्वारा जोड़ा गया था। अपने चेक करने के लिए, _HAS_ITERATOR_DEBUGGING और _SECURE_SCL बनाने में इटरेटर में अतिरिक्त डेटा सदस्य होते हैं, जैसे पॉइंटर्स उनके मूल कंटेनर में। _HAS_ITERATOR_DEBUGGING, क्योंकि यह डिफ़ॉल्ट रूप से डिबग मोड में (रिलीज़ मोड में प्राप्य नहीं और) सक्षम है, यह भी अकेले जुड़ा हुआ सूचियों कि कंटेनर उनके iterators के सभी का उल्लेख करने की अनुमति बनाता है। यह महंगा प्रदर्शन-वार है, लेकिन प्रदर्शन डीबग मोड में महत्वपूर्ण नहीं है, और यह उत्कृष्ट चेक सक्षम करता है।

_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 व्यवहार और एसटीएल कंटेनरों के अभ्यावेदन और iterators बदल जाते हैं।वीसी 9 (विजुअल स्टूडियो 2008) एसटीएल कंटेनर और इटरेटर्स का प्रतिनिधित्व भी दृढ़ता से _SECURE_SCL और _HAS_ITERATOR_DEBUGGING पर निर्भर करता है (यह एक अनुरूपता बग को ठीक करने के लिए किया गया था)।

क्योंकि इन मैक्रो एसटीएल वस्तुओं की अभ्यावेदन बदलते हैं, तो कुछ नियमों का पालन करना चाहिए जब उनके चूक से इन मैक्रो बदलते। http://blogs.msdn.com/vcblog/archive/2007/08/10/the-future-of-the-c-language.aspx#4617984 संक्षेप में, मैक्रो प्रत्येक बाइनरी (EXE या DLL) के भीतर अनुरूप होना चाहिए, और इसके अलावा, बाइनरी कि एक दूसरे को चाहिए करने के लिए पास एसटीएल वस्तुओं संगत मैक्रो सेटिंग है: मैं नियम यहाँ का वर्णन किया। आपका उदाहरण एक EXE और DLL के बीच एक वेक्टर गुजर खुद को शामिल है, इसलिए EXE और DLL जरूरत ही _SECURE_SCL और _HAS_ITERATOR_DEBUGGING सेटिंग है।

ये नियम वीसी 8, वीसी 9, और सभी भविष्य के संस्करणों पर लागू होते हैं। आपका कोड वीसी 8 (विजुअल स्टूडियो 2005), के साथ काम करता है लेकिन अगर यह जटिल चीजें करता है तो असफल हो जाएगा।

+0

शायद _ITERATOR_DEBUGLEVEL पर एक स्पष्टीकरण जोड़ें, जो वीएस -2010 में नया है। – Xeo

+2

इस उत्तर में आने वाले किसी भी व्यक्ति के लिए बस FYI: जैसा कि ध्यान दिया गया है, वीएस -2010 में चेक किए गए इटरेटर्स को रिलीज़ मोड में अक्षम कर दिया गया था, लेकिन फिर वीएस2012 में वे फिर से सक्षम हो गए, और वीएस2013 में फिर से अक्षम कर दिया गया। निश्चित रूप से स्पष्ट मिश्रित भावनाओं का यकीन नहीं है। – Miral

संबंधित मुद्दे