IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[const]Diff�rence comportement C/C++


Sujet :

C++

  1. #1
    Membre confirm�
    Profil pro
    Ing�nieur consultant
    Inscrit en
    Novembre 2004
    Messages
    64
    D�tails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Ing�nieur consultant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Par d�faut [const]Diff�rence comportement C/C++
    Quelqu'un arrive-t-il � expliquer le comportement ce code un fois compil� (avec g++) puis ex�cuter:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    int main()
    {
    	const int a = 2;
    	int * pa;
    	const int * cpa;
     
    	cpa = &a;
    	pa = (int*)cpa; //Pour gruger le mot clé const
    	*pa = 4;
     
    	printf("a = %d\n", a);
    	printf("*pa = %d\n", *pa);
     
    	return 0;
    }
    On a alors la sortie suivante :

    a = 2
    *pa = 4

    Pourquoi n'a-t-on pas :

    a = 4
    *pa = 4

    pa est cens� point� le contenu de a ?
    c'est d'ailleurs le r�sultat obtenu avec gcc...

  2. #2
    Membre Expert

    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Ao�t 2004
    Messages
    1 391
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, Doubs (Franche Comt�)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 1 391
    Par d�faut
    Tu veus encore plus �tonnant :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    const int ca = 0;
    int& ra = const_cast<int&>(ca);
    ++ra;
    std::cout << ra << ca;
    std::cout << &ra << &ca;
    Les objets sont � la m�me adresse mais n'ont pas la m�me valeur !
    Je suis pas certain (pas r�ussi � v�rifier dans la norme), mais je crois que quand tu d�finis une variable constante sur un type fondamentale alors la valeur est imuable quoique tu fasses. (comment je sais pas, soit il remplace de mani�re lit�ral mais j'en doute, soit il stoocke la variable dans une table innaccesible et l'utilise d�s qu'il voit la variable nue, ie ca).

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Salut

    Si tu regardes le code assembl� (avec visual studio) :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    	printf("a = %d\n", a);
    004113DA  mov         esi,esp 
    004113DC  push        2    
    004113DE  push        offset string "a = %d\n" (41580Ch)
    L� ou a est utilis�, le compilo met directement en dur la valeur que tu lui a donn� � son initialisation. C'est tr�s bien d'ailleurs, car c'est mal de vouloir gruger const

  4. #4
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par d�faut
    C'est pas un comportement ind�fini de vouloir modifier la valeur d'une constante manifeste ?

  5. #5
    Membre confirm�
    Profil pro
    Ing�nieur consultant
    Inscrit en
    Novembre 2004
    Messages
    64
    D�tails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Ing�nieur consultant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Par d�faut
    Je ne pense pas que cela soit en rapport avec la norme, mais plut�t d� � des optimisations de compilateur.

    Si je compile avec gcc sans optimisation (-O0 ou rien) j'ai le r�sultat attendu :

    4
    4

    si j'utilise gcc avec optimisation (-O1,2,3...) j'ai la m�me chose qu'avec g++ :

    2
    4

    Par contre ce qui me d�range avec g++ c'est que sans options d'optimisation (-O0 ou rien par d�fault) on devrait avoir :

    4
    4

    or ce n'est pas le cas, que l'on utilise -O0,1,2,3... ou rien on a toujours le m�me r�sultat

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Citation Envoy� par jldgbu Voir le message
    Je ne pense pas que cela soit en rapport avec la norme, mais plut�t d� � des optimisations de compilateur.
    Si �a a � voir car � partir du moment ou tu es dans un comportement ind�fini, le compilateur a le droit de faire ce qui lui pla�t, il ne te doit strictement rien. Donc �a varie d'un compilo � un autre, c'est logique et �a ne devrais pas te poser de souci car dans un code propre, on ne modifie pas des const .

  7. #7
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 504
    Par d�faut
    T'as jou� au plus malin avec le compilateur et t'as perdu.

  8. #8
    Membre confirm�
    Profil pro
    Ing�nieur consultant
    Inscrit en
    Novembre 2004
    Messages
    64
    D�tails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Ing�nieur consultant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Par d�faut
    T'as jou� au plus malin avec le compilateur et t'as perdu.
    Mon probl�me n'est pas de jouer au plus malin avec un compilateur mais de m'assurer que personne ne peut changer une variable const que j'exposerai par quelques bidouilles que ce soit...

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Citation Envoy� par jldgbu Voir le message
    Mon probl�me n'est pas de jouer au plus malin avec un compilateur mais de m'assurer que personne ne peut changer une variable const que j'exposerai par quelques bidouilles que ce soit...
    Si t'as des programmeurs qui bricolent pour modifier tes const, c'est qu'il y a un probl�me autre � mon avis, qui tient � l'organisation et aux r�gles de codage � respecter.

    En plus tu vois qu'avec g++, on a bien le comportement de const non modifi�, donc aucun souci si tu utilises g++ non ?

  10. #10
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par d�faut
    Citation Envoy� par jldgbu Voir le message
    Mon probl�me n'est pas de jouer au plus malin avec un compilateur mais de m'assurer que personne ne peut changer une variable const que j'exposerai par quelques bidouilles que ce soit...
    La philosophie de C++, c'est plut�t "protect agains murphy, not machiavel". const suit cette philosophie.

    Si tu veux vraiment t'assurer que personne ne modifie une variable const que tu exposes, le meilleur moyen que je vois est d'en renvoyer une copie � chaque fois, et de ne pas exposer la source. Mais m�me �a, �a se contourne.

  11. #11
    Membre confirm�
    Profil pro
    Ing�nieur consultant
    Inscrit en
    Novembre 2004
    Messages
    64
    D�tails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Ing�nieur consultant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Par d�faut
    Si tu veux vraiment t'assurer que personne ne modifie une variable const que tu exposes, le meilleur moyen que je vois est d'en renvoyer une copie � chaque fois, et de ne pas exposer la source. Mais m�me �a, �a se contourne.
    ? Je suis curieux t'as un exemple de code ?

  12. #12
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    D�veloppeur de jeux vid�o
    Inscrit en
    Ao�t 2004
    Messages
    1 717
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur de jeux vid�o
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 1 717
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
     MonTruc truc() { return m_truc; } // copie, pas d'accès a direct a truc

  13. #13
    Membre confirm�
    Profil pro
    Ing�nieur consultant
    Inscrit en
    Novembre 2004
    Messages
    64
    D�tails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Ing�nieur consultant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Par d�faut
    Euh c'�tait pas �a ma question, je sais comment renvoyer une copie pour ne pas exposer la source mais plut�t un exemple qui montre comment contourner �a.

  14. #14
    Membre �clair�

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par d�faut
    Apr�s quelques tests, on peut se rendre compte que la norme C99 et c++ doivent �tre diff�rentes a propos des const :

    Le programme suivant compile (avec gcc) avec un seul warning alors que avec g++, il donne une erreur.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    #include <stdlib.h>
    #include <stdio.h>
     
    const char*prouver_const(const char* chn)
    {
        char*chn2=chn;
        chn2[0]='T';
        return chn;
    }
     
     
    int main()
    {
        char*chn=malloc(6);
        strcpy(chn,"tests");
        printf("%s",prouver_const(chn));
     
    }
    De plus, le programme suivant lui, affiche "bug" :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdlib.h>
    #include <stdio.h>
     
     
    int main()
    {
        char *chn="test";//L'allocation est automatique si c'est à la déclaration je crois.
        printf("%s",chn);
        chn=realloc(chn,6);
        if(!chn)
            printf("bug");
    }
    Quelqu'un pourrait-il l'expliquer ?

  15. #15
    gl
    gl est d�connect�
    R�dacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 46
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par d�faut
    Citation Envoy� par NoIdea Voir le message
    De plus, le programme suivant lui, affiche "bug" :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdlib.h>
    #include <stdio.h>
     
     
    int main()
    {
        char *chn="test";//L'allocation est automatique si c'est à la déclaration je crois.
        printf("%s",chn);
        chn=realloc(chn,6);
        if(!chn)
            printf("bug");
    }
    Quelqu'un pourrait-il l'expliquer ?
    Il n'y a pas d'allocation automatique. Tu cr�es juste un pointeur que tu l'initialise avec l'adresse du cha�ne constante.

    chn contenant l'adresse d'une cha�ne constante et non une adresse retourn� par malloc() (ou �quivalent) ni NULL, l'appel � realloc() est un comportement ind�fini :

    Otherwise, if ptr does not match a pointer earlier returned by the calloc, malloc, or realloc function, or if the space has been deallocated by a call to the free or realloc function, the behavior is undefined.
    Au passage, en C++ il n'est pas recommand� d'utiliser malloc(), realloc() et compagnie.

    Et il est assez vain d'essayer de comprendre, d'expliquer ou de pr�dire un comportement ind�finie. Une impl�mentation est en droit de faire ce qu'elle veut et pas n�cessairement toujours la m�me chose (cela peut varier notamment en fonction du niveau d'optimisation).

  16. #16
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 504
    Par d�faut
    Et une personne malveillant n'est pas oblig�e d'utiliser vos en-t�tes, ni m�me vos m�thodes ou fonctions pour aller fouiller dans vos donn�es, ni m�me d'utiliser du code C++.

  17. #17
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par d�faut
    Citation Envoy� par jldgbu Voir le message
    Euh c'�tait pas �a ma question, je sais comment renvoyer une copie pour ne pas exposer la source mais plut�t un exemple qui montre comment contourner �a.
    Pas d'exemple simple, d'autant que ce n'est pas le genre de choses auxquelles je m'amuse. Je sais que c'est possible en C++ (logique), mais pas en .Net (code manag�). En gros, l'id�e de base, c'est que rien ne t'emp�che d'�crire � une adresse m�moire qui t'appartient, du moment que la page est inscriptible. Donc si la valeur est allou� � l'ex�cution (ie, pas dans la zone data du programme), le programme peut la modifier.

    Apr�s, la difficult� principale r�side dans le fait de trouver l'adresse o� �crire. Mais ce n'est pas insurmontable. Il faut bien r�aliser, quand on fait du d�veloppement, que les fonctionnalit�s telles que const, private, etc, sont des fonctionnalit�s de v�rification statique, et aucunement de s�curit�.

  18. #18
    Membre confirm�
    Profil pro
    Ing�nieur consultant
    Inscrit en
    Novembre 2004
    Messages
    64
    D�tails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Ing�nieur consultant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 64
    Par d�faut
    Pour noIdea

    Le deuxi�me programme s'explique bien par le fait qu'un realloc est fait sur des donn�es non allou�es par malloc.

    Pour le premier programme :

    On ne peut pas normalement affecter une valeur de pointeur constant � un pointeur non constant, sauf pour les chaines de caract�res qui font exception.

    Une chaine du type

    "Hello"

    est une chaine de caract�res constantes, on ne devrait donc pouvoir affecter son addresse qu'� un pointeur de caract�res constant.

    const char* chaine = "hello"; //plus rigoureux

    Seulement en C on a pris l'habitude suivante:

    char* chaine = "hello";

    Donc par compatibilit� on a la conversion implicite entre "const char *" et "char *"

    Par contre si tu t'amuses � modifier la chaine de caract�res constante tu pourras toujours compiler mais � l'execution l� ce sera la roulette russe. Ca plantera ou pas selon que le compilateur choisit de mettre �a dans une zone m�moire ou tu peux �crire...

  19. #19
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Donc par compatibilit� on a la conversion implicite entre "const char *" et "char *"
    Ou plus exactement en C, on a:
    • Conversion implicite entre "abc" et char*, pour cette histoire de compatibilit� (sous gcc, on peut d�sactiver �a avec l'option -Wwrite-strings en ligne de commande).
    • Conversion implicite autoris�e mais (le plus souvent) avec warning de X const*X*, du au typage faible du C.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Diff�rence comportement Cassini/IIS
    Par Laotzu dans le forum ASP.NET
    R�ponses: 1
    Dernier message: 18/01/2011, 10h17
  2. [EasyPHP] Diff�rence comportement d�marrage Apache par EasyPHP ou par ligne de commande
    Par SONY30 dans le forum EDI, CMS, Outils, Scripts et API
    R�ponses: 6
    Dernier message: 19/10/2010, 11h48
  3. Diff�rence comportement entre product et RCP
    Par DaveShot dans le forum Eclipse Platform
    R�ponses: 2
    Dernier message: 16/03/2010, 09h03
  4. [swing]Diff�rence de comportement selon hardware
    Par xxaragornxx dans le forum Composants
    R�ponses: 13
    Dernier message: 16/11/2005, 17h51
  5. [JFrame] Explication sur une diff�rence de comportement
    Par jems dans le forum Agents de placement/Fen�tres
    R�ponses: 2
    Dernier message: 06/07/2005, 09h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo