使用std复制功能时,我收到警告。
我声明了一个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);
}
我得到的警告是 警告C4996:'std :: copy':带参数的函数调用 这可能不安全 - 此调用依赖于调用者来检查传递的内容 价值是正确的。
一种可能的解决方案是通过使用-D_SCL_SECURE_NO_WARNINGS来禁用此警告。嗯,这就是我正在研究的。
但是,我不确定这是否意味着我的代码真的不安全而且我实际上需要做一些检查?
答案 0 :(得分:9)
C4996表示您正在使用标记为__declspec(deprecated)
的函数。可能使用D_SCL_SECURE_NO_WARNINGS只会#ifdef弃用。您可以去读头文件以确定。
但问题是为什么它被弃用了? MSDN似乎没有在std :: copy()页面上说出任何关于它的内容,但我可能会看错了。通常,这是在XPSP2的高安全性推动期间针对所有“不安全的字符串操作函数”完成的。由于您没有将目标缓冲区的长度传递给std :: copy,如果您尝试向其写入太多数据,它将很乐意写入缓冲区的末尾。
要说明您的使用是否不安全,我们需要审核您的整个代码。通常,当他们以这种方式弃用函数时,他们建议使用更安全的版本。你可以用其他方式复制字符串。 This article似乎深入人心。他们似乎暗示你应该使用std :: checked_array_iterator而不是常规的OutputIterator。
类似的东西:
stdext::checked_array_iterator<char *> chkd_test_array(tstArray, length);
std::copy(ratedArray15, ratedArray15+length, chkd_test_array);
(如果我理解你的代码是正确的。)
答案 1 :(得分:4)
基本上,此警告告诉您的是,您必须绝对确定tstArray
指向一个足以容纳“length”元素的数组,因为std::copy
不会检查它。
答案 2 :(得分:1)
好吧,我认为微软单方面弃用stdlib还包括将char*
传递给std::copy
。 (他们实际上已经搞乱了一系列功能。)
我认为它的一部分有一些优点(fopen()
触及全局ERRNO
,因此它不是线程安全的)但其他决定似乎不太合理。 (我会说他们在整个事情上花了太大的时间。应该有级别,例如非线程安全,不可检查等)
如果你想知道每个案例的问题,我建议你阅读每个函数的MS-doc,但是很好地记录为什么每个函数都有这个警告,并且原因通常在每种情况下都不同。
答案 3 :(得分:-1)
至少VC ++ 2010 RC似乎没有在默认警告级别发出警告。