我使用cppcheck分析了一些代码,以了解错误和代码质量。我遇到了一个错误,我认为这是一个误报。下面的代码示例演示了该问题(带有注释)。
cppcheck-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;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用()而不是{},它可以解决该错误。
编辑
当我用()或调试示例时{},完全没有区别。我将Visual Studio 17与C ++ 14一起使用。
我认为该规则适用于 C++11 之前:
{/*..*/}在 C++11 之前仅用于聚合初始化,因此T{ data.data(), data.size() }只能存储未来的悬空指针,从而进行诊断。
对于T(data.data(), data.size() ),它是一个常规的构造函数调用,因此它实际上取决于T构造函数,因此如果不检查构造函数,就无法安全地进行诊断T(我怀疑 cppcheck 是否会进行检查)(顺便说一句,它对于 来说是安全的std::string)。
所以确实,这是一个误报。