PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : `gets' function is dangerous



alchimist
07-11-2001, 00:29
Hi All,
naja irgendwie habe ich ein kleines problem.
Was mich stoert ist folgendes. Ich will die Eingabe eines strings von der konsole haben. und dazu verwende ich folgendes.
puts("Dateiname für Werte: ");
if(gets(file_name_daten) == NULL) {
printf("Kann Eingabe nicht lesen.\n Beende Programm\n.");
exit (1);
}
else {......}

beim compilieren mit gcc -o xxx xxx.c
erhalte ich folgende warnung

/tmp/ccXzO3mW.o: In function `main':
/tmp/ccXzO3mW.o(.text+0x6d6): the `gets' function is dangerous and should not be used.

So das ist es auch schon. Das Programm funktioniert zwar, aber mich stoert die Warnung und ich glaube das sich irgendwie dabei ein Folgefehler einschleicht.
Fals jmd. eine alternative kennt, oder weiss was ich beheben kann der kann ja was dazu schreiben.
Danke :-)

Jimmy
07-11-2001, 06:32
Hi!

Du kannst ja den String mit der scanf()-Funktion einlesen und dann mit einem strlen() die Länge prüfen. Damit müsstest du imho das gleiche erreichen können und du hast die Warning mit gets() nicht mehr.

Gruß Jimmy

P.S. Ich hab noch den Grund gefunden warum das gets() so "gefährlich" ist:

The gets() function, is so dangerous that you should remove it from your code immediately. It copies user input directly into a buffer once it reaches the end of a line. There is no way to tell the function how much it should copy.

Das ganze hab ich von http://security.devx.com/upload/free/features/zones/security/articles/2000/12dec00/mh1200/mh1200-1.asp

Ist zwar über Win32 programmierung, aber ich bin mir sicher bei der gets() trifft das auch auf Linux und Unix Systeme zu.

thommy
07-11-2001, 08:54
Beispiel mit fscanf:

#include <stdio.h>

int main(){
char input[10];

fscanf(stdin, "%9s", input);
printf("%s", input);

return 0;
}

Oder - eleganter - gleich mit C++:

#include <iostream>
#include <string>
using namespace std;

int main(){
string input;

cin >> input;
cout << input << endl;

return 0;
}

Thomas

jgbauman
07-11-2001, 10:17
vergiss sauch canf(), kann auch gefährlich sein und ist für alles ausser strings unberechenbar.

Dann doch lieber gleich fgets(). Hier kannst Du eine maximale Länge angeben und Bufferoverflows vermeiden.

alchimist
07-11-2001, 11:01
hi danke fuer die flotten antworten werde mich sogleich aufmachen und das ganze mal checken od es was kann.

Cu