2009-08-19 45 views
42

Tôi có một C đơn giản ++ với Boost như thế này:C++ Boost: nguyên nhân của cảnh báo này là gì?

#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(" ")); 

này hoạt động tốt; nó thay thế tất cả các lần xuất hiện của(), với một ""

Tuy nhiên, tôi nhận được cảnh báo này khi biên dịch:

Tôi đang sử dụng MSVC 2008, Tăng 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>  ] 

tôi chắc chắn có thể vô hiệu hóa các cảnh báo bằng

-D_SCL_SECURE_NO_WARNINGS 

nhưng tôi một chút miễn cưỡng để làm điều đó trước khi tôi tìm hiểu những gì sai, hay quan trọng hơn nếu mã của tôi là không chính xác.

Trả lời

50

Không có gì phải lo lắng. Trong vài bản phát hành cuối cùng của MSVC, họ đã đi vào chế độ an toàn-hoang tưởng hoàn toàn. std::copy đưa ra cảnh báo này khi được sử dụng với con trỏ thô, vì khi được sử dụng không chính xác, điều này có thể dẫn đến tràn bộ đệm.

Thực hiện trình vòng lặp của họ thực hiện kiểm tra giới hạn để đảm bảo điều này không xảy ra, với chi phí hiệu suất đáng kể.

Vì vậy, vui lòng bỏ qua cảnh báo. Nó không có nghĩa là có gì sai với mã của bạn. Nó chỉ là nói rằng nếu có cái gì đó sai với mã của bạn, sau đó những điều xấu sẽ xảy ra. Đó là một điều kỳ lạ để đưa ra cảnh báo. ;)

+20

Cảnh báo này làm tôi phát điên, giống như "cảnh báo" về nội dung của một tách cà phê nóng. – Clay

+7

điều tồi tệ nhất về nó là không có "sửa chữa" lành mạnh. Hầu hết các cảnh báo được ban hành vì có một cách tốt hơn, ít bị lỗi hơn để đạt được điều tương tự. Chúng có thể được * cố định *. Bạn phải làm gì với cái này? Nếu bạn có một mảng C nguyên và bạn cần phải sao chép dữ liệu đến hoặc từ nó, con trỏ là kiểu duy nhất của trình lặp có sẵn. std :: copy là một lựa chọn an toàn nhất để sử dụng. Hay là họ gợi ý chúng ta quay trở lại bằng văn bản cho các vòng để đạt được điều tương tự? – jalf

+0

Tôi đặt cược 100 đại diện rằng nó sẽ bị xóa trong SP đầu tiên cùng với người khác "họ không kiểm tra những gì họ phát hành?" vấn đề ... –

8

Cảnh báo đến từ thư viện "an toàn" của Visual Studio không kiểm tra giới thiệu bắt đầu bằng MSVC 8.0. Microsoft đã xác định các API "có khả năng gây nguy hiểm" và đã đưa ra các cảnh báo ngăn cản việc sử dụng chúng. Trong khi nó là kỹ thuật có thể gọi std :: sao chép một cách không an toàn, 1) nhận được cảnh báo này không có nghĩa là bạn đang làm như vậy, và 2) bằng cách sử dụng std :: bản sao như bạn thường không phải là nguy hiểm.

23

Bạn cũng có thể vô hiệu hóa cảnh báo này trong tiêu đề cụ thể:

#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

Không nhất thiết; ví dụ: tiêu đề , trong đó có triển khai std :: bản sao được đánh dấu là không được chấp nhận và sử dụng cảnh báo này, có cảnh báo #pragma (đẩy, 3) ở trên cùng, khiến trình biên dịch ghi đè cài đặt cảnh báo của bạn bằng Cấp 3 mặc định. – neuviemeporte

17

Nếu bạn cảm thấy an toàn về việc vô hiệu hóa lỗi này:

  • Đến các thuộc tính của C++ Dự án
  • Mở rộng " C/C++ "
  • Đánh dấu" Dòng lệnh "
  • Trong" Tùy chọn bổ sung ", thêm phần sau để bất kỳ văn bản mà có thể trong hộp

"-D_SCL_SECURE_NO_WARNINGS"

+2

Hãy nhớ rằng ngay cả khi bạn chắc chắn rằng mã hiện tại của bạn là an toàn, cuối cùng bạn có thể mã một cái gì đó không an toàn và bạn sẽ không được cảnh báo về nó. – Bluebaron

+2

Có, nhưng trong trường hợp này nó giống như nói rằng, "Hãy cầm ô của bạn, nó có thể mưa ngày hôm nay." Được nói rằng mỗi ngày không hữu ích vì nó không cung cấp thông tin, ngay cả trong ý nghĩa Shannon. Cuối cùng, nó sẽ mưa và bạn sẽ được cảnh báo để lấy chiếc ô của bạn. Nếu cảnh báo là, "Trạm thời tiết dự đoán mưa hôm nay 80% cơ hội, lấy ô của bạn," sau đó đó là hữu ích vì nó cung cấp thông tin. –

+5

một trình dọn dẹp nhỏ hơn: thêm "_SCL_SECURE_NO_WARNINGS" trong các định nghĩa tiền xử lý (cũng thuộc danh mục "C/C++") –

0
  • Đến các thuộc tính của C++ Dự án

  • Mở rộng "C/C++"

  • Nâng cao: Vô hiệu hóa Cảnh báo Cụ thể:

Các vấn đề liên quan