English 中文(简体)
使用std::copy时出现问题。
原标题:Issue with using std::copy
  • 时间:2010-02-23 21:34:38
  •  标签:
  • c++
  • stl

我在使用std copy函数时收到了警告。

我有一个我声明的byte数组。

byte *tstArray = new byte[length];

然后我有另外一些声明并使用一些十六进制值初始化的字节数组,我想根据一些初始用户输入来使用它们。

我有一系列if语句,基本上用于解析原始输入,根据某些字符串,选择要使用的字节数组,并在此过程中将结果复制到原始tstArray中。

例如:

if(substr1 == "15")
{
   std::cout<<"Using byte array rated 15"<<std::endl;
   std::copy(ratedArray15,ratedArray15+length,tstArray);
} 

The warning i get is 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.

一个可能的解决方案是使用-D_SCL_SECURE_NO_WARNINGS来禁用此警告,我正在研究这个。

但是,我不确定这是否意味着我的代码真的不安全,我实际上需要进行一些检查?

最佳回答

C4996表示你正在使用标记为__declspec (deprecated)的函数。 可能使用D_SCL_SECURE_NO_WARNINGS将只是#ifdef消除了弃用。 你可以去读头文件来确定。

但问题是为什么已被弃用?MSDN 在 std::copy() 页面上似乎没有任何说明,但我可能查看了错误的页面。通常,在 XPSP2 的巨大安全推动期间,所有“不安全字符串操作函数”都会被弃用。由于您没有将目标缓冲区的长度传递给 std::copy,如果尝试向其中写入过多数据,它将愉快地写入缓冲区的末尾。

如果要确定您的使用是否不安全,我们需要回顾您的整个代码。通常,当以这种方式弃用函数时,他们会推荐更安全的版本。您可以以其他方式复制字符串。这篇文章似乎深入探讨了此问题。他们似乎在暗示您应该使用std :: checked_array_iterator,而不是常规的OutputIterator。

类似于:

stdext::checked_array_iterator<char *> chkd_test_array(tstArray, length);
std::copy(ratedArray15, ratedArray15+length, chkd_test_array);

如果我理解你的代码正确的话。

问题回答

基本上,这个警告告诉你的是,你必须非常确定 tstArray 指向的数组足够大,可以容纳"length"个元素,因为 std::copy 没有检查这一点。

嗯,我认为微软单方面弃用stdlib也包括将传递给。(实际上,他们搞乱了整个函数范围。)

我认为它的部分内容具有一定的价值(fopen() 接触了全局 ERRNO,因此不支持多线程),但其他决策似乎不是很合理(我想他们对整个事情的影响过于大。应该有不同的等级,比如不支持多线程、无法检查等)。

我建议阅读有关每个函数的MS-doc,如果您想了解每种情况的问题,尽管每个函数为什么有警告已经相当好地记录下来了,但通常每种情况的原因都不同。

至少目前看起来,VC++ 2010 RC在默认警告级别下未发出该警告。





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签