Forum: PC-Programmierung sprintf und try/catch in MS VC


von Random .. (thorstendb) Benutzerseite


Lesenswert?

Moin,

weiss jemand, was zu tun ist, damit
1
sprintf(0, "Foo");

unter MS Visual C in 'catch' bzw. '__except' landet?

Alle NULL Pointers etc. landen da, nur die printf funktionen weigern 
sich ...


VG,
/th.

von Arc N. (arc)


Lesenswert?

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).

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Hi,

ist egal. Ich habe sprintf nur als Beispiel angebracht.
Keine Funktion aus der sprintf familie geht bei mir in den __except.

von Matthias H. (experimentator)


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.

von Rolf Magnus (Gast)


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.

von Michael S. (schiko)


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 :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.