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