针对 strcpy 但不针对 memcpy 的 C4996(函数不安全)警告

2023-12-01

我正在 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(使用前将#替换为@)

针对 strcpy 但不针对 memcpy 的 C4996(函数不安全)警告 的相关文章

随机推荐