gpt4 book ai didi

c++ - cppcheck 警告列表初始化中指向局部变量的指针

转载 作者:行者123 更新时间:2023-12-04 12:15:53 24 4
gpt4 key购买 nike

我用 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() }只能存储 future 的悬空指针,从而诊断。

T(data.data(), data.size() ) ,它是一个普通的构造函数调用,所以它实际上取决于 T构造函数,因此不检查就无法安全地进行诊断 T构造函数(我怀疑 cppcheck 是否检查)(顺便说一句, std::string 是安全的)。

所以确实,这是一个误报。

关于c++ - cppcheck 警告列表初始化中指向局部变量的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58852198/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com