我试图消除一些编译器警告,这些警告说strcpy、sprintf等等是不安全的。我明白它们为什么不安全,但我想不出用C++风格修复代码的好方法。
下面是代码的摘录:
extList->names[i]=(char *)malloc(length*sizeof(char));
strcpy(extList->names[i],extName); // unsafe
// strncpy(extList->names[i],extName,length); // also unsafe这是一个信息:
C4996:'strcpy':这个函数或变量可能不安全。考虑使用strcpy_s代替。若要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS。有关详细信息,请参阅联机帮助。
在不知道要复制的内容的长度的情况下,我想不出在C++中复制数据的安全方法。我知道有strlen(),但这也是不安全的,因为它假设(可能是错误的)数据是空终止的。
另外:
// used to concatenate:
sprintf(extStr,"%s%s",platExtStr,glExtStr);C4996:'sprintf':这个函数或变量可能不安全。考虑使用sprintf_s代替。若要禁用弃用,请使用_CRT_SECURE_NO_WARNINGS。有关详细信息,请参阅联机帮助。
使用std::string连接是非常容易的,但是我需要以某种方式将数据输入extStr (而不是使用strcpy,lol)。string::c_str()函数返回指向不可修改数据的指针,因此我不能将extStr设置为等于它。(我甚至不确定c_str()指针是否需要稍后对它进行删除调用?它是否使用“new”分配空间?)
对这件事有什么建议吗?这是一个不是我的1万行文件的一部分.所以我并不热衷于用C++的方式重写这个东西。
发布于 2010-07-24 22:17:03
你真的不需要语用来禁用它们。
对于win32 32/msvc,在ProjectProperties ->配置属性-> C/C++ ->预处理器->预处理器定义中,添加以下宏:
_CRT_SECURE_NO_DEPRECATE
_CRT_NONSTDC_NO_DEPRECATE或者您可以在命令行参数(-D_CRT_SECURE_NO_DEPRECATE)中传递这些命令。您可能可以在某些*.cpp文件的开头定义它们。而且,可能还有更多的(参见crtdefs.h -看起来有很多.)。这类警告通常告诉您可以使用哪些宏禁用它们--只需读取编译器输出即可。
发布于 2012-11-20 10:04:42
这是对这个问题的另一个回答。
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4996)
#endif
strcpy(destination, source);
#ifdef _MSC_VER
#pragma warning(pop)
#endif发布于 2012-04-30 15:44:54
如果只消除警告是你的目标..。只需定义这个_CRT_SECURE_NO_WARNINGS,它就会抑制所有的弃用警告。但这不会解决不安全的CRT函数的根本问题。
如果您使用的是visual版本的>= 2005,并且希望以适当的方式修复这些警告.最简单的方法是在项目中使用#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1和#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1。
如果没有任何进一步的代码更改,您可以观察到大多数警告都是自动修复的。通过定义此窗口,窗口将自动调用大多数不安全的CRT函数的安全重载函数。静态数组的缓冲区大小是自动计算的。
虽然动态分配的缓冲区不是通过这种方式修复的,但是我们需要手动修复它们。详情请参阅此链接。
下面是一种通过编程更正示例的方法
strcpy_s(extList->names[i], length, extName); https://stackoverflow.com/questions/3327000
复制相似问题