我收到警告:
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));
答案 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。