在最近發現的一個錯誤追蹤中,我發現返回指向臨時變量成員的指針有問題。有問題的(簡體)代碼是:如何防止返回一個指向臨時變量的指針?
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
}
如何防止這種情況?海灣合作委員會&鐺有-Waddress-of-temporary
和-Wreturn-stack-address
但他們似乎鬆散的軌跡,因爲ptr()
充當骯髒行爲的中間人。當指針直接取它們只觸發:
int* fun(int i) { return &S(i).i; } // rightly fails to compile
我的項目還採用cppcheck在持續集成,但它也可以把它撿起來(凸起here)。
哪個靜態分析工具可以防止這類錯誤?
編輯:從版本6.1.0開始,GCC確實會提取它,並且-Wreturn-local-addr
和(令人驚訝的)-O2
開啓。
如果你用'-O2'編譯,gcc會捕獲這個bug:http://melpon.org/wandbox/permlink/KaXY4ktTM1vMNTiX – krzaq
「如何防止這個?」只有一個解決方案 - 停止使用原始指針 – Slava
@krzaq'-O2'與它無關,但GCC的版本(從6.1.0開始檢測)。我不能使用新的GCC,但這是一個很好的說法,可以讓我們的維護人員切換到更新的版本:) –