如何防止返回指向临时变量的指针?

Tom*_*ski 13 c++ pointers temporary static-code-analysis cppcheck

在最近的一次bug搜索中,我发现了一个返回指向临时变量成员的指针的问题.违规(简化)代码是:

struct S {
    S(int i) : i(i) {}
    int i;
    int* ptr() { return &i; }
};

int* fun(int i) { return S(i).ptr(); }  // temporary S dies but pointer lives on

int main() {
    int* p = fun(1);
    return *p;  // undefined
}
Run Code Online (Sandbox Code Playgroud)

怎么预防这个?海湾合作委员会和铿锵有-Waddress-of-temporary,-Wreturn-stack-address但他们似乎因为ptr()肮脏的行为充当中间人而松散.它们仅在直接获取指针时触发:

int* fun(int i) { return &S(i).i; }  // rightly fails to compile
Run Code Online (Sandbox Code Playgroud)

我的项目还将cppcheck整合到持续集成中,但它也无法获取(在这里提出).

哪种静态分析工具可以防止这类错误?

编辑:GCC确实从版本6.1.0开始接收-Wreturn-local-addr并且(令人惊讶地)-O2开启.

Dan*_*äki 3

我是一名 Cppcheck 开发人员。

我的项目也在持续集成中加入了cppcheck,但它也无法接受它。

有趣的错误。这就是 cppcheck 想要警告的错误。我们有一些相关的检查,但不幸的是,这没有通过。

考虑到 cppcheck 的正则表达式性质,这并不奇怪。

我个人不明白为什么有些人说 cppcheck 是一个正则表达式工具。

它使用 AST、上下文敏感的价值流分析等来检测错误。GCC 和 Clang 也是如此。Cppcheck 有时被声称是正则表达式工具,但 GCC 和 Clang 不是。

  • 我承认我没有研究 cppcheck 内部结构,并且可能得到的印象是它是基于正则表达式的自定义规则的定义方式。我从问题中删除了该评论,以免传播错误信息。 (3认同)