warning:gets-Funktion ist gefährlich [duplicate]

Lesezeit: 3 Minuten

Wenn ich die Funktion gets verwende, gibt mir gcc eine Warnung:

warning:the `gets' function is dangerous and should not be used.

Warum bekommt und stellt Funktion gefährlich?

  • Das puts() Funktion ist nicht gefährlich. Warum fragst du nach puts() zu?

    – Greg Hewgill

    16. Mai 2010 um 8:43 Uhr

Wenn Sie Code wie diesen haben:

char s[10];
gets( s );

und Sie bei der Ausführung des Programms mehr als 10 Zeichen eingeben, wird der Puffer überlaufen, was zu undefiniertem Verhalten führt. Die Funktion gets() kann Sie nicht daran hindern, die Zeichen einzugeben, und sollte daher vermieden werden. Stattdessen sollten Sie fgets() verwenden, mit dem Sie die Anzahl der gelesenen Zeichen begrenzen können, damit der Puffer nicht überläuft.:

char s[10];
fgets( s, 10, stdin );

Die Funktion puts() ist absolut sicher, bereitgestellt Die Zeichenfolge, die Sie ausgeben, ist nullterminiert.

  • fgets verwirft keine Zeichen. Es lässt sie ungelesen. Nachfolgende Anrufe an fgets oder jede andere Lesefunktion kann die restlichen Zeichen lesen.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    7. Juli 2010 um 19:04 Uhr

  • @R. Richtig – ich werde meine Antwort bearbeiten. Übrigens, R. ist kein guter oder sinnvoller SO-Benutzername.

    anon

    7. Juli 2010 um 19:37 Uhr

Benutzer-Avatar
Marcelo Cantos

Da gets schränkt die gelesene Datenmenge nicht ein und ist daher anfällig für Pufferüberläufe. @Neils Antwort hat die passende Lösung dafür.

Das puts Funktion ist nicht gefährlich, AFAIK, es sei denn, Sie vergessen natürlich, sie mit Null zu beenden.

Pufferüberläufe sind gefährlich. Hier ist die Definition:

/* Get a line from the stdin stream. */
char *gets(char *buffer);

Wie groß ist der Puffer? Wenn ein Benutzer mehr Daten eingibt, die in den Puffer passen, könnte das Programm abstürzen und anfällig für Hacker-Exploits werden.

Benutzer-Avatar
Phil

Wie Der Wikipedia-Artikel sagt, gets() ist von Natur aus unsicher, weil alles, was es braucht, ist a char * als Argument.

Dies ist gefährlich, da die Methode nicht wissen kann, wie viel Speicherplatz dafür zugewiesen wurde char * in jeder Situation. Deswegen gets verhält sich so, als hätte er einen Blankoscheck, um so viele Daten wie möglich darauf zu schreiben, was zu Pufferüberläufen führen könnte.

Die Alternative ist fgets die nicht nur das Zeichen-Array, sondern auch die maximale Länge und den Stream-Zeiger aufnimmt. gets wird nur aus Gründen der Abwärtskompatibilität mit älterem Code beibehalten.

Gets prüft nicht auf Pufferüberlauf, wodurch Ihr Code Angriffen ausgesetzt wird

  • Hallo! Wenn Sie mit gcc mit der Option -fno-stack-protector bauen, gibt es kein Problem mit gets(). Danach erscheint Code wie dieser akzeptabel: char ch[] = {0}; bekommt (ch);

    – Олег Сидоров

    3. März 2020 um 9:43 Uhr

gets liest Daten in den angegebenen Speicherbereich, bis ein Zeilenumbruch oder das Dateiende auftritt. Wenn die Eingabe (z. B. wie vom Benutzer bereitgestellt) eine Zeile enthält, die länger ist als die Größe des bereitgestellten Puffers gets, wird es überlaufen und gets wird in den Speicher außerhalb des Puffers schreiben. Im schlimmsten Fall kann dies einem böswilligen Benutzer ermöglichen, Daten zu schreiben, die das Verhalten des Programms ändern, oder möglicherweise sogar willkürlichen Code mit den Rechten dieses Programms auszuführen (z. und sogar versehentliche Überläufe können die Software beschädigen.

fgets sollte stattdessen verwendet werden, da ein zusätzliches Argument erforderlich ist, um die Größe der Eingabe einzuschränken.

  • Hallo! Wenn Sie mit gcc mit der Option -fno-stack-protector bauen, gibt es kein Problem mit gets(). Danach erscheint Code wie dieser akzeptabel: char ch[] = {0}; bekommt (ch);

    – Олег Сидоров

    3. März 2020 um 9:43 Uhr

1143910cookie-checkwarning:gets-Funktion ist gefährlich [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy