c++ - 为什么 strncpy 被标记为不安全?

标签 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));

最佳答案

strncpy 有一些危险的怪癖。

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

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

第三,如果它被截断,它“大部分都有效”。这不鼓励错误处理(截断的字符串通常比无用更糟糕,但乍一看并不看起来比无用更糟糕)。

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

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

关于c++ - 为什么 strncpy 被标记为不安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25746400/

相关文章:

c++ - 如何在 OpenCL 中使用模板?

c++ - 与 Minecraft bukkit 服务器握手 - 发送服务器主机字段失败

C++ continue 语句导致无限循环

c++ - 为什么 GCC 5.3.0 在绑定(bind)对 "this"指针的引用时会发出警告

c++ - 从 IPv6 数据包中获取 ICMPv6 header

c++ - OpenMP 与 boost::directory_iterator 并行

c++ - 函数内部动态分配的内存泄漏

c++ - 将 time_t 转换为 int64_t

c++ - 计算大型组合

c++ - 无论如何传递函数作为模板参数?