4

我正在使用 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=]

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

4

3 回答 3

12

显然 GCC 理解这strncat(_tempname, "/hellooXXXXXX", 13);与 没有什么不同strcat(_tempname, "/hellooXXXXXX");,并且发现您使用前者而不是后者是可疑的。

如果您可以更改代码,请strcat改用(或者更好的是,重写要使用的东西std::string)。

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

于 2018-11-21T09:34:06.013 回答
3

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

于 2018-11-21T09:36:29.913 回答
0

该函数期望目标中剩余的空间不是源字符串的长度,因此使用

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

反而。不,忘记那个。改为使用std::string

于 2018-11-21T09:25:43.837 回答