2009-08-19 20 views
42

मैं एक साधारण सी ++ बूस्ट के साथ इस तरह है:सी ++ बूस्ट: इस चेतावनी का कारण क्या है?

#include <boost/algorithm/string.hpp> 

int main() 
{ 
    std::string latlonStr = "hello,ergr()()rg(rg)"; 
    boost::find_format_all(latlonStr,boost::token_finder(boost::is_any_of("(,)")),boost::const_formatter(" ")); 

यह ठीक काम करता है; यह एक ""

के साथ) की प्रत्येक पुनरावृत्ति (बदलता है, हालांकि, मैं इस चेतावनी जब संकलन मिलती है:

मैं MSVC 2008 का उपयोग कर रहा हूँ, 1.37.0 बढ़ावा।

1>Compiling... 
1>mainTest.cpp 
1>c:\work\minescout-feat-000\extlib\boost\algorithm\string\detail\classification.hpp(102) : warning C4996: 'std::copy': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators' 
1>  c:\program files (x86)\microsoft visual studio 9.0\vc\include\xutility(2576) : see declaration of 'std::copy' 
1>  c:\work\minescout-feat-000\extlib\boost\algorithm\string\classification.hpp(206) : see reference to function template instantiation 'boost::algorithm::detail::is_any_ofF<CharT>::is_any_ofF<boost::iterator_range<IteratorT>>(const RangeT &)' being compiled 
1>  with 
1>  [ 
1>   CharT=char, 
1>   IteratorT=const char *, 
1>   RangeT=boost::iterator_range<const char *> 
1>  ] 
1>  c:\work\minescout-feat-000\minescouttest\maintest.cpp(257) : see reference to function template instantiation 'boost::algorithm::detail::is_any_ofF<CharT> boost::algorithm::is_any_of<const char[4]>(RangeT (&))' being compiled 
1>  with 
1>  [ 
1>   CharT=char, 
1>   RangeT=const char [4] 
1>  ] 

मैं निश्चित रूप से चेतावनी

-D_SCL_SECURE_NO_WARNINGS 

का उपयोग कर अक्षम कर सकते हैं, लेकिन मैं थोड़ा कि मेरे कोड गलत है, तो इससे पहले कि मैं क्या गलत है, या अधिक महत्वपूर्ण बात यह है यह पता लगाना करने के लिए अनिच्छुक हूँ।

उत्तर

50

इसके बारे में चिंता करने की कोई बात नहीं है। एमएसवीसी की आखिरी कुछ रिलीज में, वे पूर्ण सुरक्षा-परावर्तक मोड में चले गए हैं। std::copy कच्चे पॉइंटर्स के साथ उपयोग होने पर इस चेतावनी को जारी करता है, क्योंकि गलत तरीके से का उपयोग करते समय, इसका परिणाम बफर ओवरफ़्लो हो सकता है।

उनके पुनरावर्तक कार्यान्वयन यह सुनिश्चित करने के लिए सीमा शुल्क जांच करता है कि यह महत्वपूर्ण प्रदर्शन लागत पर नहीं होता है।

तो चेतावनी को अनदेखा करने के लिए स्वतंत्र महसूस करें। इसका मतलब यह नहीं है कि आपके कोड में कुछ भी गलत है। यह सिर्फ इतना कह रहा है कि यदि आपके कोड में कुछ गड़बड़ है, तो बुरी चीजें घटित होंगी। चेतावनियां जारी करने के लिए एक अजीब चीज कौन सा है। ;)

+20

यह चेतावनी मुझे नट्स चलाती है, इसकी एक कॉफी कॉफी की सामग्री के बारे में "चेतावनी" की तरह गर्म होती है। – Clay

+7

इसके बारे में सबसे बुरी चीज यह है कि कोई भी "फिक्स" नहीं है। अधिकांश चेतावनियां जारी की जाती हैं क्योंकि एक ही चीज़ को प्राप्त करने के लिए एक बेहतर, कम त्रुटि-प्रवण तरीका होता है। वे * निश्चित * हो सकते हैं। आपको इस बारे में क्या करना चाहिए? यदि आपके पास कच्ची सी सरणी है और आपको डेटा को प्रतिलिपि बनाने की आवश्यकता है, तो पॉइंटर्स केवल इटरेटर उपलब्ध हैं। std :: प्रतिलिपि अब तक का सबसे सुरक्षित विकल्प उपयोग करने के लिए है। या क्या वे सुझाव दे रहे हैं कि हम एक ही चीज़ को प्राप्त करने के लिए लूप के लिए लिखने के लिए वापस जाएं? – jalf

+0

मैं 100 प्रतिनिधि शर्त लगाता हूं कि इसे पहले एसपी में दूसरे के साथ हटा दिया जाएगा "क्या वे परीक्षण नहीं करते हैं?" मुद्दों ... –

8

चेतावनी विजुअल स्टूडियो के गैर-मानक "सुरक्षित" लाइब्रेरी चेक से मिली है जो एमएसवीसी 8.0 से शुरू हुई है। माइक्रोसॉफ्ट ने "संभावित खतरनाक" एपीआई की पहचान की है और उनके उपयोग को हतोत्साहित करने वाली चेतावनियों को इंजेक्शन दिया है। हालांकि यह एक असुरक्षित तरीके से std :: प्रतिलिपि को कॉल करना तकनीकी रूप से संभव है, 1) इस चेतावनी को प्राप्त करने का मतलब यह नहीं है कि आप ऐसा कर रहे हैं, और 2) std :: प्रतिलिपि का उपयोग करते हुए सामान्य रूप से खतरनाक नहीं होना चाहिए।

23

आप विशिष्ट हेडर में इस चेतावनी को निष्क्रिय कर सकते हैं:

#if defined(_MSC_VER) && _MSC_VER >= 1400 
#pragma warning(push) 
#pragma warning(disable:4996) 
#endif 

/* your code */ 

#if defined(_MSC_VER) && _MSC_VER >= 1400 
#pragma warning(pop) 
#endif 
+7

जरूरी नहीं है; उदाहरण के लिए हेडर , जिसमें बहिष्कृत के रूप में चिह्नित std :: प्रतिलिपि का कार्यान्वयन शामिल है और जिसका उपयोग इस चेतावनी को उत्पन्न करता है, में शीर्ष पर #pragma चेतावनी (पुश, 3) है, जिससे संकलक स्तर 3 के साथ आपकी चेतावनी सेटिंग्स को ओवरराइड कर देता है चूक। – neuviemeporte

17

इस त्रुटि अक्षम करने के बारे आप सुरक्षित महसूस करते हैं: अपने सी ++ परियोजना के गुणों

  • विस्तार करने के लिए

    • जाओ " सी/सी ++ "
    • " कमांड लाइन "हाइलाइट करें
    • " अतिरिक्त विकल्प "के तहत निम्नलिखित संलग्न करें किसी भी पाठ करने के लिए कि उस बॉक्स

    "-D_SCL_SECURE_NO_WARNINGS"

  • +2

    याद रखें कि भले ही आप सुनिश्चित हैं कि आपका वर्तमान कोड सुरक्षित है, फिर भी आप अंततः कुछ असुरक्षित कोड कर सकते हैं और आपको इसके बारे में चेतावनी नहीं दी जाएगी। – Bluebaron

    +2

    हां, लेकिन इस मामले में यह कहने जैसा है, "अपनी छाता ले लो, आज बारिश हो सकती है।" कहा जा रहा है कि हर दिन उपयोगी नहीं है क्योंकि यह शैनन भावना में भी कोई जानकारी प्रदान नहीं करता है। आखिरकार, बारिश होगी और आपको अपनी छतरी लेने के लिए चेतावनी दी जाएगी। अगर चेतावनी थी, "मौसम स्टेशन ने बारिश की भविष्यवाणी की 80% मौका, अपनी छाता ले लो," तो यह उपयोगी है क्योंकि यह जानकारी प्रदान करता है। –

    +5

    थोड़ा क्लीनर: प्रीप्रोसेसर परिभाषाओं के तहत "_SCL_SECURE_NO_WARNINGS" जोड़ें (जो "सी/सी ++" श्रेणी के अंतर्गत भी है) –

    0
    • अपने सी ++ परियोजना के गुणों पर जाएं में हो सकता है

    • "C/C++"

    • विस्तृत

      उन्नत: विशिष्ट चेतावनी अक्षम करें:

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