我收到警告:
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));
最佳答案
strncpy
有一些危险的怪癖。
首先,它会在复制结束后将目标缓冲区归零,这可能会令人惊讶。
其次,如果目标缓冲区中没有足够的空间,它不会 null 终止目标缓冲区。
第三,如果它被截断,它“大部分都有效”。这不鼓励错误处理(截断的字符串通常比无用更糟糕,但乍一看并不看起来比无用更糟糕)。
strncpy_s
需要输入长度(或显式截断请求),如果没有足够的空间以空终止(在输出中只写入零长度字符串),则会出错。提供输入长度有时效率低下(并且它的某些更改不需要),但即使在错误情况下,它也能保证以 null 结尾的输出缓冲区(只要它不是 nullptr 或零长度)。我不确定它是否在复制的字符串末尾之后归零。
此行为可防止或减轻字符串代码中的一些常见围栏错误。
关于c++ - 为什么 strncpy 被标记为不安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25746400/