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

问题描述 投票:7回答:2

我使用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++ cppcheck
2个回答
2
投票

我认为规则适用于C ++ 11之前的版本:

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

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

确实,这是一个误报。


2
投票

这是假阳性,因为字符串ctor复制了所传递的char *字符串。

© www.soinside.com 2019 - 2024. All rights reserved.