我正在 VS2010 中编写代码,我碰巧在编译后看到编译器对 strcpy 和 sprintf 调用发出 C4996 警告(“此函数或变量可能不安全”)。
但是,我无法获得 memcpy 的类似警告(并且代码中可能还有一些类似的“不安全”函数调用)
int _tmain(int argc, _TCHAR* argv[])
{
char buf1[100], buf2[100];
strcpy (buf1, buf2); // Warning C4996 displayed here asking to use strcpy_s instead
memcpy (buf1, buf2, 100); // No warning here asking to use memcpy_s
memcpy_s(buf1, 100, buf2, 100);
return 0;
}
为什么会这样呢?如何为代码中所有可能的不安全调用打开 C4996 警告?
一般来说,要编译 C 代码,您需要一个合格的 C 编译器。 Visual Studio 是一个不符合标准的 C++ 编译器。
您收到警告是因为 Visual Studio 很糟糕。See this.
C4996每当您使用 Microsoft 认为已过时的功能时,就会出现。显然,微软已经决定他们应该决定 C 语言的未来,而不是 ISO C 工作组。因此,对于完美的代码,您会收到错误的警告。是编译器的问题。
strcpy() 函数没有任何问题,这是一个神话。这个函数已经存在了大约 30-40 年,并且它的每一点都被正确记录。因此,即使对于初学者 C 程序员来说,该函数的作用和不作用也不应该感到惊讶。
strcpy 的作用和不作用:
- 它将空终止字符串复制到另一个内存位置。
- 它不承担任何错误处理的责任。
- 它不会修复调用者应用程序中的错误。
- 它不承担任何教育 C 程序员的责任。
由于上面最后一句话,在调用 strcpy 之前您必须了解以下内容:
- 如果将未知长度的字符串传递给 strcpy,而没有提前检查其长度,则调用者应用程序中会出现错误。
- 如果您传递一些不以以下内容结尾的数据块
\0
,您的调用者应用程序中存在错误。
- 如果将两个指针传递给 strcpy(),这两个指针指向重叠的内存位置,则会调用未定义的行为。这意味着您的调用者应用程序中存在错误。
例如,在您发布的代码中,您从未初始化数组,因此您的程序可能会崩溃并烧毁。该错误与 strcpy() 函数没有丝毫关系,也不能通过将 strcpy() 替换为其他函数来解决。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)