Typüberprüfung bei FILE* als Par ameter in va list
Von: Andreas Eibach (aeibach@mail.com) [Profil]
Datum: 09.10.2009 23:43
Message-ID: <7j9omuF33fksjU1@mid.uni-berlin.de>
Newsgroup: de.comp.lang.c
Datum: 09.10.2009 23:43
Message-ID: <7j9omuF33fksjU1@mid.uni-berlin.de>
Newsgroup: de.comp.lang.c
Hi,
ich hab mir hier eine Log-Routine gebastelt, die auch printf() Attribute
versteht.
Da geht man natürlich am besten mit va_list zu Werke, da es einmal z. b. 2,
und einmal auch 4 Attribute sein können, was man vorher nie weiß.
Sieht so aus:
void logMe (FILE* ofile, const char* fmtStr, ...)
{
va_list arg_p;
va_start (arg_p, fmtStr); /* init. Argumentenliste NACH fmtStr */
vfprintf (ofile, fmtStr, arg_p);
va_end (arg_p);
fputs ("\n", ofile);}
char strEins[10];
char strZwei[10];
strcpy (strEins, "eins");
strcpy (strZwei, "zwei");
/* h_logfile = vordefiniertes Filehandle, Öffnen war erfolgreich */
logMe (h_logfile, "Blubb %s %s", strEins, strZwei);
----
Toll. Nix Aufregendes.
Nehmen wir aber mal an, logMe() befände sich in einer kleinen Toolsammlung,
die würde ich unter GPL stellen.
Jetzt geht ein Anfänger her und programmiert __versehentlich__ analog:
logMe ( "Blubb %s %s", strHinz, strKunz);
Die Resultate sind unvorhersehbar!!
Im "isolierten" Test löste das Programm so einen GPF aus.
(Natürlich weiß ich, dass bei vernünftig
eingestelltem Warnlevel da
Warnungen über "pasisng argument X ..." etc. kommen. Nehmen wir
aber mal an,
der Jungprogrammierer sieht auch die grade irgendwie nicht...)
FRAGE:
Wie kann ich so etwas sauber abfangen?
(nich schlagen) Mit den internen Attributen der struct _iobuf in stdio.h hab
ich schon herumexperimentiert, da hab ich aber leider kein Kriterium
gefunden wie man das sinnvoll abfangen kann und z. B. vorher einen exit(0)
auslösen kann, bevor Schlimmeres passiert.
Abfrage von ofile auf NULL ging auch nicht.
Gibt's da noch einen anderen Trick?
-Andreas
[ Auf dieses Posting antworten ]Antworten
- MIchael Schumacher (10.10.2009 15:07)
- Andreas Eibach (10.10.2009 20:46)
- MIchael Schumacher (10.10.2009 22:26)
- Rainer Weikusat (11.10.2009 20:16)
