Sobald ich versuche, es zu kompilieren mit: gcc -g -o char_array2 char_array2.c erhalte ich eine Fehlermeldung, die besagt:
char_array2.c: In function ‘main’:
char_array2.c:9:2: warning: format not a string literal and no format arguments [-Wformat-security]
Kann jemand bitte helfen?
Mögliches Duplikat von warning: format not a string literal and no format arguments
– Ciro Santilli OurBigBook.com
10. Dezember 2015 um 1:05 Uhr
MByD
Beim Benutzen printfist der Format-String besser als String-Literal als als Variable:
printf("%s", str_a);
Besser oder erforderlich? Wieso den?
– Ciro Santilli OurBigBook.com
10. Dezember 2015 um 1:05 Uhr
@CiroSantilli六四事件法轮功包卓轩 – nicht erforderlich, da die API selbst die Übergabe variabler Zeichenfolgen zulässt, aber es ist viel, viel besser, ein Zeichenfolgenliteral zu verwenden, da die Verwendung einer variablen Zeichenfolge, die zufällig Formatbezeichner hat, Fehler verursacht (hauptsächlich Speicher Beschädigungen) und aus Sicherheitssicht ist dies eine klare und einfache Schwachstelle (wenn ein Angreifer die Eingabe kontrollieren kann).
– MByD
10. Dezember 2015 um 7:07 Uhr
@MByD “wird Fehler verursachen (hauptsächlich Speicherbeschädigungen)” Ich denke, es ist wichtig darauf hinzuweisen, dass dies unter nominellen Umständen niemals vorkommen wird – nur wenn die Zeichenfolge entweder von einem Angreifer oder durch schlechte Programmierung manipuliert wird. Nichts bewirkt, dass printf ein Literal anders behandelt als a const char *.
– Benjamin Crawford Strg-Alt-Tut
3. Oktober 2019 um 19:58 Uhr
@BenjaminCrawfordCtrl-Alt-Tut – Ich neige dazu, “könnte” als “wird” zu betrachten, weil ich auf die harte Tour gelernt habe, dass es irgendwann so sein wird. Schlechte Programmierung ist nicht “nominale Umstände”, sondern genau dies zu tun. printf() ist es vielleicht egal, woher der String stammt, aber es ist viel zu mächtig, um diese Vorsichtsmaßnahme zu verwerfen.
– MByD
10. Oktober 2019 um 7:48 Uhr
Schwarzbär
Nur um etwas zu anderen Antworten hinzuzufügen, tun Sie dies besser, weil die Leute vor (langer?) Zeit so printf geschrieben haben und Hacker einen Weg gefunden haben, aus dem Stapel zu lesen und in ihn zu schreiben, mehr hier.
Zum Beispiel ein einfaches Programm wie dieses:
Die Warnung wird dadurch verursacht, dass der Compiler das erste Argument von haben möchte printf ein String-Literal sein. Es möchte, dass Sie Folgendes schreiben:
printf("%s\n", str_a);
Dies liegt daran, dass der erste Parameter von printf ist der Formatstring. Danach werden die Formatargumente übergeben.
Hinweis: Sie können zwar eine Variable als Formatzeichenfolge verwenden, sollten dies aber wahrscheinlich nicht tun. Deshalb gibt der Compiler eine Warnung und keinen Fehler aus.
printf() erwartet, dass sein Format ein String-Literal ist, kein dynamisch erstellter String. Versuchen Sie Folgendes, um das Problem zu beheben:
printf("%s", str_a); // %s denotes a string
Oder verwenden puts
puts(str_a);
Bitte lesen Sie die Warnung ‘keine Formatargumente’ – dh kein % im String.
Mögliches Duplikat von warning: format not a string literal and no format arguments
– Ciro Santilli OurBigBook.com
10. Dezember 2015 um 1:05 Uhr