|
Bas de page | |
---|---|
Auteur | Sujet : Comportement surprenant de strcpy |
el muchacho Comfortably Numb | Attention, question piège spécial experts. Voici un programme tout con.
Ca me sort: sizeof src 37, sizeof dst 37 Normal. Maintenant, si je remplace la ligne 8 par A votre avis, que se passe-t'il à l'exécution ? Que me sort valgrind ? Même question si je remplace la ligne par Appelez-moi noob, mais le résultat est tout de même assez surprenant. Message cité 3 fois Message édité par el muchacho le 09-03-2009 à 22:00:37 --------------- Les aéroports où il fait bon attendre, voila un topic qu'il est bien |
Publicité | Posté le 09-03-2009 à 21:52:15 |
sligor | tu as oublié d'enlever le "-2" après le sizeof dans ton code Message cité 1 fois Message édité par sligor le 09-03-2009 à 21:55:26 |
el muchacho Comfortably Numb | Sur ma plateforme (Linux x86), pour le premier cas, j'ai ceci:
De plus, valgrind n'indique aucune erreur ! Dans le second cas, valgrind n'indique toujours aucune erreur !!! J'ai exactement ceci:
Je n'arrive pas trop à m'expliquer ce comportement. Message édité par el muchacho le 09-03-2009 à 23:14:51 --------------- Les aéroports où il fait bon attendre, voila un topic qu'il est bien |
el muchacho Comfortably Numb |
--------------- Les aéroports où il fait bon attendre, voila un topic qu'il est bien |
sligor | moi dans le "-1" j'ai:
valgrind râle:
et dans le "-2" j'ai:
valgrind râle:
chez moi c'est beaucoup plus compréhensible je dirais que dans ta pile src et dst sont inversés par rapport à la mienne edit: tu peux essayer de rajouter printf("dst-src=%d\n",dst-src); pour voir ? Message cité 1 fois Message édité par sligor le 09-03-2009 à 22:07:51 |
el muchacho Comfortably Numb | Euh, c'est bien le même programme, là ? Parce que l'overlap, je vois vraiment pas pourquoi --------------- Les aéroports où il fait bon attendre, voila un topic qu'il est bien |
sligor |
Message cité 1 fois Message édité par sligor le 09-03-2009 à 22:12:22 |
el muchacho Comfortably Numb |
--------------- Les aéroports où il fait bon attendre, voila un topic qu'il est bien |
el muchacho Comfortably Numb |
Message édité par el muchacho le 09-03-2009 à 22:15:38 --------------- Les aéroports où il fait bon attendre, voila un topic qu'il est bien |
sligor |
ma config: debian lenny, gcc 4.3.2, x86 32bits Message cité 1 fois Message édité par sligor le 09-03-2009 à 22:20:03 |
Publicité | Posté le 09-03-2009 à 22:19:06 |
Taz bisounours-codeur |
el muchacho Comfortably Numb |
Message édité par el muchacho le 09-03-2009 à 22:24:42 --------------- Les aéroports où il fait bon attendre, voila un topic qu'il est bien |
Gf4x3443 Killing perfection |
Tu altères la pile, et le résultat est "indéfini" (dépendant de comment le compilateur va optimiser le code, l'ordre des variables, et probablement l'architecture aussi). Le seul moyen de vraiment en être sur, c'est de regarder le code compilé.
Valgrind a beaucoup de mal à détecter le petage de pile, vu qu'il ne fait pas de bound checking sur des agrégats en pile ou statique. C'est particulièrement difficile à détecter de toute manière, il n'y a pas autant de liberté que dans le tas ou on peut facilement placer des tokens ou des pages invalides pour provoquer des fautes d'accès. Ce cas là de toute manière, tu peux l'empecher avec des canary. Compile avec -fstack-protector... Message cité 2 fois Message édité par Gf4x3443 le 09-03-2009 à 22:34:53 --------------- Petit guide Kerberos pour l'administrateur pressé |
Elmoricq Modérateur |
Rien de surprenant. Les deux résultats sont identiques avec -1 et -2 (aléatoirement), et valgrind devrait te sortir un truc du genre "read out of bound" ou ce genre de chose. strcpy() recopie src dans dst jusqu'à trouver un '\0'. Sans se préoccuper de la taille de dst. Donc ça recopie src dans dst en dépassant les capacités de cette dernière variable. edit : ah ok j'avais pas lu la suite, et je me serais attendu aussi à ce que valgrind râle. Oubliez mon post qui arrive comme un cheveu sur la soupe. Message édité par Elmoricq le 09-03-2009 à 22:37:13 |
sligor |
Message cité 1 fois Message édité par sligor le 09-03-2009 à 22:49:50 |
Taz bisounours-codeur |
el muchacho Comfortably Numb |
Message édité par el muchacho le 09-03-2009 à 22:46:48 --------------- Les aéroports où il fait bon attendre, voila un topic qu'il est bien |
el muchacho Comfortably Numb | Ah putaing, cong, en fait, sligor a raison : avec le -1, j'ai +37 ! gcc change l'ordre des chaînes dans la pile ! --------------- Les aéroports où il fait bon attendre, voila un topic qu'il est bien |
sligor | donc du coup la corruption de pile est plus logique, tout s'explique |
el muchacho Comfortably Numb |
Gf4x3443 Killing perfection |
Ayé, je compatis. J'ai eu aussi des problèmes avec des LARGE_INTEGER avec MinGW. Je me rappelle avoir passé ma semaine à essayer de comprendre pourquoi je n'avais pas de bonnes valeurs affichées dans des printf(). En fait, c'est là tout le challenge: entre un code source et le code compilé, c'est non trivial de qualifier du code aujourd'hui. Enfin du moins, dans de l'embarqué, ca m'a valu quelques crises Message cité 1 fois Message édité par Gf4x3443 le 09-03-2009 à 22:53:03 --------------- Petit guide Kerberos pour l'administrateur pressé |
Elmoricq Modérateur |
Hm. C'est pas un problème de norme plutôt ? Je zone les manpages depuis 5min, et il y en a avec hh, et d'autres sans. edit : trouvé. "hh" c'est bien C99, d'où les différences de comportement avec certains compilateurs pas à jour. Message cité 1 fois Message édité par Elmoricq le 09-03-2009 à 22:57:16 |
el muchacho Comfortably Numb | Sinon, le -fstack-protector, j'ai pas trop vu son effet. --------------- Les aéroports où il fait bon attendre, voila un topic qu'il est bien |
el muchacho Comfortably Numb |
--------------- Les aéroports où il fait bon attendre, voila un topic qu'il est bien |
sligor |
Message édité par sligor le 09-03-2009 à 22:58:42 |
Elmoricq Modérateur | J'ai édité mon post 4s avant ta réponse.
|
Gf4x3443 Killing perfection | Il n'aborte pas avec -1?
--------------- Petit guide Kerberos pour l'administrateur pressé |
sligor | c'est indéterminé ça dépends de plein de choses, on était plus parti pour comprendre ce qu'il se passait plus exactement sur la machine de el muchacho Message édité par sligor le 09-03-2009 à 23:06:33 |
el muchacho Comfortably Numb | Chez moi, il n'en a rien à secouer. Je suppose que c'est exactement pour la même raison qu'au-dessus, à savoir que l'ordre des chaînes sur la pile est bizarrement inversé quand je réduis la taille de dst. Ce qui est bizarre, c'est que gcc se comporte comme ça que chez moi (avec les options de compilation par défaut). Message édité par el muchacho le 09-03-2009 à 23:09:53 --------------- Les aéroports où il fait bon attendre, voila un topic qu'il est bien |
Gf4x3443 Killing perfection | Ca c'est fun. C'est quelle version 4 de gcc? 4.1.2 ici (sous NetBSD), pas d'inversion dans les adresses des tableaux, ca fait -37, -36, -35, ... quand je réduis dst. Message édité par Gf4x3443 le 09-03-2009 à 23:11:48 --------------- Petit guide Kerberos pour l'administrateur pressé |
el muchacho Comfortably Numb |
Message édité par el muchacho le 09-03-2009 à 23:17:03 --------------- Les aéroports où il fait bon attendre, voila un topic qu'il est bien |
Emmanuel Delahaye C is a sharp tool |
--------------- Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/ |
Emmanuel Delahaye C is a sharp tool |
--------------- Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/ |
tpierron |
Le pire c'est que j'avais fait un test rapide pour voir si ça fonctionnait. Comme l'ordre des octets était little-endian, la seule chose qui merdait était le stack overflow (que je n'avais pas pensé à vérifié dans mon test). En big endian, j'aurais vu directement le problème, puisque tout aurait valu 0 (vu que je convertissais des nombres < 10). En fait, le comportement que j'attendais était que le code de retour reflète les formats de conversion non reconnu, jamais j'aurais imaginé que cette lib puisse écrire un int dans un char .
|
Publicité | Posté le |
Sujets relatifs | |
---|---|
Sémaphore Posix anonyme - comportement inexpliqué | Comportement étrange avec IE / Firefox OK |
[PHP][résolu] Include et global -- comportement étrange -- | [Plone] Customisation du comportement d'un lien |
Debug d'ASP.net : Comportement de Visual Studio et IIS | shmget: comportement que je ne comprends pas |
Comportement d'une boucle sur un tableau modifié dans la boucle | [C++] comportement GCC |
Comportement des string | Comportement bizarre sous IE7 => bug? |
Plus de sujets relatifs à : Comportement surprenant de strcpy |