在最近的错误搜索中,我发现了一个返回指向临时变量成员的指针的问题。令人反感(简化)的代码为:

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,但也无法将其选中(提高了here)。

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

编辑:GCC确实从-Wreturn-local-addr和(令人惊讶的)-O2打开的版本6.1.0起开始使用它。

最佳答案

我是Cppcheck开发人员。



有趣的错误。这是cppcheck想要警告的错误。我们进行了一些相关检查,但不幸的是,检查失败了。



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

它使用AST,上下文相关的值(value)流分析等来检测错误。 GCC和Clang也是如此。 Cppcheck有时被称为是正则表达式工具,但GCC和Clang却不是。

关于c++ - 如何防止返回指向临时变量的指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40496555/

10-11 23:06