2009-05-24 22 views
14

Got một số mã đó không phải là mỏ và sản xuất atm cảnh báo này của mình:Lỗi trình biên dịch: Cuộc gọi hàm với các tham số mà bạn có thể không an toàn

iehtmlwin.cpp(264) : warning C4996: 'std::basic_string<_Elem,_Traits,_Ax>::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' 
     with 
     [ 
      _Elem=char, 
      _Traits=std::char_traits<char>, 
      _Ax=std::allocator<char> 
     ] 
     c:\program files (x86)\microsoft visual studio 8\vc\include\xstring(1680) : see declaration of 'std::basic_string<_Elem,_Traits,_Ax>::copy' 
     with 
     [ 
      _Elem=char, 
      _Traits=std::char_traits<char>, 
      _Ax=std::allocator<char> 
     ] 

đây là mã trong câu hỏi:

HRESULT STDMETHODCALLTYPE Read(void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbRead) 
    { 
     if (prepend.size() > 0) 
     { 
      int n = min(prepend.size(), cb); 
      prepend.copy((char *) pv, n); 
      prepend = prepend.substr(n); 
      if (pcbRead) 
       *pcbRead = n; 

      return S_OK; 
     }; 

     int rc = Read((char *) pv, cb); 
     if (pcbRead) 
      *pcbRead = rc; 

     return S_OK; 
    }; 

và cảnh báo đề cập đến dòng prepend.copy. Tôi đã thử googling cảnh báo nhưng không thể làm việc ra những gì nó là về về. Có thể một số giúp tôi giải quyết điều này.

Visual Studio 2005 SP1 Windows 7 RC1

.

Edit: thêm vào trước là một chuỗi được typedefed

typedef basic_string<char, char_traits<char>, allocator<char> > string; 

Trả lời

10

Cảnh báo cho bạn biết rằng bạn có nguy cơ bị tràn bộ đệm nếu n quá lớn - điều bạn biết không thể xảy ra do cách bạn chỉ tính với min, nhưng trình thu thập thông tin không đúng. Tôi đề nghị bạn lấy lời khuyên riêng của trình biên dịch và use -D_SCL_SECURE_NO_WARNINGS cho một tệp nguồn này ...

+4

tôi đã kết thúc bằng cảnh báo #pragma (tắt: 4996) vì bộ tiền xử lý xác định không hoạt động – Lodle

+0

@alex - không yêu cầu 'n' của nó là [tiềm năng] quá lớn. Bạn đang được cảnh báo về việc sử dụng một hàm nhận con trỏ đích mà không có kích thước đích. Đối với những gì giá trị của nó, xác định D_SCL_SECURE_NO_WARNINGS để ngăn chặn cảnh báo là một ý tưởng tồi. – jww

+1

@Lodle - Odd, cảnh báo 'pragma (disable: 4996)' không hoạt động với tôi trong VS2010; thêm '_SCL_SECURE_NO_WARNINGS' vào các định nghĩa cho từng tệp riêng lẻ (và mỗi bản dựng riêng biệt) dường như thực hiện thủ thuật. –

6

Kiểm tra trang MSDN này cho các tài liệu trên cảnh báo

CáC++ biên dịch MS C quyết định không chấp phương thức std :: string :: copy vì nó có khả năng không an toàn để sử dụng và có thể dẫn đến tràn bộ đệm. Việc ngừng sử dụng này là Microsoft cụ thể và bạn có thể sẽ không thấy nó trên các nền tảng trình biên dịch khác.

+1

vì vậy có an toàn để vô hiệu hóa nó không? Tôi đang sử dụng tăng odeint để giải phương trình vi phân và lỗi này bật lên. Tôi đang sử dụng visual studio 2013. Tôi đã sử dụng cảnh báo '#pragma (disable: 4996)' và mã đang hoạt động nhưng không chắc chắn nếu điều này là an toàn. Cảm ơn – CroCo

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