为什么将strncpy标记为不安全?

Ali*_*din 4 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'
Run Code Online (Sandbox Code Playgroud)

我在stackoverflow.com上阅读这strcpy并不安全,应该strncpy改用。但是现在为什么我要警告strncpy不安全?

我称它为:

strncpy(this->title, title.c_str(), sizeof(this->title));
Run Code Online (Sandbox Code Playgroud)

man*_*ale 5

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

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


Yak*_*ont 5

strncpy 有一些危险的怪癖。

首先,它将目标缓冲区在复制结束后归零,这可能令人惊讶。

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

第三,如果它被截断,则“大部分有效”。哪一种会阻止错误处理(截断的字符串通常比没用更糟糕,但乍一看似乎并不比没用更糟糕)。

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

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