Was ist falsch an diesem Code?EXC_BAD_ACCESS beim Aufruf von vprintf()
#include <stdio.h>
#include <stdarg.h>
void myprintf(const char * format, ...) __printflike(1, 2);
int main(int argc, const char * argv[]) {
printf("%s\n");
myprintf("%s\n");
return 0;
}
void myprintf(const char * format, ...) {
if (format) {
va_list arguments;
va_start(arguments, format);
vprintf(format, arguments);
va_end(arguments);
}
}
von __printflike
mit erhalte ich eine nette Warnung, wie printf
. Aber im Gegensatz zu printf
, dem Müll zumindest druckt, erhalte ich EXC_BAD_ACCESS auf den Anruf zu vprintf
wie hier gezeigt:
Gibt es eine Möglichkeit, diese Arbeit machen? Danke!
UPDATE: Ich verstehe, dass durch eine Funktion mit der falschen Anzahl von Argumenten aufrufen ich nicht definiertes Verhalten bekommen, aber ich würde myprintf
nur verhalten mag wie printf
tut (ohne Absturz). Ist das möglich? Gibt es eine Möglichkeit, die Argumente vor dem Aufruf vprintf
zu überprüfen, um die Ausnahme zu vermeiden?
UPDATE 2: Ich denke, ich habe es jetzt, danke für alle Kommentare und Antworten. Für dieses sehr einfache Beispiel ist, ich denke, besser einen Makro zu verwenden, die schnell und stürzt in dem anrufenden Punkt versagt:
"printf, der Müll mindestens druckt". Das ist kein garantiertes Verhalten. Wenn Sie absichtlich Fehler in Ihrem Code mit Undefined Behavior setzen, können Sie nicht erwarten, dass sie mindestens "Papierkorb" ausgeben. UB bedeutet, dass das Verhalten nicht vorhersehbar ist. Es kann sofort abstürzen, es kann später abstürzen, es kann Papierkorb drucken, es kann nichts drucken, ... – kaylum
[Erlaubt "Undefined Behavior" wirklich * alles * passieren?] (Http://stackoverflow.com/questions/ 32132574/does-undefined-behavior-really-allow-all-to-happen) – kaylum
@kaylum Ich habe meine Frage aktualisiert, weil ich gerne wissen möchte, ob es eine Möglichkeit gibt, wie sich meine Funktion wie 'printf' verhalten kann undefinierter Weg. Aus Ihrer Sicht ... Dokumentieren dieses Verhalten ist undefiniert, wenn der Anrufer falsche Argumente übergibt, wäre genug? Vielen Dank! – cromandini