为什么 GCC 抱怨 Wstringop-overflow?

Why is GCC complaining with Wstringop-overflow?

提问人:Sir2B 提问时间:7/22/2022 最后编辑:user438383Sir2B 更新时间:7/22/2022 访问量:292

问:

我有如下所示的代码:

char* newChar = new char[strlen(inputCharArray)+1];
if (NULL == newChar) {
    return;
}
strncpy(newChar, inputCharArray, strlen(inputCharArray));
newChar[strlen(inputCharArray)] = '\0';

对我来说,这似乎是完全有效的代码。但是 GCC 9.2.1 对此表示不满,并发出以下警告:

警告:“char* strncpy(char*, const char*, size_t)”指定绑定 取决于源参数的长度 [-Wstringop-overflow=]

C++ C++03 GCC-警告 GCC9

评论

2赞 Aconcagua 7/22/2022
题外话:C++ -> 你可能会安全地忘记空指针检查; 如果分配失败,则抛出(除非您通过编译器设置或类似设置显式关闭)...new
0赞 Aconcagua 7/22/2022
对我来说看起来也很有效,也许是对非最佳代码的提示,因为在给定的情况下会是更好的选择......实际上,我宁愿使用更像 C++ 的字符数组,或者最好完全忘记字符数组,而将其简化为单行代码,而无需关心内存管理(再次使用数组!):(尽管这个名字对我来说似乎不再合适了......memcpystd::copystd::stringdelete[]std::string newChar(inputCharArray);
0赞 Peter 7/22/2022
其目的是,第三个(长度)参数与第一个(输出)参数的实际长度相关,而与第二个(源)无关。您已经编写了它,因此长度参数与源参数的长度明显相关。编译器可能没有根据您使两个长度相等进行更深入的分析(这对于编译器来说是合理的,因为 and 调用可能位于不同的函数/源文件中 - 并且编译器不需要检测您是否使长度相等)。strncpy()newstrncpy()
0赞 Hans Passant 7/22/2022
它看到代码复制没有零终止符的字符串。明智的做法是使用 strcpy(),你确保它总是适合。
0赞 Sir2B 7/22/2022
@Aconcagua项目中不使用现代 C++ 和异常(嵌入式 C 和只有一点点 C++)

答: 暂无答案