Мой коллега недавно скомпилировал нашу программу в Windows и обнаружил ошибку типа:
std::string a = "hello ";
std::string b = "world";
const char *p = (a+b).c_str();
printf("%s\n", p);
, которая по какой-то причине не вылетала в наших исполняемых файлах Linux.
Ни один из наших компиляторов не выдает никаких предупреждений, поэтому сейчас мы опасаемся, что эта ошибка может существовать в коде.
Хотя мы можем grep для вхождений c_str ()
и выполнить визуальный осмотр, есть вероятность, что кто-то также мог сделать следующее:
struct I {
int num;
I() { num=0; }
};
struct X {
I *m;
X() { m = new I; }
~X() { delete m; }
I get() { return *m; } // version 1, or
I& get() { return *m; } // version 2
};
и получить к нему доступ как:
I& a = X().get(); // will get a reference to a temporary, or a valid copy?
cout << a.num;
вместо:
cout << X().get().num;
что безопасно (не так ли?)
Вопрос: Есть ли способ отловить такие ошибки (возможно, с помощью компилятора или даже утверждения)?
Я должен быть уверен, что если автор struct X
изменяет get ()
между версией 1 и 2 , что программа будет предупреждать об ошибке