sprintf und try/catch in MS VC

#2073598
Lesenswert?

Ich muß ehrlich sagen, daß ich nicht glaube, daß das geht.
sprintf() ist eine Funktion der Standard-C-Bibliothek. Standard-C und 
damit auch die Standard-C-Bibliothek kennt aber keine Exceptions, das 
ist ein Microsoft-Hack.

Der C-Standard sagt aber nichts darüber, wie sich eine Funktion wie 
sprint() in so einem Fall verhalten soll, das Verhalten ist also 
undefiniert. Es ist sehr gut möglich, daß Microsofts Implementation 
diesen Fall abfängt und einfach gar nichts tut, das ist durchaus ein 
sinnvolles Verhalten.

Eine Möglichkeit wäre, auf solche Hacks zu verzichten und gleich in C++ 
zu programmieren, unter Verwendung der stringstream-Klasse aus der STL 
und C++-Exception Handling. Nicht, daß ich die STL für der Weisheit 
letzten Schluß halten würde, aber sie ist an der Stelle leidlich 
typsicher, sodaß Abstürze bei Formatierungsfunktionen damit deutlich 
schwerer werden als mit der Standard C Library.

Eine andere Möglichkeit wäre, daß Du den Rückgabewert von sprintf() und 
äquivalenten Funktionen auswertest - wenn da ein unerwartet kleiner oder 
negativer Wert zurückkommt, dann ist die Formatierung fehlgeschlagen. 
Sicherlich kann man in diesem lustigen Microsoft-Exception handling dann 
selbst eine Exception auslösen. Du kannst Dir dann Wrapperfunktionen a 
la my_sprintf() usw. schreiben, die das tun und die Du statt sprintf() 
aufrufst.
Gast #2073913
Lesenswert?

Arc Net schrieb:
> Wenn der Nullpointer dereferenziert würde, ja. Im C und C++Standard ist
> aber afair bei sprintf nicht festgelegt wie sich die Funktion bei einem
> Nullpointer verhalten soll (bei snprintf dagegen schon).

Da ist aber auch nicht definiert, was beim Dereferenzieren eines 
Nullzeigers passiert.
#2075678
Lesenswert?

Wenn es nicht Tonnen von Code sind, und Du eingreifen kannst,
würde ich die Prüfungen vor den Aufruf stellen.
Ich würde mir eine Wrapper bauen, wenn der Code erhalten bleiben 
soll/muss.
Je nach dem, wie oft Du sie benötigst einmalig vor dem C-Code per define 
umbiegen.

#define MySprintf sprintf

Und wenn Du mehr als nur eine Prüfung auf den Dest-String
machen willst, viel Spaß beim Parsen der Argumentliste :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren