005
21.07.2004, 12:43 Uhr
virtual
Sexiest Bit alive (Operator)
|
Zitat von ~Groovejuice: |
Juhuu, Mein Programm läuft wieder einwandfrei auch wenn mir immer noch nicht klar ist wie man solche Fehler frühzeitig erkennt.
|
Die antwort ist ganz einfach und hat Tommix bereits gegeben: durch sauberes Programmieren!
WEnn einer Anwendung kein Speicher zur Verfügung steht, dann wird beim VC zB ein NULL Pointer zurückgeliefert. Schnell ist mal sowas geschrieben worden, wo mit new oder malloc/realloc was belegt wird und nicht geprüft wird, ob denn auch alles okay ging. Die symptome deines Problems deuten für mich auf uninitialisierte Pointer, also zB:
C++: |
void copy_or_not(const void*s , void* d, size_t l) { static char x[1000]; char* p; if (d) p = d; memcpy(p, s, l); }
|
p ist in manchen Fällen unitialisiert, möglicherweise war die Intention mal gewesen sowas zu schreiben:
C++: |
void copy_or_not(const void*s , void* d, size_t l) { static char x[1000]; char* p; if (d) p = d; else p = x; // Beachte das else! memcpy(p, s, l); }
|
Aber wen man es erstmal vergessen hat, ist der Fehler im Zweifel da, eben erst sichtbar, wenn man das erste Mal die Funktion mit NULL für d aufruft.
Um auf die Sichere Seite zu gelangen: 1. asserts einfügen, wo immer geht. Denn dies sind macros, die man nach ausreichenden Tests in der Releaseversion des Programms auch einfach deaktivieren kann. 2. Lokale Variablen stets initialisieren 3. Funktionsrückgaben immer auf Fehler prüfen. 4. Doku immer genau lesen. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |