2009-08-19 42 views
42

我有一個簡單的C++與升壓像這樣:C++ Boost:這個警告的原因是什麼?

#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

這是沒有什麼可擔心的。在MSVC的前幾個版本中,他們已經進入了完全安全偏執狂模式。 std::copy與原始指針一起使用時會發出此警告,因爲使用不正確時,它可能導致緩衝區溢出。

他們的迭代器實現執行邊界檢查,以確保這種情況不會發生,並且性能成本很高。

因此,請隨時忽略警告。這並不意味着你的代碼有什麼問題。它只是說如果你的代碼出了問題,那麼壞事就會發生。 這是一個奇怪的事情發出警告。 ;)

+20

這個警告讓我發瘋,它就像一杯咖啡熱的「警告」。 – Clay 2009-08-19 17:20:02

+7

最糟糕的是沒有理智的「修復」。發佈大多數警告是因爲有更好的,更容易出錯的方式來實現相同的目的。他們可以*固定*。你應該怎麼做這件事?如果您有一個原始C數組,並且您需要將數據複製到其中或從中複製數據,則指針是唯一可用的迭代器類型。 std :: copy是迄今爲止使用的最安全的選項。還是他們建議我們回去寫循環來達到同樣的目的? – jalf 2009-08-19 17:58:38

+0

我敢打賭100代表,它會在第一個SP和其他「不測試他們發佈的東西嗎?」中被刪除。問題... – 2010-12-19 16:03:23

8

警告來自Visual Studio的非標準「安全」庫檢查,從MSVC 8.0開始引入。微軟已經確定了「潛在危險」的API,並注入了警告,勸阻他們使用。雖然在技術上可以以不安全的方式調用std :: copy,但是1)接收到這個警告並不意味着你這樣做了,2)像通常那樣使用std :: copy是沒有危險的。

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 :: copy的實現標記爲棄用且其用法產生此警告)在頂部具有#pragma警告(push,3),導致編譯器覆蓋級別3的警告設置默認值。 – neuviemeporte 2012-07-19 15:09:58

17

如果你覺得安全有關禁用此錯誤:

  • 轉到您的C++項目的屬性
  • 展開「 C/C++」
  • 高亮顯示 「命令行」
  • 在 「其他選項」 追加以下任何文字,可能是在該框中

「-D_SCL_SECURE_NO_WARNINGS」

+2

請記住,即使您確定您當前的代碼是安全的,您最終可能會編寫一些不安全的代碼,並且不會對此發出警告。 – Bluebaron 2011-10-25 13:19:55

+2

是的,但在這種情況下,就像說:「拿起你的雨傘,今天可能會下雨。」被告知每天都沒有用,因爲它沒有提供任何信息,即使在香農的意義上。最終,它會下雨,你會被警告拿你的雨傘。如果警告是「天氣預報今天降雨80%的機率,拿傘」,那麼這是有用的,因爲它提供的信息。 – 2012-02-26 19:16:48

+5

小小的清理工具:在預處理器定義下(也在「C/C++」類別下)添加「_SCL_SECURE_NO_WARNINGS」 – 2013-03-14 22:38:00

0
  • 轉到您的C++項目的屬性

  • 展開 「C/C++」

  • 高級功能:禁用特定警告: