我收到警告:
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)
Visual Studio 编译器有自己的 实现strncpy,使用 gcc 或 clang 不会收到此警告。它是安全的,更便携的(因为strncpy_s不是标准)来使用strncpy。
如果你不关心可移植性,strncpy_s确实更安全,因为它有一个额外的长度检查(但strncpy如果你传递了错误的参数,它不会拯救你)。
strncpy 有一些危险的怪癖。
首先,它将目标缓冲区在复制结束后归零,这可能令人惊讶。
其次,如果目标缓冲区中没有足够的空间,则不会将目标缓冲区终止为null。
第三,如果它被截断,则“大部分有效”。哪一种会阻止错误处理(截断的字符串通常比没用更糟糕,但乍一看似乎并不比没用更糟糕)。
strncpy_s需要一个输入长度(或显式的截断请求),如果没有足够的空间来终止,则错误(在输出中只写一个长度为零的字符串)。输入长度有时效率不高(并且某些更改不需要),但是即使在错误情况下,它也保证了以空值终止的输出缓冲区(只要它不是nullptr或零长度)。我不确定它是否在复制的字符串的末尾为零。
此行为防止或减轻了一些常见的字符串代码中的击剑错误。