Von man gets
:wenn man sich über gets() beschwert, warum nicht dasselbe mit scanf ("% s", ...) machen?
Niemals gets(). Da ist es unmöglich, ohne zu sagen, die Daten im Voraus zu wissen, wie viele Zeichen gets() wird gelesen, und weil gets() wird auch weiterhin Zeichen über das Ende des Puffers speichern, es ist extrem gefährlich zu verwenden . Es wurde verwendet, um Computer Sicherheit zu brechen. Verwenden Sie stattdessen fgets().
Fast überall sehe ich scanf
in einer Weise verwendet werden, die das gleiche Problem haben sollte (buffer overflow/buffer overrun): scanf("%s",string)
. Dieses Problem besteht in diesem Fall? Warum gibt es keine Referenzen in der Manpage scanf
? Warum gcc nicht warnt, wenn das mit -Wall
kompiliert wird?
ps: Ich weiß, dass es eine Möglichkeit ist im Format-String die maximale Länge der Zeichenfolge mit scanf
angeben:
char str[10];
scanf("%9s",str);
edit: Ich bitte nicht Determe, wenn der vorhergehende Code richtig ist oder nicht. Meine Frage ist: Wenn scanf("%s",string)
immer falsch ist, warum gibt es keine Warnungen und es gibt nichts darüber in der man-Seite?
Ihr Wikipedia-Link sagt 'scanf' ist * unsicher *. – aviraldg
@aviraldg Du hast recht und ich habe es schon gelesen, aber ich fand keine gute Möglichkeit, den Titel zu schreiben. Ich habe es bearbeitet. – dbarbosa
Wie alle antworteten: 'scanf ("% s ", ...)' ist unsicher. Eine weitere Referenz dazu: http://c-faq.com/stdio/scanfprobs.html. Ich verstehe immer noch nicht, wie es in der Manpage nichts gibt. – dbarbosa