我使用cppcheck分析了一些代码,以了解错误和代码质量。我遇到了一个错误,我认为这是一个误报。下面的代码示例演示了该问题(带有注释)。
cppcheck-v 1.89
#include <string>
#include <vector>
#include <iostream>
std::string func() {
std::vector<char> data{};
data.push_back('a');
data.push_back('b');
data.push_back('c');
return std::string{ data.data(), data.size() }; // error marked here
// severity: error
// line: 12
// summary: Returning object that points to local variable 'data' that will be invalid when returning.
}
int main() {
std::string ret{};
{
ret = func();
}
std::cout << ret << std::endl;
return 0;
}
如果我使用()
而不是{}
,它将解决错误。
编辑
[当我使用()
或{}
调试示例时,完全没有区别。我将Visual Studio 17与C ++ 14一起使用。
我认为规则适用于C ++ 11之前的版本:
[{/*..*/}
仅用于C ++ 11之前的聚合初始化,因此T{ data.data(), data.size() }
只能存储将来的悬空指针,从而进行诊断。
使用T(data.data(), data.size() )
,这是一个常规的构造函数调用,因此它实际上取决于T
构造函数,因此,如果不检查T
构造函数就无法安全地进行诊断(而且我怀疑cppcheck不会进行检查)(以及BTW对于std::string
是安全的。
确实,这是一个误报。
这是假阳性,因为字符串ctor复制了所传递的char *字符串。