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.
10 Réponses :
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
Dans la vie réelle, vous voudrez probablement utiliser Taillefuff code> 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.
Je voudrais tenir compte de l'avertissement et de remplacer bugs p>
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. P>
blockQuote> obtient code>. Ceci est assez clair pour moi: P>
Utiliser des fgets () au lieu d'obtenir () 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. P> p>
Vous ne devriez pas utiliser le code> fonctionner code> du tout, le MANPAGE dit d'utiliser 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. P> fgets code> à la place. p>
Cet avertissement est donné par la liaison. Je ne sais pas un moyen de le désactiver.
Il n'y a vraiment aucune bonne raison d'utiliser [modifier] p>
On dirait que l'avertissement provient de la liaison. Avez-vous des avertissements lors de la compilation avec obtient () code>. Même la norme C dit qu'il est obsolète! Utilisez
fgets () code> à la place. P>
-c code>? (Qui désactive la liaison.) P>
Si vous voulez vraiment l'utiliser.
Voici la réponse de: http://www.gamev.net/community/forums/topic.asp?topic_id=523641 p>
Si vous utilisez une version raisonnablement récente de GCC, vous pouvez utiliser: P > par exemple, si ces en-têtes produisent une erreur "de la comparaison de points flottants est dangereuse", vous utiliseriez: p> 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). p> docs: http: //gcc.gnu. Org / Onlinedocs / GCC / Diagnostic-Pragmas.html # Diagnostic-Pragmas P> Edit: strong>
Mais cela ne semble pas fonctionner pour obtenir un avertissement ... J'ai essayé sur mon PC. P> p>
+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 i>. Le message "Get est dangereux" provient de la liant i> et d'Afaik il n'y a aucun moyen de le désactiver.
Contrairement à l'opinion populaire, tous les programmeurs ne sont pas aussi attentifs à ce qu'ils écrivent. De plus, La solution suivante utilise mon autre fonction favorite pour supprimer la nouvelle ligne. :) p> obtient () code> 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.
Obtient () Code> Améliore la lisibilité D'une manière que
fgets () code> 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. P>
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' code>, cette routine renvoie
null code>. Original
obtient () code> renvoyé
"" code>.
Suggérez un substitut sécurisé pour dans le code existant, pour remplacer Chaque obtient () code>.
obtient () code>, il peut ne pas être souhaité d'utiliser
fgets () code> comme cette fonction nécessite un
supplémentaire code> pour enregistrer le
'\ n' code> que les deux fonctions consomment, mais
obtient () code> ne sauvegarde pas. Voici un substitut qui ne nécessite pas une plus grande taille de tampon. P>
obtient (DEST) code> est remplacé par:
Si DEST code> est une matrice, utilisez
get_sz (Dest, TIZEOF DE DESTS) CODE>
Si DEST code> est un pointeur sur un tableau code> de format
n code>, utilisez
get_sz (Dest, n) code> p>
Si vous voulez vraiment l'utiliser, essayez le drapeau le manuel dans Site Web de GCC dit: P> -fsyntax-uniquement code>.
-fsyntax-seulement code> p>
Check the code for syntax errors, but don't do anything beyond that.
Voici un exemple de compilation avec -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>
obtient () code> p>
gcc myprogram.c -o myprogram -fno-stack-protector -Wno-deprecated-declarations
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 code> de la bibliothèque, même cela ne fonctionne pas.