为什么strncpy标记为不安全?

时间:2014-09-09 13:50:27

标签: c++

我收到警告:

warning C4996: 'strncpy': This function or variable may be unsafe. Consider using  strncpy_s instead.
To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
F:\vuStudio\VC\include\string.h(188) : see declaration of 'strncpy'

我在stackoverflow.com上看到strcpy不安全,我应该使用strncpy。但是现在我为什么要警告strncpy是不安全的?

我称之为:

strncpy(this->title, title.c_str(), sizeof(this->title));

4 个答案:

答案 0 :(得分:4)

strncpy有一些危险的怪癖。

首先,它将目标缓冲区置于副本末尾,这可能会令人惊讶。

其次,如果目标缓冲区中没有足够的空间,则 null终止目标缓冲区。

第三,如果它被截断,它主要是工作'。这会阻止错误处理(截断的字符串通常比无用的更糟糕,但是看起来比乍一看没用时更糟糕。)

strncpy_s需要输入长度(或显式截断请求),如果没有足够的空间来终止(在输出中只写一个零长度字符串),则需要输入错误。输入长度有时提供效率低(并且对于某些更改不是必需的),但它确实保证了空终止输出缓冲区(只要它不是nullptr或零长度),即使在错误条件下也是如此。我不确定它是否会复制到复制字符串的末尾。

此行为可防止或减轻字符串代码中的一些常见fenceposting错误。

答案 1 :(得分:2)

Visual Studio编译器拥有它自己的strncpy实现,你不会用gcc或clang得到这个警告。使用strncpy_s是安全的,更便携(因为strncpy不标准)。

如果您不关心可移植性,strncpy_s确实更安全,因为它有额外的长度检查(但strncpy如果您通过了错误,它就不会拯救您参数)。

答案 2 :(得分:0)

" n" str函数的变体(如strncmp,strncpy等)是" safe"选择,因为它们都限制了所用字符串缓冲区的大小。 " old" str函数(不是" n"变体,如strcpy)都会遇到许多编程错误和内存攻击(一个关闭,堆覆盖等)。

答案 3 :(得分:-1)

您应该在Visual C ++中使用strncpy_s。