begin process at 2012 02 11 10:45:46
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Système

 > 

Autre

 > 

Possibilité de contourner le spécificateur private ?!!


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Possibilité de contourner le spécificateur private ?!!

vendredi 15 août 2008 à 14:53:12 | Possibilité de contourner le spécificateur private ?!!

Chatbour

Membre Club
Salut à tous et à toutes

exécutez ce code et vous verrez que public_string pointe sur private_string : est-ce un bug dans C++ ?

code testé sous Windows XP, compilé sous Visual C++ 6..

#include <iostream.h>
#include <string.h>

class A
{
private :
    char *private_string;
public :
   
char *public_string;
    A()
    {
        public_string = new
char [10];
        delete(public_string);

        private_string =
new char [10];
        strcpy(private_string, "Chatbour");
        private_string[8] = '\0';
    }

    void afficher()
    {
        cout<<private_string<<endl;
    }
};

void main()
{
    A a;

    a.afficher();

    a.public_string[0] = 'c';

    a.afficher();

}



Vos commentaires..

_____________________
Vos avis et critiques sur le livre "Objets réactifs en java" de Frédéric Boussinot : contactez moi par MP..
[ Lien ]
vendredi 15 août 2008 à 15:11:32 | Re : Possibilité de contourner le spécificateur private ?!!

SAKingdom

Membre Club
Réponse acceptée !
Non ce n'est pas un bogue.
Tu alloues de la mémoire pour public_string que tu libères ensuite. Puis tu alloues pour private_string exactement la même quantité de mémoire. L'allocateur verra cette zone mémoire fraîchement libérée de taille identique disponible et la réservera pour private_string.
Cependant, ce comportement n'est pas garanti. Cette zone mémoire peut-être réservée par un autre thread, par exemple, si un changement de contexte a lieu entre le delete et le new.

C++ (@++)

vendredi 15 août 2008 à 15:16:10 | Re : Possibilité de contourner le spécificateur private ?!!

Chatbour

Membre Club
ok, mais c'est une source de problèmes..

je pense que si on doit considérer ceci comme bogue, ça doit être de la part du système..



_____________________
Vos avis et critiques sur le livre "Objets réactifs en java" de Frédéric Boussinot : contactez moi par MP..
[ Lien ]
vendredi 15 août 2008 à 15:39:44 | Re : Possibilité de contourner le spécificateur private ?!!

SAKingdom

Membre Club
Réponse acceptée !
Non ce n'est pas un problème. Il est trop difficile de prévoir ce genre de comportement pour l'exploiter facilement.

"je pense que si on doit considérer ceci comme bogue, ça doit être de la part du système.."

L'accès au attributs ne veut strictement rien dire pour le système. Tout ça est réglé durant la compilation et non durant l'exécution. Le système ne fait qu'allouer la mémoire et ne se demande pas si une variable dite "privée" avait cette zone avant. Ce concept d'accès aux attributs n'est pas applicable au niveau de l'exécution mais seulement lors de la conception du code source.

Si tu veux être sûr que public_string ne soit plus utilisable, assigne lui 0 après le delete.

C++ (@++)

vendredi 15 août 2008 à 15:46:41 | Re : Possibilité de contourner le spécificateur private ?!!

MuPuF

Hello,

En fait, c'est ta logique qui est mauvaise. Quand on libère de la mémoire, on ne doit plus essayer de la lire après car le comportement n'est pas garanti. Or, c'est ce que tu fais.

Comme l'a bien dit SAKingdom, ton programme n'est pas le seul à tourner --> le 2ème new pourrait te donner une zone mémoire totalement différente.

A moins que ce soit le compilo qui voit qu'il peut reutiliser la zone mémoire fraichement libérée et donc éviter une alloc. Seule une analyse du code asm pourrait donc nous dire si c'est le compilo ou le kernel qui est à l'origine de cette "bizarrerie".

Quoi qu'il en soit, c'est sympa comme sujet.

Bye

/*
MuPuF® Mon Tech-blog : www.mupuf.fr.nf
vendredi 15 août 2008 à 17:02:23 | Re : Possibilité de contourner le spécificateur private ?!!

juju12

par contre cela n'a rien à voir avec le fait que d'autres programmes soient en cours d'exécution...n'oublions pas qu'il s'agit de mémoire virtuelle. Mais comme disait SAKingdom, s'il y a d'autres threads dans le même programme, l'adresse pourrait être réservée dans l'intervalle.
vendredi 15 août 2008 à 18:46:02 | Re : Possibilité de contourner le spécificateur private ?!!

MuPuF

En effet juju12, faut que je continue à en apprendre plus sur le kernel (je suis en pleine lecture de "Understanding the Linux Kernel"). Je me la ferme donc la dessus ;)


/*
MuPuF® Mon Tech-blog : www.mupuf.fr.nf
vendredi 15 août 2008 à 19:37:05 | Re : Possibilité de contourner le spécificateur private ?!!

SAKingdom

Membre Club
Réponse acceptée !
Tien un petit test pour montrer ce que je voulais dire par :
"Ce concept d'accès aux attributs n'est pas applicable au niveau de l'exécution mais seulement lors de la conception du code source."

class Test {
public:
    Test(char *i, int j, char k) {
        pointeur = i;
        entier = j;
        carac = k;
    }
private:
    char *pointeur;
    int entier;
    char carac;
};
   

int main (int argc, char *argv[]) {
    Test *ttt = new Test("Bonjour les amis", 234, 'e');
    char *i = *(char**)ttt;
    int j = *(int*)((char*)ttt+4);
    char k = *(char*)((char*)ttt+8);
   
    cout << i << '\n' << j << '\n' << k << endl;
}

Compilé avec g++ et testé sous linux. Devrait t'afficher:

Bonjour les amis
234
e

Le concept d'encapsulation n'a de sens que dans la conception du programme et non lors de son exécution.

C++ (@++)

vendredi 15 août 2008 à 19:46:34 | Re : Possibilité de contourner le spécificateur private ?!!

Chatbour

Membre Club
vous savez quoi : java a raison d'éliminer les pointeurs







_____________________
Vos avis et critiques sur le livre "Objets réactifs en java" de Frédéric Boussinot : contactez moi par MP..
[ Lien ]
vendredi 15 août 2008 à 19:47:38 | Re : Possibilité de contourner le spécificateur private ?!!

Chatbour

Membre Club
la prochaine version de C++ va-t-elle peut être corriger ces lacunes ?


_____________________
Vos avis et critiques sur le livre "Objets réactifs en java" de Frédéric Boussinot : contactez moi par MP..
[ Lien ]

1 2

Cette discussion est classée dans : public, string, afficher, private, char


Répondre à ce message

Sujets en rapport avec ce message

AnsiString et Char [ par JCLK ] J'ai un leger probleme :je recupere une String et j'ai ensuite besoin de la transformer en char *Est-ce possible ?La String contient un path ("C:\...\ tableau de char -> string [ par alfred289 ] bonjour,j'utilise BOrland C++ builder 5 et j'essaie de transformer un tableau de caractères en sring et je trouve pas commentmerci de votre aide operator [] ds une classe string pr retourner un caractère [ par ngryman ] Salut à ts,voilà j'ai un petit souci ds une classe String que j'ai fait. J'ai inclu un opérateur [] qui comme un char* retourne le char à la position Convertir une string en char* [ par dickymoe ] Existe-t-il une fonction qui permet de convertir une string en char* ?ou alors une fonction qui compare deux string sans respecté la casse ???Merci(en convertir un String* en char [ par mimyne ] Bonjour a tous malgrès toute les fonctions que g essayé je n'arrive pas a convertir un string* en char s'il y a qqun qui pourrait me renseigner je su convertir un String* en char [ par mimyne ] Bonjour a tous malgrès toute les fonctions que g essayé je n'arrive pas a convertir un string* en char s'il y a qqun qui pourrait me renseigner je su Probleme converssion [ par zzzzzz ] <img src=/imgs2 Probleme malloc [ par zzzzzz ] <img src=/imgs2 Convertion d'une string en char [ par redpooka ] Voici avec ce programme ca n'affiche juste le premier charactère comment faire pour qu'il affiche toute la chaine de caracètre ?Merci#include <iostre problème d'allocation mémoire dans ma classe [ par Bub325 ] Salut, j'ai un problème dans le code suivant au niveau de l'allocation mémoire de tmp.a = new char... dans operator+, et je ne sait pas du tout pourqu


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,326 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales