【发布时间】:2011-03-20 14:41:48
【问题描述】:
我正在尝试消除一些编译器警告,这些警告说 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,哈哈)。 string::c_str() 函数返回一个指向不可修改数据的指针,所以我不能只设置 extStr 等于它。 (而且我什至不确定 c_str() 指针是否需要稍后调用它?它是否使用“new”分配空间?)
对这些东西有什么建议吗? 这是一个不属于我的 10,000 行文件的一部分......所以我并不热衷于用 C++ 方式重写它。
【问题讨论】:
-
您可能应该提及您使用的操作系统、编程环境和编译器。
-
如果是 win32/visual studio - 编译器警告甚至会告诉你如何关闭它们。
-
10,000 行代码在一个文件中?我建议重构,然后担心清理警告。
-
@Sam Miller:“我建议重构” 虽然重构在理论上是好的,但项目可能存在时间限制。此外,当您修改代码时,总会有机会引入错误。程序员的目标是做最少的工作,解决最多的问题并获得最高的报酬。重构不合格。我参与了一些大型可怕的书面项目。在我重写了每个的 25% 之后,我决定除非它增加我的付款,否则它是不值得的。重构可能会引入新的错误,并不能解决现有问题,只会让一切“看起来”更好。
-
@J. Chomel 我认为我的编辑符合 OP 的初衷,因为 VS2010 是当时的最新版本,他的“目标”是克服这个警告(现在是一个错误),保持这个问题特定于VS 2010,当它是一个简单的编辑使其对 VS 2010 和 VS2013+ 有用时?如果不是,您认为 VS2010 和 VS2013+ 之间的差异是否值得提出一个新问题?
标签: c++ windows visual-studio debugging