Mein Kollege hat kürzlich unser Programm in Windows kompiliert und einen Fehler der folgenden Art entdeckt:
std::string a = "hello ";
std::string b = "world";
const char *p = (a+b).c_str();
printf("%s\n", p);
Der aus irgendeinem Grund in unseren Linux-Executable-Dateien nicht zum Absturz führte.
Keiner unserer Compiler gibt irgendeine Art von Warnung aus, daher machen wir uns nun Sorgen, dass dieser Fehler im Code existieren könnte.
Obwohl wir nach c_str()-Vorkommen suchen können und eine visuelle Inspektion durchführen können, besteht die Möglichkeit, dass jemand auch das Folgende getan hat:
struct I {
int num;
I() { num=0; }
};
struct X {
I *m;
X() { m = new I; }
~X() { delete m; }
I get() { return *m; } // Version 1 oder
I& get() { return *m; } // Version 2
};
und darauf zugegriffen hat wie:
I& a = X().get(); // erhält einen Verweis auf eine temporäre Variable oder eine gültige Kopie?
cout << a.num;
anstatt:
cout << X().get().num;
was sicher ist (nicht wahr?)
Frage: Gibt es eine Möglichkeit, solche Fehler zu erkennen (vielleicht mithilfe des Compilers oder sogar einer Behauptung)?
Ich muss sicher sein, dass, wenn der Autor von struct X
get()
zwischen Version 1 und 2 ändert, das Programm vor dem Fehler warnt