加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用std :: copy的问题

发布时间:2020-12-16 04:55:54 所属栏目:百科 来源:网络整理
导读:我在使用std复制功能时收到警告. 我有一个我声明的字节数组. byte *tstArray = new byte[length]; 然后我有几个其他字节数组声明和初始化一些十六进制值,我想根据一些初始用户输入使用. 我有一系列if语句用于基本解析原始输入,并且基于某些字符串,我选择使用
我在使用std复制功能时收到警告.

我有一个我声明的字节数组.

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来禁用此警告.嗯,这就是我正在研究的内容.

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

解决方法

C4996表示您正在使用标记为__declspec(不建议使用)的函数.可能使用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,chkd_test_array);

(如果我理解你的代码是正确的.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读