mikrocontroller.net

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


Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

weiss jemand, was zu tun ist, damit
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.

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

Autor: Matthias H. (experimentator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Schikora (schiko)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.