Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

gets : erreur lors de la compilation

10 réponses
Avatar
ioops
Bonjour,

je suis débutant en c++, j'essaie de réaliser un tit programme
que m'a filé mon prof sans succès à la compilation.

Ce programme utilise la fonction gets.

Lors de la compilation du programme j'obtiens le message d'erreurs
suivant :

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

Merci pour votre aide.

Pascal

10 réponses

Avatar
Horst Kraemer
ioops wrote:

Bonjour,

je suis débutant en c++, j'essaie de réaliser un tit programme
que m'a filé mon prof sans succès à la compilation.

Ce programme utilise la fonction gets.

Lors de la compilation du programme j'obtiens le message d'erreurs
suivant :

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


"warning" ne veut pas dire "erreur". Ce message vous dit que
l'utilisation de la fonction gets est dangereuse et déconseillée.
Il ne s'agit donc que d'un conseil.

Le probleme est que gets accepte une chaine de caratères de longueur
quelconque et que ton programme plantera si la chaine est plus longue
que le tampon que tu as réservée pour gets. C'est tout, mais dans la
"vraie" programmation cela rend inconcevable l'usage de "gets" parce
qu'un programme qui utilise gets peut être détruit par l'entrée d'une
chaine de caractères.

--
Horst

--
Lâche pas la patate!

Avatar
Matthieu Moy
Horst Kraemer writes:

Le probleme est que gets accepte une chaine de caratères de longueur
quelconque et que ton programme plantera si la chaine est plus longue
que le tampon que tu as réservée pour gets. C'est tout, mais dans la
"vraie" programmation cela rend inconcevable l'usage de "gets" parce
qu'un programme qui utilise gets peut être détruit par l'entrée d'une
chaine de caractères.


Si ce n'était que « être détruit », ça ne serait pas encore trop
grave. Le problème est surtout une question de sécurité : Tu autorises
l'utilisateur de ton programme a écrire a un endroit où il n'est pas
censé écrire, et si il est malin, il peut faire faire n'importe quoi a
ton programme.

Si mes souvenirs sont bons, un des premiers vers a s'être propagé sur
le net a grande échelle exploitait une faille de sécurité due a une
utilisation de gets.

(au fait, ici, c'est fr.comp.lang.c++, et en C++, on ferait plutôt ça
avec des streams)

--
Matthieu

Avatar
Fabien LE LEZ
On Sun, 27 Mar 2005 19:33:06 +0200, Horst Kraemer
:

ton programme plantera si la chaine est plus longue
que le tampon que tu as réservée pour gets.


On n'est même pas sûr qu'il plante. En général, les données
supplémentaires iront dans une autre zone mémoire, qui contenait autre
chose au départ. Du coup, on peut obtenir toutes sortes de choses
sympathiques : le programme peut fonctionner sur une machine, donner
des résultats faux sur une autre, et planter sur une troisième ; ou le
programme peut fonctionner pendant des mois, puis un jour on rajoute
une variable dans un .cpp qui n'a rien à voir et tout plante -- et on
met un temps énorme à détecter d'où vient le problème.

gets() est un cas particulier parce qu'il n'est pas possible de
programmer correctement avec ; mais on obtient aussi parfois ce genre
de comportement avec strcpy() si on ne fait pas les vérifications qui
vont bien avant.

Heureusement, depuis, on a inventé le C++, et tout ça n'est plus qu'un
mauvais rêve :-)




--
;-)

Avatar
Fabien LE LEZ
On Sun, 27 Mar 2005 14:54:52 -0800, "Ahmed MOHAMED ALI"
:

Ce n'est pas un message d'erreur


Stricto sensu, si (mais pas au sens "erreur du compilateur") puisqu'un
programme utilisant gets() ne peut pas fonctionner correctement.


--
;-)

Avatar
Ahmed MOHAMED ALI
Salut.
Ce n'est pas un message d'erreur mais un avertissement qui te signale que la
fonction gets n'est pas sécurisée et
que c'est mieux d'utiliser une alterantive ( scanf,getchar...).Ces fonctions
font partie de la librairie standard du langage C.
Le mieux c'est d'utiliser std::cin de la librairie standard du C++.

Ahmed

"ioops" wrote in message
news:
Bonjour,

je suis débutant en c++, j'essaie de réaliser un tit programme
que m'a filé mon prof sans succès à la compilation.

Ce programme utilise la fonction gets.

Lors de la compilation du programme j'obtiens le message d'erreurs
suivant :

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

Merci pour votre aide.

Pascal



Avatar
James Kanze
Matthieu Moy wrote:
Horst Kraemer writes:


Le probleme est que gets accepte une chaine de caratères de
longueur quelconque et que ton programme plantera si la chaine
est plus longue que le tampon que tu as réservée pour gets.
C'est tout, mais dans la "vraie" programmation cela rend
inconcevable l'usage de "gets" parce qu'un programme qui
utilise gets peut être détruit par l'entrée d'une chaine de
caractères.



Si ce n'était que « être détruit », ça ne serait pas encore
trop grave. Le problème est surtout une question de sécurité :
Tu autorises l'utilisateur de ton programme a écrire a un
endroit où il n'est pas censé écrire, et si il est malin, il
peut faire faire n'importe quoi a ton programme.


Si mes souvenirs sont bons, un des premiers vers a s'être
propagé sur le net a grande échelle exploitait une faille de
sécurité due a une utilisation de gets.


Tout à fait.

(au fait, ici, c'est fr.comp.lang.c++, et en C++, on ferait plutôt ça
avec des streams)


Surtout, aussi, avec des std::string, de façon à ce qu'un
débordement du buffer soit impossible.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34


Avatar
James Kanze
Fabien LE LEZ wrote:
On Sun, 27 Mar 2005 19:33:06 +0200, Horst Kraemer
:


ton programme plantera si la chaine est plus longue que le
tampon que tu as réservée pour gets.



gets() est un cas particulier parce qu'il n'est pas possible
de programmer correctement avec ; mais on obtient aussi
parfois ce genre de comportement avec strcpy() si on ne fait
pas les vérifications qui vont bien avant.


En effet. Avec gets(), il est impossible à écrire un programme
correct. Avec sprintf(), c'est impossible à écrire un programme
correct et maintenable. Avec les autres, il faut prendre ses
précautions. (Mais pourquoi g++ râle-t-il pour tmpnam, qui en
révanche est la fonction préférée dans certains contextes ?)

Heureusement, depuis, on a inventé le C++, et tout ça n'est
plus qu'un mauvais rêve :-)


Ne prends pas tes souhaits pour la réalité:-). Comment disait-il
Bjarne : avec C++, c'est beaucoup plus difficile de se tirait
dans le pied, mais quand on le fait, c'est toute la jambe qui
part.

Mais je suis assez sûr que comme toi et moi, il plaisantait. Le
C++ te donne tous les outils nécessaires pour écrire du code
propre et robuste, mais il ne t'oblige nullement à t'en servir.
On pourrait considérer ça comme un défaut, mais force est de
constater que tous les langages que je connais (mais il y a
beaucoup que je ne connais pas) qui essaient d'imposer une
certaine robestesse finissent par t'empècher d'arriver au même
stade de robestesse que le C++ ; il semble qu'il y a toujours
quelque chose que l'auteur a oublié, et en t'obligeant à se
coller à sa conception de robestesse, il t'empèche de bricoler
pour aller au delà.

En fin de compte, la grande force du C++, c'est que l'auteur
avait l'humilité de se rendre compte qu'il n'avait pas la
solution définitive de tous les problèmes de l'informatique, et
de se limiter à nous fournir les outils de créer les solutions.
Mais évidemment, la contrapartie, c'est qu'on est libre à ne pas
les créer ; si le C++ permet tout ce qu'il y a de mieux dans la
programmation, il permet aussi tout ce qu'il ya de pire.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34


Avatar
Penguin_X
ioops wrote:
Bonjour,

je suis débutant en c++, j'essaie de réaliser un tit programme
que m'a filé mon prof sans succès à la compilation.

Ce programme utilise la fonction gets.

Lors de la compilation du programme j'obtiens le message d'erreurs
suivant :

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

Merci pour votre aide.

Pascal

Utilise à la place: cin.getline(tavariablechar,nombre_de_caratceres,'n');


@+

Avatar
Penguin_X
ioops wrote:
Bonjour,

je suis débutant en c++, j'essaie de réaliser un tit programme
que m'a filé mon prof sans succès à la compilation.

Ce programme utilise la fonction gets.

Lors de la compilation du programme j'obtiens le message d'erreurs
suivant :

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

Merci pour votre aide.

Pascal

Si tu veux réellement utiliser gets(), alors compile avec la commande en

plus "Wno-deprecated"

Avatar
kanze
Penguin_X wrote:
ioops wrote:

je suis débutant en c++, j'essaie de réaliser un tit
programme que m'a filé mon prof sans succès à la
compilation.

Ce programme utilise la fonction gets.

Lors de la compilation du programme j'obtiens le message
d'erreurs suivant :

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

Merci pour votre aide.


Si tu veux réellement utiliser gets(), alors compile avec la
commande en plus "Wno-deprecated"


Si ça marche, c'est vraiment tordu, parce que gets() n'est pas
déprécié. (G++ utilise cette option pour gérer les
avertissements de <iostream.h> et al. Dans ce cas-là, c'est
vraiment justifié, parce que les en-têtes en question ne font
pas partie de la norme. Et d'autant plus que le message
d'avertissement indique la possibilité d'utiliser cette option
pour le supprimer.)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34