该代码在cppcheck中是否为假阳性?

skr*_*.at 7 c++ cppcheck

我使用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一起使用。

Jar*_*d42 4

我认为该规则适用于 C++11 之前:

{/*..*/}在 C++11 之前仅用于聚合初始化,因此T{ data.data(), data.size() }只能存储未来的悬空指针,从而进行诊断。

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

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