как обнаруживать ссылки на элементы временных объектов

Мой коллега недавно скомпилировал нашу программу в 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 , что программа будет предупреждать об ошибке

9
задан Grim Fandango 29 November 2011 в 17:49
поделиться