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.
|
Forum: PC-Programmierung sprintf und try/catch in MS VCMoin, weiss jemand, was zu tun ist, damit
unter MS Visual C in 'catch' bzw. '__except' landet? Alle NULL Pointers etc. landen da, nur die printf funktionen weigern sich ... VG, /th. 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). Hi, ist egal. Ich habe sprintf nur als Beispiel angebracht. Keine Funktion aus der sprintf familie geht bei mir in den __except. 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. 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. 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.
|
|