C++'strcpy'给出警告(C4996)

Sud*_*ha 15 c++ visual-c++

我收到此警告,但所有功能都正常工作.

这究竟意味着什么?

'strcpy': This function or variable may be unsafe. 
Consider using strcpy_s instead. To disable deprecation, 
use _CRT_SECURE_NO_WARNINGS. See online help for details.
Run Code Online (Sandbox Code Playgroud)

Cra*_*lus 21

由于没有边界检查并且可能导致缓冲区溢出,因此该函数(strcpy)被认为是不安全的.(实际上strcpy对于溢出漏洞是臭名昭着的,并且所有程序员都避免它 - 或者至少应该避免它).建议是使用安全函数,该函数考虑目标缓冲区的大小以避免溢出.你也可以使用strncpy(但要小心!).您的代码没有问题,即函数将按照您的说法运行,但尝试将大于目标缓冲区的缓冲区作为输入.该函数将溢出目标缓冲区.检查这个链接文本

  • @ereOn:问题是标准C函数不知道目标缓冲区的大小.即使输入src缓冲区正确地以NULL结尾,如果目标缓冲区的大小较小,也无法停止复制.这有要由调用函数处理,或者必须使用strcpy函数的安全版本.你是对的,处理用户输入是一个大问题.但总的来说,在所有情况下总是最好不要使用strcpy. (3认同)
  • 不要使用strncpy(); 它不保证以空字符结尾的字符串,并且如果用于将短字符串复制到大缓冲区中,则会热心地将缓冲区的未使用部分清零,这很少是必要的.它原来的工作很好(在旧的Unix文件系统中将最多14个字符复制到一个目录条目中),但实际上并不是很多. (3认同)

Mon*_*ier 11

虽然strcpy是一个常见的字符串函数,但它有一个历史,它是软件中许多错误和安全漏洞的来源(由于缓冲区溢出很容易).

为了在C和C++中促进更安全的编码,Microsoft为危险的字符串方法提供了一套替换函数.通常,它们的原始名称后跟_s.因此,strcpy的Microsoft安全版本是警告中建议的strcpy_s.请注意这是Microsoft特有的功能,它不是普遍存在的.

你有几个选择.

  1. DEFINE _CRT_SECURE_NO_WARNINGS如果您不想关心它,可能会在您的软件中出现安全问题.
  2. 将您的字符串函数替换为安全字符串函数,从而使您的软件不那么便携
  3. 包装安全字符串函数并在任何地方使用包装器,在Windows平台上提供增强的安全性,并在其他平台上回退到传统版本.包装函数可以通过MACRO或编译函数.

我通常做#3.

  • [有时候"安全"功能并不那么安全.:-O](http://stackoverflow.com/questions/2738260/false-sense-of-security-with-snprintf-s) (6认同)

Kon*_*lph 10

由于您正在编写C++,因此正确的解决方案是尽可能禁止char*代码中的C风格字符串,并用std::string(或其他适当的字符串类型)替换它们.

千万不能使用的功能,如strcpystrcpy_sstrncpy.使用类的复制构造函数或赋值运算符string.或者,如果您确实需要复制缓冲区,请使用std::copy.


sha*_*oth 8

因为VC++ 8 strcpy()和一大堆其他函数被认为是不安全的,因为它们没有边界检查,如果误用会导致缓冲区溢出.

您有两种选择:

  • 如果你不确定 - 做VC++所说的并使用"安全"功能.它们将触发错误处理程序,如果出现问题,将终止程序.
  • 如果你知道你在做什么 - 你知道不会发生任何溢出,所有边缘情况都由你的代码处理 - _CRT_SECURE_NO_WARNINGS在包含CRT标题之前定义,这将使警告消失.


小智 5

实际上有一种方法可以避免这个警告,仍然使用 strcpy,并且是安全的:

您可以启用安全模板重载。他们将(如果可能)通过使用模板化重载捕获它们来推断使用的缓冲区的长度。为什么在 Visual C++ 中默认情况下没有启用这对我来说是个谜。