fprintf, Fehler: Format kein String-Literal und keine Format-Argumente [-Werror = Format-Sicherheit

8

wenn ich versuche, fprintf(stderr,Usage) auf Ubuntu zu kompilieren, habe ich diesen Fehler bekommen:

%Vor%

aber wenn ich das auf anderen Linux-Distributionen (RedHat, Fedora, SUSE) kompiliert habe, die erfolgreich kompiliert wurden.

Jeder hat eine Idee?

    
devnull 23.06.2013, 11:42
quelle

2 Antworten

15

Sie sollten fputs(Usage, stderr);

verwenden

Sie müssen fprintf nicht verwenden, wenn Sie keine Formatierung vornehmen. Wenn Sie fprintf verwenden möchten, verwenden Sie fprintf(stderr, "%s", Usage);

Die Standard-Compilerflags auf Ubuntu beinhalten -Wformat -Wformat-security , was das gibt Error.

Dieses Flag wird als Vorsichtsmaßnahme gegen die Einführung von sicherheitsrelevanten Fehlern verwendet, stellen Sie sich vor, was würde passieren, wenn Sie das irgendwie tun würden:

%Vor%

Das wäre das Gleiche wie fprintf(stderr, "Usage %s, [options] ... ]"); was falsch ist.

Jetzt enthält die Usage -Zeichenfolge einen Formatbezeichner, %s , aber Sie stellen dieses Argument nicht auf fprintf , was zu undefiniertem Verhalten führt, was möglicherweise Ihr Programm zum Absturz bringt oder es ausnutzt. Dies ist relevanter, wenn die Zeichenfolge, die Sie an fprintf übergeben, von Benutzereingaben stammt.

Aber wenn Sie fprintf(stderr,"%s", "Usage %s, [options] ... ]"); tun, gibt es kein solches Problem. Die 2. %s wird nicht als Formatangabe interpretiert. gcc kann davor warnen, und die standardmäßigen Ubuntu Compiler-Flags machen es zu einem Compilerfehler.

    
nos 23.06.2013, 12:48
quelle
7

Verwenden Sie fputs(Usage) oder fprintf(stderr, "%s", Usage) . Das Übergeben einer Nachrichtenzeichenfolge an eine printf -Familienfunktion ist gefährlich, da, wenn es keine Formatbezeichner enthält, mögliche Formatbezeichner in der Zeichenfolge interpretiert werden und zu undefiniertem Verhalten führen (da sie keine entsprechenden Argumente haben) zu ihnen), und dies wird fast immer in Sicherheitsfehler übersetzen.

    
R.. 23.06.2013 12:49
quelle

Tags und Links