2010-12-11 10 views
37

ich die Warnung entfernen möchten, dass ich auf dieser Linie des Codes zu erhalten,Warnung: Format kein Stringliteral und keine Format Argumente

FILE *fil; 
char *imp; 
(...) 
fprintf(fil,imp); 

die Sache ist, wenn ich dies tun, schreibt es auf die Datei genau was ich will, aber wenn ich das Format% s gilt dies nicht der Fall, wie dieser

fprintf(fil, "%s", imp); 
+0

Was enthält 'imp'? – casablanca

+1

Was passiert, wenn Sie fprintf durch 'fputs (imp, fil);' ersetzen? – pmg

+0

eine Zeichenfolge, nehmen wir an, sowas wie imp = "test"; – Unzi

Antwort

43

Diese Warnung ist die Art und Weise, wie gcc Ihnen sagt, dass das Formatierungszeichenfolgenargument für die printf-Stilfunktion (printf, fprintf usw.) nicht überprüft werden kann. Diese Warnung wird generiert, wenn der Compiler nicht manuell in die Zeichenfolge hineinspähen und sicherstellen kann, dass während der Laufzeit alles ordnungsgemäß ausgeführt wird. Schauen wir uns ein paar Beispiele an.

printf("This string has no format"); 

Fall 2:

Fall 1. Diese Zeichenfolge kann bei der Kompilierung und der Compiler wird es ermöglichen, ohne Warnung überprüft werden Für diesen Fall kann der Compiler feststellen, dass Sie eine haben Formatbezeichner und wird eine andere Warnung auslösen. Auf meinem Rechner hieß es "Warnung: zu wenig Argumente für Format".

// This will most probably crash your machine 
printf("Not a safe string to %s"); 

Fall 3. Nun ist dies etwas, Ihr Fall. Sie nehmen eine Zeichenfolge, die zur Laufzeit generiert wird und versucht, sie zu drucken. Die Warnung, die Sie erhalten, ist der Compiler, der Sie warnt, dass in der Zeichenfolge ein Formatbezeichner vorhanden sein könnte. Sprich zB für "bad% sdata". In diesem Fall versucht die Laufzeitumgebung, auf ein nicht vorhandenes Argument zuzugreifen, das mit% s übereinstimmt. Schlimmer noch, dies könnte ein Benutzer sein, der versucht, Ihr Programm auszunutzen (was dazu führt, dass es Daten liest, die nicht sicher gelesen werden können).

char str[200]; 
scanf("%s", str) 
printf(str) 
+0

Das Aufrufen einer Funktion, die ein 'const char *' erwartet und ihr ein 'char *' gibt, würde keine Warnung verursachen, IMHO – terminus

+0

Ich habe nicht vorgeschlagen, dass die Zeichenfolge in const umgewandelt wird. Ich erwähnte, dass das zweite Argument angegeben werden muss, um die Warnung zu beheben. –

+0

Was meinst du mit "ein Argument angeben"? – UncleBens

14

Während technisch gibt es nichts falsch mit einer printf-ähnlichen Funktion mit einem String aufrufen, ist es immer noch eine schlechte Praxis, weil die Zeichenfolge kann Format Tokens wie %s enthalten. Wenn imp zum Beispiel %s test ist, werden schlimme Dinge passieren. Wenn Sie nur die imp ohne Formatierung drucken möchten, sollten Sie fputs(imp, fil) verwenden (beachten Sie die umgekehrten Argumente)

+8

Noch schlimmer: Wenn der Benutzer die IMP-Zeichenfolge angeben kann, kann er das Speicherformat% n-Format verwenden, um Speicher zu überschreiben. Dies wird als Formatzeichenfolgenangriff bezeichnet und kann zum Ausführen von injiziertem Code verwendet werden. – ollb

+3

fputs macht den Trick, eine Zeichenkette ohne% Formatierung auszugeben. –

+0

Was meinst du mit "Sans% Formatierung"? – TheRookierLearner

Verwandte Themen