gpt4 book ai didi

C4996(函数不安全)警告 strcpy 但不是 memcpy

转载 作者:太空狗 更新时间:2023-10-29 15:09:56 24 4
gpt4 key购买 nike

我在 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 语言的 future ,而不是 ISO C 工作组。因此,您会收到完美代码的错误警告。编译器是问题所在。

strcpy() 函数没有任何问题,那是一个神话。这个功能已经存在了大约 30-40 年,并且它的每一点都被适本地记录下来。因此,即使对于初学者 C 程序员来说,该函数的作用和不作用也不应该让人感到惊讶。

strcpy 做什么和不做什么:

  • 它将一个以 null 结尾的字符串复制到另一个内存位置。
  • 对错误处理不承担任何责任。
  • 它不会修复调用方应用程序中的错误。
  • 它不对培训 C 程序员承担任何责任。

由于上面的最后一句话,在调用 strcpy 之前你必须知道以下内容:

  • 如果您将未知长度的字符串传递给 strcpy,而没有事先检查其长度,则调用方应用程序中存在错误。
  • 如果您传递了一些不以 \0 结尾的数据 block ,则调用方应用程序中存在错误。
  • 如果将两个指针传递给 strcpy(),这两个指针指向重叠的内存位置,则会调用未定义的行为。这意味着调用者应用程序中存在错误。

例如,在您发布的代码中,您从未初始化数组,因此您的程序很可能会崩溃并烧毁。该错误与 strcpy() 函数没有丝毫关系,并且无法通过将 strcpy() 换成其他函数来解决。

关于C4996(函数不安全)警告 strcpy 但不是 memcpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23486938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com