繁体   English   中英

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

[英]How to prevent returning a pointer to a temporary variable?

在最近的一次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
}

怎么预防这个? GCC和Clang有-Waddress-of-temporary-Wreturn-stack-address但是由于ptr()充当了肮脏行为的中间人,它们似乎松散了。 它们仅在直接获取指针时触发:

int* fun(int i) { return &S(i).i; }  // rightly fails to compile

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

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

编辑:GCC确实从版本6.1.0开始接收它,其中-Wreturn-local-addr和(令人惊讶的) -O2开启。

我是Cppcheck开发人员。

我的项目还将cppcheck整合到持续集成中,但它也无法接受它。

有趣的bug。 这是cppcheck想要警告的那种bug。 我们有一些相关的检查,但遗憾的是,这一检查有所不同。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM