В недавней поисковой ошибке я обнаружил проблему с возвратом указателя на член временной переменной. Оскорбительный (упрощенный) код:
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 в непрерывной интеграции, но он также не может его поднять (поднял здесь).
Какой инструмент статического анализа может предотвратить этот класс ошибок?
EDIT: GCC делает это с версии 6.1.0 с -Wreturn-local-addr
и (неожиданно) -O2
включен.