Question

J'utilise la fonction gets () 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.

Je souhaite que ce message d'avertissement ne s'affiche pas. Y a-t-il un moyen?

Je me demande s'il pourrait exister de telles possibilités en créant un fichier d'en-tête permettant de désactiver certains avertissements. Ou y a-t-il une option lors de la compilation qui puisse me servir? Ou peut-être existe-t-il un moyen particulier d'utiliser gets () pour que cet avertissement ne s'affiche pas?

Était-ce utile?

La solution

La réponse évidente est d’apprendre de ce que le compilateur essaie de vous dire - vous ne devriez jamais, jamais, utiliser gets (), car c’est totalement dangereux. Utilisez plutôt fgets () , ce qui vous permet d'éviter les éventuels dépassements de mémoire tampon.

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

Autres conseils

Si vous voulez vraiment l'utiliser.

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

Si vous utilisez une version relativement récente de gcc, vous pouvez utiliser:

#pragma GCC diagnostic ignored "your option here"

Par exemple, si ces en-têtes génèrent une "comparaison en virgule flottante non sûre", erreur, vous utiliseriez:

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

Malheureusement, vous ne pouvez pas désactiver " -Wall " De cette façon (ce serait trop facile, n'est-ce pas ...), vous devez définir les options d'avertissement individuelles que -Wall permet d'activer à la main (au moins les options en conflit).

Docs: http://gcc.gnu.org/ onlinedocs / gcc / Diagnostic-Pragmas.html # Diagnostic-Pragmas

MODIFIER: Mais il semble que ça ne marche pas pour se prévenir ... j’ai essayé sur mon pc.

Je tenais compte de l'avertissement et je remplaçais obtient . C’est assez clair pour moi:

  

BOGUES

     

N'utilisez jamais gets (). Parce qu'il est impossible de dire sans connaître les données de   avance combien de caractères get () lira, et parce que gets () continuera à stocker   après la fin de la mémoire tampon, son utilisation est extrêmement dangereuse. Il a   été utilisé pour casser la sécurité informatique. Utilisez fgets () à la place.

Utilisez fgets () au lieu de gets ()

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

La fonction gets () ne vérifie pas la longueur du tampon et peut écrire au-delà de la fin et modifier la pile. C’est le " buffer overflow " vous entendez parler.

Il n'y a vraiment aucune bonne raison d'utiliser gets () . Même la norme C dit que c'est obsolète! Utilisez plutôt fgets () .

[Modifier]

Il semble que l'avertissement provienne de l'éditeur de liens. Recevez-vous un avertissement lors de la compilation avec -c ? (Ce qui désactive la liaison.)

Vous ne devriez pas utiliser la fonction gets , la page de manuel dit d'utiliser plutôt fgets .

GCC ne fournit pas la fonctionnalité utilisée par GCC pour désactiver les avertissements à l'aide de pragmas. Vous devez utiliser les différentes options d'avertissement comme indicateurs du compilateur à la place.

Suggérez un substitut sûr à gets () .

Dans le code existant, pour remplacer gets () , il peut ne pas être souhaitable d'utiliser fgets () car cette fonction nécessite un char pour enregistrer le '\ n' consommé par les deux fonctions, mais gets () ne sera pas enregistré. Voici un substitut qui ne nécessite pas une taille de tampon plus grande.

Chaque obtient (destination) est remplacé par:
Si dest est un tableau, utilisez gets_sz (dest, sizeof dest)
Si dest est un pointeur sur un tableau char de taille n , utilisez 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;
}

Si vous voulez vraiment l'utiliser, essayez l'indicateur -fsyntax-only .

Le manuel dans le site Web gcc dit:

  

-fsyntax-only

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

-fno-stack-protector est une option qui permet à la fonction gets () d'être utilisée malgré son caractère non sécurisé.

-Wno-deprecated-declarations désactive l'avertissement relatif à la désapprobation

Voici un exemple de compilation avec gets ()

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

Je suis d'accord avec tous ceux qui disent que c'est complètement dangereux car cela permet à un programme de saturer un tampon. Cela peut être assez dangereux et c'est pourquoi il a été déconseillé en faveur de fgets.

Cependant, si vous suivez un cours d'introduction à la sécurité, il est très utile de pouvoir écrire un petit programme de test pour jouer avec les concepts de dépassement de mémoire tampon et de débordement de pile.

Contrairement à l’opinion populaire, tous les programmeurs ne sont pas également indifférents à ce qu’ils écrivent. gets () sera toujours standard en C90 et il a été placé dans la bibliothèque pour plusieurs bonnes raisons. Ce n'est plus "dangereux" que toute autre fonction de chaîne utilisée correctement, par exemple dans les exemples de programme, la documentation, les échafaudages de test unitaire, les devoirs, etc.

De plus, gets () améliore la lisibilité d'une manière que fgets () n'améliorera jamais. Et il n’est jamais nécessaire d’interrompre ses réflexions pour rechercher dans quel ordre placer ses arguments.

La solution de contournement suivante utilise mon autre fonction préférée pour supprimer la nouvelle ligne. :)

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

 #include "limits.h"

 char *gets(char *s)
 {
    return strtok(fgets(s, INT_MAX, stdin), "\n");
 }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top