2016-11-19 14 views
-1

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:

enter image description here

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:

enter image description here

+0

"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

+1

[Erlaubt "Undefined Behavior" wirklich * alles * passieren?] (Http://stackoverflow.com/questions/ 32132574/does-undefined-behavior-really-allow-all-to-happen) – kaylum

+0

@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

Antwort

1

Undefined unberechenbar bedeutet. In einem Lauf printf kann Müll produzieren, in einem anderen kann EXC_BAD_ACCESS statt produzieren. Sie können undefined behavior nicht reproduzieren. In diesem speziellen Fall muss der %s Begriff in der Formatierungszeichenfolge printf eine C-Zeichenfolge finden. Abhängig von Ihrer libc-Implementierung kann es, wenn Sie das zweite Argument nicht angegeben haben, es irgendwo finden. Und wenn es passiert, dass ein Nullzeichen nicht weit von diesem Zeiger gefunden wird, erhalten Sie Trash-Ausgabe. Wenn nicht, sucht printf weiterhin das Ende der Zeichenfolge, bis es außerhalb des Bereichs des Speichers, der Ihrem Programm zugewiesen ist, gerät und Sie die EXC_BAD_ACCESS erhalten.

0

Es ist nicht möglich - zumindest nicht portabel - zu bestimmen, wie viele Argumente an eine Funktion übergeben werden. Der Formatbezeichner ist die einzige Möglichkeit für printf zu bestimmen, wie viele Werte aus dem Stapel entnommen werden sollen. Wenn Sie also einen falschen Formatbezeichner eingeben, erhalten Sie undefiniertes Verhalten. Es ist nur eines dieser C Dinge, die du lernen musst und dann weitergehen.

Indem Sie versuchen, etwas wie das zu "korrigieren", können Sie den Code nur unlesbarer und für andere Leute schwer verständlich machen.

0

Gibt es eine Möglichkeit, die Argumente vor dem Aufruf von vprintf zu überprüfen, um die Ausnahme zu vermeiden?

Nur eines: Nehmen Sie die Warnung des Compilers ernst und beseitigen Sie Ihren Programmierfehler, auf den die Warnung hinweist.

Siehe: Es wird jetzt Winter, es wird Matsch und Schnee auf den Straßen haben (zumindest in Europa), also haben Sie Ihre bevorzugte Garage, um die Winterreifen an Ihren Porsche zu montieren.Bei der Rückkehr von diesem schönen Auto, das Sie diesen Aufkleber auf dem Armaturenbrett finden (Put dort von der Garage):

enter image description here

(APX 100 Meilen/h)

Dieser Aufkleber erinnert , dass die frisch montiert Winterreifen tun nicht Unterstützung die maximale Geschwindigkeit des Autos.

Sie würden jetzt nicht schneller fahren und erwarten, dass das Auto aufhört, sobald die Reifen kaputt gehen, nicht wahr?

Es liegt an Ihnen, der Fahrer diese Warnung zu respektieren!

;-)

Verwandte Themen