7
votes

Désactiver AVERTISSEMENT: la fonction `obtient 'est dangereuse dans GCC via des fichiers d'en-tête?

J'utilise la fonction obtient () code> dans mon code C. Mon code fonctionne bien, mais je reçois un message d'avertissement

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


0 commentaires

10 Réponses :


27
votes

La réponse évidente est d'apprendre de ce que le compilateur essaie de vous dire - vous ne devriez jamais utiliser obtenu (), car il est totalement dangereux. Utilisez fgets () à la place, ce qui vous permet d'éviter d'éventuelles dépassements de tampon.

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


3 commentaires

Dans la vie réelle, vous voudrez probablement utiliser Taillefuff au lieu de dupliquer la taille du tampon.


Dans la vie réelle, vous voudrez former la mémoire tampon via une constante, telle que le bufflage et également l'appel dans l'appel des Fgets ().


Cela ne répond pas à la question.



9
votes

Je voudrais tenir compte de l'avertissement et de remplacer obtient . Ceci est assez clair pour moi:

bugs

Ne jamais utiliser obtient (). Parce qu'il est impossible de dire sans connaître les données dans avancer combien de caractères obtiennent () lira () et parce que Gets () continuera de stocker Personnages au-delà de la fin du tampon, il est extrêmement dangereux d'utiliser. Il a été utilisé pour briser la sécurité informatique. Utilisez des fgets () à la place.


0 commentaires

9
votes

Utiliser des fgets () au lieu d'obtenir () xxx

la fonction obtenue () ne vérifie pas la longueur du tampon et peut écrire après la fin et altérer la pile. C'est le "débordement tampon" que vous entendez parler.


0 commentaires

5
votes

Vous ne devriez pas utiliser le fonctionner du tout, le MANPAGE dit d'utiliser fgets à la place.

GCC ne fournit pas la fonctionnalité que GCC fait pour désactiver les avertissements à l'aide de pragmas. Vous devez utiliser les différents en tant que drapeaux à la compilateur à la place.


1 commentaires

Cet avertissement est donné par la liaison. Je ne sais pas un moyen de le désactiver.



6
votes

Il n'y a vraiment aucune bonne raison d'utiliser obtient () . Même la norme C dit qu'il est obsolète! Utilisez fgets () à la place.

[modifier]

On dirait que l'avertissement provient de la liaison. Avez-vous des avertissements lors de la compilation avec -c ? (Qui désactive la liaison.)


0 commentaires

25
votes

Si vous voulez vraiment l'utiliser.

Voici la réponse de: http://www.gamev.net/community/forums/topic.asp?topic_id=523641

Si vous utilisez une version raisonnablement récente de GCC, vous pouvez utiliser: xxx

par exemple, si ces en-têtes produisent une erreur "de la comparaison de points flottants est dangereuse", vous utiliseriez: xxx

malheureusement, Vous ne pouvez pas désactiver «-wall» de cette façon (ce serait trop facile, ce ne serait-il pas ...), vous devez faire les options d'avertissement individuelles qui permettent à la main (au moins, les contradictoires).

docs: http: //gcc.gnu. Org / Onlinedocs / GCC / Diagnostic-Pragmas.html # Diagnostic-Pragmas

Edit: Mais cela ne semble pas fonctionner pour obtenir un avertissement ... J'ai essayé sur mon PC.


2 commentaires

+1 Bien que je suis d'accord que cela devienne () ne doit pas être utilisé, vous êtes le seul à avoir répondu à la question de Op :)


Cela ne fonctionne que pour les diagnostics émis par le compilateur . Le message "Get est dangereux" provient de la liant et d'Afaik il n'y a aucun moyen de le désactiver.



-4
votes

Contrairement à l'opinion populaire, tous les programmeurs ne sont pas aussi attentifs à ce qu'ils écrivent. obtient () sera toujours standard en C90 et il a été mis dans la bibliothèque pour plusieurs bonnes raisons. Ce n'est plus "dangereux" que toute autre fonction de chaîne lorsqu'elle est utilisée de manière appropriée, telle que dans les exemples de programme, la documentation, les échafaudages de test d'unités, les devoirs, etc.

De plus, Obtient () Améliore la lisibilité D'une manière que fgets () ne le sera jamais. Et on n'a jamais besoin d'interrompre le train de la pensée pour rechercher ce que l'ordre de mettre ses arguments.

La solution suivante utilise mon autre fonction favorite pour supprimer la nouvelle ligne. :) xxx


2 commentaires

Qui signe une réponse donc avec son nom, son numéro de téléphone et une date?


Si l'entrée utilisateur consiste uniquement à compter '\ n' , cette routine renvoie null . Original obtient () renvoyé "" .



1
votes

Suggérez un substitut sécurisé pour obtient () .

dans le code existant, pour remplacer obtient () , il peut ne pas être souhaité d'utiliser fgets () comme cette fonction nécessite un supplémentaire pour enregistrer le '\ n' que les deux fonctions consomment, mais obtient () ne sauvegarde pas. Voici un substitut qui ne nécessite pas une plus grande taille de tampon.

Chaque obtient (DEST) est remplacé par:
Si DEST est une matrice, utilisez get_sz (Dest, TIZEOF DE DESTS)
Si DEST est un pointeur sur un tableau de format n , utilisez get_sz (Dest, n) xxx


0 commentaires

0
votes

Si vous voulez vraiment l'utiliser, essayez le drapeau -fsyntax-uniquement code>.

le manuel dans Site Web de GCC dit: P>

-fsyntax-seulement code> p>

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


0 commentaires

1
votes

-fno-stack-protecteur code> est une option qui permet à la fonction () code> fonctionner pour être utilisée malgré leur inauguration.

-wno-dépréciation-déclarés-déclarés code> désactive l'avertissement de dépréciation p>

Voici un exemple de compilation avec obtient () code> p>

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


1 commentaires

Je pense que l'éducation en matière de sécurité est définitivement une exception (la seule exception?) Aux objections stridentes de tous. Quoi qu'il en soit, maintenant que C11 a supprimé obtient de la bibliothèque, même cela ne fonctionne pas.