为什么 GCC 抱怨 Wstringop 溢出?

问题描述 投票:0回答:1

我的代码如下所示:

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-warning gcc9
1个回答
0
投票

是的,GCC 对此有点奇怪。但这实际上确实指出了代码中的感知和性能问题。如果您在知道源字符串长度时使用适当的函数,它会变得更快并且避免警告:

size_t inputCharArrayLen = strlen(inputCharArray) + 1U;
char* newChar = new char[inputCharArrayLen];
if (NULL == newChar) {
    return;
}
memcpy(newChar, inputCharArray, inputCharArrayLen);

(这也避免了可能运行

strlen
两次。)

© www.soinside.com 2019 - 2024. All rights reserved.