cppcheck 警告列表初始化中指向局部变量的指针
cppcheck warns about the pointer to local variable in list initialization
我用 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;
}
如果我使用 ()
而不是 {}
,它会解决错误。
编辑
当我用()
或{}
调试示例时,完全没有区别。我在 C++14 中使用 Visual Studio 17。
这是一个误报,因为字符串 ctor 复制了传递的 char* 字符串。
我认为该规则适用于 C++11 之前的版本:
{/*..*/}
仅用于 C++11 之前的聚合初始化,因此 T{ data.data(), data.size() }
只能存储未来的悬挂指针,因此是诊断。
对于 T(data.data(), data.size() )
,这是一个常规的构造函数调用,所以它实际上依赖于 T
构造函数,所以如果不检查 T
构造函数(我怀疑 cppcheck 确实检查)(顺便说一句,它对 std::string
是安全的)。
所以确实是误报。
我用 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;
}
如果我使用 ()
而不是 {}
,它会解决错误。
编辑
当我用()
或{}
调试示例时,完全没有区别。我在 C++14 中使用 Visual Studio 17。
这是一个误报,因为字符串 ctor 复制了传递的 char* 字符串。
我认为该规则适用于 C++11 之前的版本:
{/*..*/}
仅用于 C++11 之前的聚合初始化,因此 T{ data.data(), data.size() }
只能存储未来的悬挂指针,因此是诊断。
对于 T(data.data(), data.size() )
,这是一个常规的构造函数调用,所以它实际上依赖于 T
构造函数,所以如果不检查 T
构造函数(我怀疑 cppcheck 确实检查)(顺便说一句,它对 std::string
是安全的)。
所以确实是误报。