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 是安全的)。

所以确实是误报。