【发布时间】:2018-10-16 07:43:55
【问题描述】:
GCC 8 添加了-Wstringop-truncation 警告。来自https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82944:
在 GCC 8.0 中通过 r254630 为错误 81117 添加的 -Wstringop-truncation 警告专门用于突出可能意外使用 strncpy 函数从源字符串中截断终止 NUL 字符。请求中给出的此类滥用示例如下:
char buf[2];
void test (const char* str)
{
strncpy (buf, str, strlen (str));
}
我收到与此代码相同的警告。
strncpy(this->name, name, 32);
warning: 'char* strncpy(char*, const char*, size_t)' specified bound 32 equals destination size [-Wstringop-truncation`]
考虑到this->name 是char name[32] 和name 是一个长度可能大于32 的char*。我想将name 复制到this->name 中,如果大于32 则截断它. size_t 应该是 31 而不是 32?我糊涂了。 this->name 不是必须以 NUL 结尾的。
【问题讨论】:
-
如果
name是"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",你想让this->name持有"ABCDEFGHIJKLMNOPQRSTUVWXYZabcde"(一个字符串)还是{'A','B',...,'e','f'}(一个字符序列,没有空字符来终止它) ? -
一个字符序列,没有空字符来终止它。