005
25.05.2004, 12:41 Uhr
virtual
Sexiest Bit alive (Operator)
|
Nein, der Text wird einfach in den Speicher geschrieben, so lang wie der Text ist. Eigentlich hast Du fünf möglichkeiten das Problem zu lösen:
1. Der mit am wenigsten Aufwand verbundene Ansatz dürfte sein, einen sehr großen Speicherbereich zu reservieren, also wenn Du denkst daß der Text auch mal 300 Zeichen lang ist, den Buffer entsprechend vergrößern. Das Problem liegt auf der Hand: Dein Programm läuft dennoch in den Wald, wenn Du falsch gedacht hast und trotzdem mehr in den Buffer eingeschriben wird, irgendwo.
2. Du Stellst sicher, daß niemals mehr als 256 (oder was auch immer) Zeichen reingeschrieben werden. Eigentlich sind hier vor allem die Strings, die per %s eingefügt werden die Hauptursache für Bufferoverflows. Da könnte man sich etwa so behelfen:
C++: |
sprintf(c_textpegel_2, "Fehlermeldung: %s", text);
|
würde ja problematisch werden, wenn text recht lang wäre, so daß nachher zuviel nach c_textpegel_2 geschrieben würde. Das kann man umgehen, indem man sagt:
C++: |
sprintf(c_textpegel_2, "Fehlermeldung: %*.*s", 100, 100, text);
|
Das sagt: egal, oib nun text länger als 100 Zeichen ist oder nicht, kopiere max. 100 Zeichen in den resultatstring.
3. Du verwendest snprintf, da kannst du angeben, wie lang c_textpegel_2 wirklich ist, also was wirklich reinpasst. snprintf gibt es seit dem C99 Standard, wird aber auch von den meisten älteren Compilern unterstützt.
4. Machst es etwa so:
C++: |
static std::string c_textpegel_2; ... if((diagnose ==0)) { c_textpegel_2 = "ok.\n"; } else { std::stringstream sstr; sstr<<"failed (rc="<<diagnose<<"). Diagnose see protocol file.\n"; c_textpegel_2 = sstr.str(); }
|
Das wäre die C++ lösung, die ich empfehlenswert finde.
5. Wenn Du MFC verwenden darfst/kannst, kannst Du ja mal die Klasse CString anschauen, die hat glaube ich eine format Methode, die dem sprintf sehr ähnlich ist. Aber das weiß ich letztlich nicht genau, ich kenne mich mit dem Schweinkram nicht so gut aus. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |