> Dans son message précédent, "Loïc Joly" a écrit :
>
>>
>> Je dirais qu'en général (surtout dans du code de débutant), utiliser
>> des tableaux de caractères pour gérer des chaines de caractères est
>> une erreur de design, qui va probablement être à l'origine de
>> nombreuses erreurs de codage.
>
>
> Votre affirmation m'interpelle, comme on dit... Pourriez-vous me dire
> sur quoi se fonde votre opinion, et ce que vous proposez comme alternative?
> Bien à vous.
Tout simplement parcequ'il n'y a pas de vérification sur l'indice d'un
tableau de caractères.
On peut très bien écrire
char my_string[64];
my_string[100] = 'a';
Tu ecrasses donc une partie de tas (?) et il se peut qu'à l'adresse
my_string[100] se trouve le pointeur de retour de fonction (pointeur qui
indique au programme où "sauter" quand le fonction se termine). On peut
donc changer cette valeur et lancer un autre bout de programme
(typiquement, lancer un shell sous Unix)
Il y a plein de programmes qui se font avoir, et ce sont des erreurs
assez dures à trouver.
sprintf( my_string, "une chaine de plus de 100 char..." );...
Cherche sur Google pour avoir plus d'info sur le buffer overflow...
Il faut éviter les fonctions strcpy(3), strcat(3), sprintf(3), scanf,
gets(3) et d'autres... strncpy, strncat, snprintf (?) résolvent le problème.
Mais le plus simple est encore d'utiliser les std::string qui gérent les
accès mémoires d'elle-même.
--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/
--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
kanze
Benoit Rousseau wrote in message news:<3fd32cec$0$2853$...
phneveu wrote:
Je dirais qu'en général (surtout dans du code de débutant), utiliser des tableaux de caractères pour gérer des chaines de caractères est une erreur de design, qui va probablement être à l'origine de nombreuses erreurs de codage.
Votre affirmation m'interpelle, comme on dit... Pourriez-vous me dire sur quoi se fonde votre opinion, et ce que vous proposez comme alternative? Bien à vous.
Tout simplement parcequ'il n'y a pas de vérification sur l'indice d'un tableau de caractères.
On peut très bien écrire char my_string[64]; my_string[100] = 'a';
De même qu'avec std::string.
Tu ecrasses donc une partie de tas (?) et il se peut qu'à l'adresse my_string[100] se trouve le pointeur de retour de fonction (pointeur qui indique au programme où "sauter" quand le fonction se termine).
Si le char my_string[] se trouve sur la pile, on risque d'écraser l'adresse de rétour de la fonction.
Si on fait la même chose avec std::string, or risque d'écraser d'autre chose dans le tas, y compris des mots qui servent au système pour gérer le tas.
En fait, dans les deux cas, on a un comportement indéfini selon la norme, et on risque réelement gros.
On peut donc changer cette valeur et lancer un autre bout de programme (typiquement, lancer un shell sous Unix) Il y a plein de programmes qui se font avoir, et ce sont des erreurs assez dures à trouver. sprintf( my_string, "une chaine de plus de 100 char..." );... Cherche sur Google pour avoir plus d'info sur le buffer overflow...
Il faut éviter les fonctions strcpy(3), strcat(3), sprintf(3), scanf, gets(3) et d'autres... strncpy, strncat, snprintf (?) résolvent le problème.
Pas aussi bien que tu as l'air de penser. Snprintf, ça va encore (mais ce n'est standard qu'un C, non en C++), mais strncpy ou strncat ne mettent pas toujours un ' ' à la fin.
Mais le plus simple est encore d'utiliser les std::string qui gérent les accès mémoires d'elle-même.
Surtout, il gère les allocations dynamiques de la mémoire, y compris l'agrandissement quand on le démande. Donc, si on ne peut pas faire un [i] n'importe où, on peut bien ajouter les caractères à la fin, au moyen de push_back, sans s'occuper de la taille.
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Benoit Rousseau <not.provided@no.spam> wrote in message
news:<3fd32cec$0$2853$ba620e4c@reader1.news.skynet.be>...
phneveu wrote:
Je dirais qu'en général (surtout dans du code de débutant),
utiliser des tableaux de caractères pour gérer des chaines de
caractères est une erreur de design, qui va probablement être à
l'origine de nombreuses erreurs de codage.
Votre affirmation m'interpelle, comme on dit... Pourriez-vous me
dire sur quoi se fonde votre opinion, et ce que vous proposez comme
alternative? Bien à vous.
Tout simplement parcequ'il n'y a pas de vérification sur l'indice d'un
tableau de caractères.
On peut très bien écrire
char my_string[64];
my_string[100] = 'a';
De même qu'avec std::string.
Tu ecrasses donc une partie de tas (?) et il se peut qu'à l'adresse
my_string[100] se trouve le pointeur de retour de fonction (pointeur
qui indique au programme où "sauter" quand le fonction se termine).
Si le char my_string[] se trouve sur la pile, on risque d'écraser
l'adresse de rétour de la fonction.
Si on fait la même chose avec std::string, or risque d'écraser d'autre
chose dans le tas, y compris des mots qui servent au système pour gérer
le tas.
En fait, dans les deux cas, on a un comportement indéfini selon la
norme, et on risque réelement gros.
On peut donc changer cette valeur et lancer un autre bout de programme
(typiquement, lancer un shell sous Unix)
Il y a plein de programmes qui se font avoir, et ce sont des erreurs
assez dures à trouver.
sprintf( my_string, "une chaine de plus de 100 char..." );...
Cherche sur Google pour avoir plus d'info sur le buffer overflow...
Il faut éviter les fonctions strcpy(3), strcat(3), sprintf(3), scanf,
gets(3) et d'autres... strncpy, strncat, snprintf (?) résolvent le
problème.
Pas aussi bien que tu as l'air de penser. Snprintf, ça va encore (mais
ce n'est standard qu'un C, non en C++), mais strncpy ou strncat ne
mettent pas toujours un ' ' à la fin.
Mais le plus simple est encore d'utiliser les std::string qui gérent
les accès mémoires d'elle-même.
Surtout, il gère les allocations dynamiques de la mémoire, y compris
l'agrandissement quand on le démande. Donc, si on ne peut pas faire un
[i] n'importe où, on peut bien ajouter les caractères à la fin, au moyen
de push_back, sans s'occuper de la taille.
--
James Kanze GABI Software mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Benoit Rousseau wrote in message news:<3fd32cec$0$2853$...
phneveu wrote:
Je dirais qu'en général (surtout dans du code de débutant), utiliser des tableaux de caractères pour gérer des chaines de caractères est une erreur de design, qui va probablement être à l'origine de nombreuses erreurs de codage.
Votre affirmation m'interpelle, comme on dit... Pourriez-vous me dire sur quoi se fonde votre opinion, et ce que vous proposez comme alternative? Bien à vous.
Tout simplement parcequ'il n'y a pas de vérification sur l'indice d'un tableau de caractères.
On peut très bien écrire char my_string[64]; my_string[100] = 'a';
De même qu'avec std::string.
Tu ecrasses donc une partie de tas (?) et il se peut qu'à l'adresse my_string[100] se trouve le pointeur de retour de fonction (pointeur qui indique au programme où "sauter" quand le fonction se termine).
Si le char my_string[] se trouve sur la pile, on risque d'écraser l'adresse de rétour de la fonction.
Si on fait la même chose avec std::string, or risque d'écraser d'autre chose dans le tas, y compris des mots qui servent au système pour gérer le tas.
En fait, dans les deux cas, on a un comportement indéfini selon la norme, et on risque réelement gros.
On peut donc changer cette valeur et lancer un autre bout de programme (typiquement, lancer un shell sous Unix) Il y a plein de programmes qui se font avoir, et ce sont des erreurs assez dures à trouver. sprintf( my_string, "une chaine de plus de 100 char..." );... Cherche sur Google pour avoir plus d'info sur le buffer overflow...
Il faut éviter les fonctions strcpy(3), strcat(3), sprintf(3), scanf, gets(3) et d'autres... strncpy, strncat, snprintf (?) résolvent le problème.
Pas aussi bien que tu as l'air de penser. Snprintf, ça va encore (mais ce n'est standard qu'un C, non en C++), mais strncpy ou strncat ne mettent pas toujours un ' ' à la fin.
Mais le plus simple est encore d'utiliser les std::string qui gérent les accès mémoires d'elle-même.
Surtout, il gère les allocations dynamiques de la mémoire, y compris l'agrandissement quand on le démande. Donc, si on ne peut pas faire un [i] n'importe où, on peut bien ajouter les caractères à la fin, au moyen de push_back, sans s'occuper de la taille.
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16