使用gcc 8.2.1时strncat Wformat溢出警告

时间:2018-11-21 09:07:49

标签: c++ string gcc gcc-warning gcc8

我正在使用gcc 8.2.1并尝试构建以下代码:

std::string dir = "Documents";
char * _tempname = static_cast <char*> (malloc( dir.length() + 14));
strncpy (_tempname, dir.c_str(), dir.length()+1 );
strncat (_tempname, "/hellooXXXXXX", 13);

但是它给了我这个警告:

  

警告:'char* strncat(char*, const char*, size_t)'已指定界限   13等于源长度[-Wstringop-overflow =]

搜索后,我发现根据link中的讨论,使size_t等于源长度是一个溢出问题,但是我不明白为什么这被认为是问题,以及为什么它会使目标溢出。以及如何在不更改代码的情况下删除此警告?

3 个答案:

答案 0 :(得分:2)

显然,GCC知道strncat(_tempname, "/hellooXXXXXX", 13);strcat(_tempname, "/hellooXXXXXX");没什么不同,并且发现您怀疑使用的是前者而不是后者。

如果您可以更改代码,请改用strcat(甚至更好的是,改写为使用std::string)。

如果您无法更改代码,请使用-Wno-stringop-overflow标志来禁用警告。

答案 1 :(得分:1)

该函数希望目标中保留的空间不是源字符串的长度,因此请使用

// ...
strncat(_tempname, "/hellooXXXXXX", dir.length() + 14 - strlen(_tempname) - 1);` 

相反。不,算了请改用std::string

答案 2 :(得分:0)

我的理解是,gcc发出此警告仅是因为用户将边界设置为等于src长度是常见的错误,仅此而已。