Frage

Ich verwende die Funktion gets() in meinem C-Code. Mein Code funktioniert gut, aber ich bin eine Warnmeldung bekommen

(.text+0xe6): warning: the `gets' function is dangerous and should not be used.

Ich mag diese Warnmeldung Pop-up nicht. Gibt es eine Möglichkeit?

Ich frage mich, dass es solche Möglichkeiten zum Sperren einiger Warnungen, indem Sie eine Header-Datei sein könnte. Oder gibt es eine Option beim Kompilieren, dass mein Zweck dienen kann? Oder kann es eine bestimmte Art und Weise gets() die Verwendung für diese Warnung nicht um Pop-up?

War es hilfreich?

Lösung

Die offensichtliche Antwort ist zu lernen, was der Compiler zu sagen versucht - Sie sollten nie, nie, Verwendung gets (), da es völlig unsicher ist. Verwenden Sie fgets () statt, das Ihnen erlaubt, mögliche Pufferüberläufe zu verhindern.

#define BUFFER_SIZE 100
char buff[BUFFER_SIZE];
gets( buff);   // unsafe!
fgets( buff, sizeof(buff), stdin );   // safe

Andere Tipps

Wenn Sie wirklich wollen, es benutzen.

Hier ist die Antwort von: http://www.gamedev.net /community/forums/topic.asp?topic_id=523641

Wenn Sie eine einigermaßen aktuelle Version von gcc verwenden, können Sie verwenden:

#pragma GCC diagnostic ignored "your option here"

Zum Beispiel, wenn diese Header ein „Floating-Point-Vergleich ist unsicher“ Fehler erzeugen, verwenden Sie:

#pragma GCC diagnostic ignored "-Wfloat-equal".

Leider können Sie nicht deaktivieren „-Wand“ auf diese Weise (das wäre zu einfach, wäre es nicht ...), müssen Sie die einzelnen Warnoptionen tun, den -Wall von Hand ermöglicht (zumindest die widersprüchlichen ist).

Text & Tabellen: http://gcc.gnu.org/ onlinedocs / gcc / Diagnose-Pragmas.html # Diagnose-Pragmas

EDIT: Aber es scheint, funktioniert nicht bekommt Warnung ... Ich habe versucht, auf meinem PC.

Ich würde die Warnung beachten und gets ersetzen. Das ist deutlich genug für mich:

  

BUGS

     

Verwenden Sie niemals gets (). Denn es ist unmöglich, ohne zu sagen, die Daten zu wissen, in   vorzurücken, wie viele Zeichen gets () wird gelesen, und da gets () wird auch weiterhin zu speichern,   Zeichen über das Ende des Puffers, ist es extrem gefährlich zu verwenden. Es hat   verwendet worden, um Computer-Sicherheit zu brechen. Verwenden Sie fgets () statt.

Mit fgets () anstelle von gets ()

char buffer[BUFSIZ];
/* gets(buffer); */
fgets(buffer,sizeof(buffer), stdin);

Die gets () Funktion, um die Länge des Puffers nicht überprüft und kann über das Ende schreiben und den Stapel verändern. Dies ist der „Pufferüberlauf“ Sie hören zu.

Es gibt wirklich keinen guten Grund, gets() zu verwenden. Auch die C-Standard sagt, es obsolescent ist! Verwenden Sie fgets() statt.

[Bearbeiten]

Es sieht aus wie die Warnung von dem Linker kommt. Haben Sie Warnung erhalten, wenn sie mit -c Kompilieren? (Welche deaktiviert Verknüpfung.)

Sie nicht die gets Funktion überhaupt verwenden sollte, sagt der manpage fgets zu verwenden, anstatt.

GCC bietet keine Funktionalität, die GCC tut Warnungen deaktivieren mit Pragmas. Sie müssen die verschiedenen Warnung Optionen als Flags der Compiler statt.

Vorschlagen sicheren Ersatz für gets().

Code in vorhandenen, ersetzen gets(), kann es nicht verwenden fgets() gewünscht werden, da diese Funktion einen zusätzlichen char erfordert die '\n' zu speichern, die beiden Funktionen verbrauchen, aber gets() speichert nicht. Im Anschluss wird ein Ersatz, der nicht eine größere Puffergröße erforderlich ist.

Jeder gets(dest) mit ist ersetzen:
Wenn dest ein Array ist, verwenden gets_sz(dest, sizeof dest)
Wenn dest ist ein Zeiger auf einen char Array der Größe n, Verwendung gets_sz(dest, n)

char *gets_sz(char *dest, size_t size) {
    if (size <= 1) {
        if (size <= 0 || feof(stdin)) {
            return NULL;
        }
    }
    size--;
    size_t i;
    for (i = 0; i < size; i++) {
        int ch = getchar();
        if (ch == EOF) {
            if (i == 0)
                return NULL;
            break;
        }
        if (ch == '\n')
            break;
        dest[i] = (char) ch;
    }
    dest[i] = 0;
    return dest;
}

Wenn Sie es wirklich verwenden möchten, versuchen Sie die Flagge -fsyntax-only.

Das Handbuch in gcc Webseite sagt:

  

-fsyntax-only

Check the code for syntax errors, but don't do anything beyond that.

-fno-stack-protector ist eine Option, die gets() Funktion trotz, wie unsicher verwendet werden können es ist.

-Wno-deprecated-declarations schaltet die deprecation Warnung

Hier ist ein Beispiel mit gets() der Erstellung

gcc myprogram.c -o myprogram -fno-stack-protector -Wno-deprecated-declarations

ich mit jeder zustimmen, der sagt, dass es völlig unsicher ist, da es ein Programm ermöglicht einen Puffer überlaufen. Dies kann sehr gefährlich sein und daher der Grund, warum es für fgets sind veraltet.

Wenn Sie jedoch ein Intro zu Sicherheits Kurs nehmen, ein kleines Testprogramm zu schreiben in der Lage, mit den Konzepten der Puffer spielen überrannt und Stapelüberlauf ist sehr hilfreich.

Im Gegensatz zur landläufigen Meinung, nicht alle Programmierer sind ebenso unaufmerksam, was sie schreiben. gets() wird in C90 immer Standard sein, und es wurde in der Bibliothek für mehrere gute Gründe setzen. Es ist nicht mehr „gefährlich“ als jede andere String-Funktion, wenn in geeigneter Weise, wie in Programmbeispielen, Dokumentation, Unit-Test-Gerüste, Hausaufgaben verwendet, etc.

Darüber hinaus verbessert die Lesbarkeit gets() in einer Weise, die auch nie fgets(). Und man nie hat einen Gedankengang zu unterbrechen, bis zu schauen, was Ordnung in ihre Argumente zu setzen.

Die folgende Problemumgehung verwendet meine anderen Lieblings Funktion der Newline zu entfernen. :)

 #define gets GET_LOST
 #include "stdio.h"
 #undef gets

 #include "limits.h"

 char *gets(char *s)
 {
    return strtok(fgets(s, INT_MAX, stdin), "\n");
 }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top