首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何消除Visual中的“不安全”警告/错误(strcpy、sprintf、strdup)

如何消除Visual中的“不安全”警告/错误(strcpy、sprintf、strdup)
EN

Stack Overflow用户
提问于 2010-07-24 21:31:05
回答 8查看 65.3K关注 0票数 25

我试图消除一些编译器警告,这些警告说strcpy、sprintf等等是不安全的。我明白它们为什么不安全,但我想不出用C++风格修复代码的好方法。

下面是代码的摘录:

代码语言:javascript
复制
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(),但这也是不安全的,因为它假设(可能是错误的)数据是空终止的。

另外:

代码语言:javascript
复制
// 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++的方式重写这个东西。

EN

回答 8

Stack Overflow用户

发布于 2010-07-24 22:17:03

你真的不需要语用来禁用它们。

对于win32 32/msvc,在ProjectProperties ->配置属性-> C/C++ ->预处理器->预处理器定义中,添加以下宏:

代码语言:javascript
复制
_CRT_SECURE_NO_DEPRECATE  
_CRT_NONSTDC_NO_DEPRECATE

或者您可以在命令行参数(-D_CRT_SECURE_NO_DEPRECATE)中传递这些命令。您可能可以在某些*.cpp文件的开头定义它们。而且,可能还有更多的(参见crtdefs.h -看起来有很多.)。这类警告通常告诉您可以使用哪些宏禁用它们--只需读取编译器输出即可。

票数 39
EN

Stack Overflow用户

发布于 2012-11-20 10:04:42

这是对这个问题的另一个回答。

代码语言:javascript
复制
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4996)
#endif

        strcpy(destination, source);

#ifdef _MSC_VER
#pragma warning(pop)
#endif
票数 10
EN

Stack Overflow用户

发布于 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函数的安全重载函数。静态数组的缓冲区大小是自动计算的。

虽然动态分配的缓冲区不是通过这种方式修复的,但是我们需要手动修复它们。详情请参阅此链接

下面是一种通过编程更正示例的方法

代码语言:javascript
复制
strcpy_s(extList->names[i], length, extName); 
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3327000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档