C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Passer outre les protections private/protected

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Matthieu Moy
Guest





PostPosted: Tue Feb 24, 2004 12:14 pm    Post subject: Passer outre les protections private/protected Reply with quote



Bonjour,

Je voulais savoir si il était possible de forcer l'accès à un membre
de classe privé ou protégé depuis une autre classe (un peu comme avec
le mot clé "friend"), mais sans modifier le source de la classe à
laquelle on veut accéder. (Donc, une sorte de "friend" à l'envers,
quoi)

Ne me répondez pas « Ne le fait pas, c'est mal », je sais. Je voudrais
l'utiliser dans un contexte bien précis un peu long à détailler, mais
toujours est-il qu'on ne peut pas trop faire autrement.

Pour l'instant, j'ai un truc vraiment sale :

#define private public
#define protected public

(Et si je fais #define class struct, les template <class toto> ne
compilent plus Sad )

Hmm, je ne trouve pas ça très satisfaisant intellectuellement
parlant ;-)

Merci de vos réponses,

--
Matthieu
Back to top
Marc Boyer
Guest





PostPosted: Tue Feb 24, 2004 12:23 pm    Post subject: Re: Passer outre les protections private/protected Reply with quote



Matthieu Moy wrote:
Quote:
Bonjour,

Je voulais savoir si il était possible de forcer l'accès à un membre
de classe privé ou protégé depuis une autre classe (un peu comme avec
le mot clé "friend"), mais sans modifier le source de la classe à
laquelle on veut accéder. (Donc, une sorte de "friend" à l'envers,
quoi)

Ne me répondez pas « Ne le fait pas, c'est mal », je sais. Je voudrais
l'utiliser dans un contexte bien précis un peu long à détailler, mais
toujours est-il qu'on ne peut pas trop faire autrement.

Si tu ne nous explique pas le contexte, en effet, dur de
te donner une solution.

Quote:
Pour l'instant, j'ai un truc vraiment sale :

#define private public
#define protected public

Quitte a faire des horreurs, autant limiter la casse
avec des choses dans le genre:
#define private friend taClasse; private

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

Back to top
Matthieu Moy
Guest





PostPosted: Tue Feb 24, 2004 12:30 pm    Post subject: Re: Passer outre les protections private/protected Reply with quote



Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:

Quote:
Ne me répondez pas « Ne le fait pas, c'est mal », je sais. Je voudrais
l'utiliser dans un contexte bien précis un peu long à détailler, mais
toujours est-il qu'on ne peut pas trop faire autrement.

Si tu ne nous explique pas le contexte, en effet, dur de
te donner une solution.

J'ai en mémoire à un instant donné à la fois l'arbre abstrait
syntaxique du programme (qui me vient du front-end de GCC) et l'état
de la mémoire au milieu de l'éxécution du programme.

Le problème à résoudre, c'est, étant donné l'arbre abstrait
représentant un membre de donnée, et un pointeur sur la classe en
mémoire, récupérer la valeur de la variable en question.

Apparament, il n'y a pas assez d'informations dans l'arbre abstrait
pour récupérer l'addresse en mémoire, donc, je n'ai rien trouvé de
mieux que de générer un bout de code C++ récupérant cette valeur et de
le compiler puis de l'éxecuter à coups de dlopen/dlsym.

Ca marche quand le membre est public, mais si il est privé, le bout de
code C++ généré à la volée ne compile pas !

--
Matthieu

Back to top
Marc Boyer
Guest





PostPosted: Tue Feb 24, 2004 12:39 pm    Post subject: Re: Passer outre les protections private/protected Reply with quote

Matthieu Moy wrote:
Quote:
Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:
Ne me répondez pas « Ne le fait pas, c'est mal », je sais. Je voudrais
l'utiliser dans un contexte bien précis un peu long à détailler, mais
toujours est-il qu'on ne peut pas trop faire autrement.

Si tu ne nous explique pas le contexte, en effet, dur de
te donner une solution.

J'ai en mémoire à un instant donné à la fois l'arbre abstrait
syntaxique du programme (qui me vient du front-end de GCC) et l'état
de la mémoire au milieu de l'éxécution du programme.

Le problème à résoudre, c'est, étant donné l'arbre abstrait
représentant un membre de donnée, et un pointeur sur la classe en
mémoire, récupérer la valeur de la variable en question.

Apparament, il n'y a pas assez d'informations dans l'arbre abstrait
pour récupérer l'addresse en mémoire, donc, je n'ai rien trouvé de
mieux que de générer un bout de code C++ récupérant cette valeur et de
le compiler puis de l'éxecuter à coups de dlopen/dlsym.

Puisque tu génères toi même le code, pourquoi ne pas ajouter
un "friend maClass;" qui va bien ?

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

Back to top
Matthieu Moy
Guest





PostPosted: Tue Feb 24, 2004 12:55 pm    Post subject: Re: Passer outre les protections private/protected Reply with quote

Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:

Quote:
Puisque tu génères toi même le code, pourquoi ne pas ajouter
un "friend maClass;" qui va bien ?

Je génère le code qui lit les membres. Le code généré ressemble à ça :

#include "le_fichier_avec_la_déclaration_de_classe"

extern "C" int la_fonction_qui_recupere_la_valeur(MaClase * o) {
return o->le_membre_que_je_veux;
}

C'est pour ça que j'aimerais un « friend », mais « à l'envers » : Pas
« Lui, c'est mon ami », mais « Moi, je suis son ami » ...

--
Matthieu

Back to top
Gabriel Dos Reis
Guest





PostPosted: Tue Feb 24, 2004 1:39 pm    Post subject: Re: Passer outre les protections private/protected Reply with quote

Matthieu Moy <MatthieuNOSPAM.Moy (AT) imag (DOT) fr.invalid> writes:

Quote:
Bonjour,

Je voulais savoir si il était possible de forcer l'accès à un membre
de classe privé ou protégé depuis une autre classe (un peu comme avec
le mot clé "friend"), mais sans modifier le source de la classe à
laquelle on veut accéder. (Donc, une sorte de "friend" à l'envers,
quoi)

Toute solution à ce problème requiert au moins une violation de l'ODR
ou une connaissance intime de l'implémentation.
Les droits d'accès font partie de l'information de type que te donne
une définition de classe.

-- Gaby

Back to top
Andre Heinen
Guest





PostPosted: Tue Feb 24, 2004 4:47 pm    Post subject: Re: Passer outre les protections private/protected Reply with quote

On Tue, 24 Feb 2004 13:14:55 +0100, Matthieu Moy
<MatthieuNOSPAM.Moy (AT) imag (DOT) fr.invalid> wrote:

Quote:
Bonjour,

Je voulais savoir si il était possible de forcer l'accès à un membre
de classe privé ou protégé depuis une autre classe (un peu comme avec
le mot clé "friend"), mais sans modifier le source de la classe à
laquelle on veut accéder. (Donc, une sorte de "friend" à l'envers,
quoi)

C'est impossible, et il y a à cela une excellente raison.
Prenons un exemple:

class C {
void m(); // membre
friend void a(); // amie
};

*Toutes* les fonctions qui peuvent accéder à l'implémentation de
C, membres ou amies, sont listées dans C elle-même. Si tu dois
modifier C, tu as sous les yeux la liste des fonctions à
vérifier.

Si on pouvait faire "friend à l'envers", un utilisateur de ta
classe pourrait, dans un autre fichier, déclarer une fonction f()
qui cesserait de fonctionner dès que tu aurais modifié
l'implémentation de C.

Pour garantir que le code client continue à fonctionner en cas de
modification de C, les amies comme les membres doivent
nécessairement être déclarées dans C.

Quote:
snip

Pour l'instant, j'ai un truc vraiment sale :

#define private public
#define protected public

8-( Aaaaarrgh!

Quote:
snip

Hmm, je ne trouve pas ça très satisfaisant intellectuellement
parlant Wink

Tu l'as dit!
;-)

Quote:
Merci de vos réponses,

--
Andre Heinen
My address is "a dot heinen at europeanlink dot com"

Back to top
Marc Boyer
Guest





PostPosted: Wed Feb 25, 2004 6:38 am    Post subject: Re: Passer outre les protections private/protected Reply with quote

Matthieu Moy wrote:
Quote:
Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:
Puisque tu génères toi même le code, pourquoi ne pas ajouter
un "friend maClass;" qui va bien ?

Je génère le code qui lit les membres. Le code généré ressemble à ça :

#include "le_fichier_avec_la_déclaration_de_classe"

En gros, t'a la flemme de faire une génération de code un rien
plus subtile Wink
Que dire alors ? Un coup de system+sed ?

Quote:
C'est pour ça que j'aimerais un « friend », mais « à l'envers » : Pas
« Lui, c'est mon ami », mais « Moi, je suis son ami » ...

Oui, mais ça c'est pas possible.

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

Back to top
Matthieu Moy
Guest





PostPosted: Wed Feb 25, 2004 7:08 am    Post subject: Re: Passer outre les protections private/protected Reply with quote

Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:

Quote:
Je génère le code qui lit les membres. Le code généré ressemble à ça :

#include "le_fichier_avec_la_déclaration_de_classe"

En gros, t'a la flemme de faire une génération de code un rien
plus subtile Wink

Non ;-)

Je génère un #include parce que ce n'est pas moi qui ai écrit le
fichier en question, et il peut changer d'une execution à l'autre.

Quote:
Que dire alors ? Un coup de system+sed ?

C'est comme ça que ça va se terminer ...

Quote:
C'est pour ça que j'aimerais un « friend », mais « à l'envers » : Pas
« Lui, c'est mon ami », mais « Moi, je suis son ami » ...

Oui, mais ça c'est pas possible.

C'est un peu ce que je pensais, mais bon, on pouvait toujours
demander, hein ! (Depuis que je connais l'existance de const_cast<> en
C++, plus rien ne m'étonne en terme de violation des protections en
C++ Razz )

Merci quand même,

--
Matthieu

Back to top
Marc Boyer
Guest





PostPosted: Wed Feb 25, 2004 7:21 am    Post subject: Re: Passer outre les protections private/protected Reply with quote

In article <vpqhdxfmyaw.fsf (AT) ecrins (DOT) imag.fr>, Matthieu Moy wrote:
Quote:
Marc Boyer <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> writes:

Je génère le code qui lit les membres. Le code généré ressemble à ça :

#include "le_fichier_avec_la_déclaration_de_classe"

En gros, t'a la flemme de faire une génération de code un rien
plus subtile ;-)

Non ;-)

Je génère un #include parce que ce n'est pas moi qui ai écrit le
fichier en question, et il peut changer d'une execution à l'autre.

Oui, mais puisque tu as l'arbre syntaxique, tu pourrais ajouter
un "friend" dans le dit arbre et regénérer le code ;-)

Quote:
Que dire alors ? Un coup de system+sed ?

C'est comme ça que ça va se terminer ...

Puisque tu sorts du langage, en lui ajoutant un rien de
réflexivité, autant utiliser les outils qui vont bien.

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

Back to top
Gabriel Dos Reis
Guest





PostPosted: Wed Feb 25, 2004 10:53 am    Post subject: Re: Passer outre les protections private/protected Reply with quote

Matthieu Moy <MatthieuNOSPAM.Moy (AT) imag (DOT) fr.invalid> writes:

[...]

Quote:
Oui, mais ça c'est pas possible.

C'est un peu ce que je pensais, mais bon, on pouvait toujours
demander, hein ! (Depuis que je connais l'existance de const_cast<> en
C++, plus rien ne m'étonne en terme de violation des protections en
C++ Razz )

Je ne comprends pas ce commentaire. Il a toujours été possible de
bafouiller le système de types de C++ (même si des fois, il faut être
vraiment déterminé), bien avant l'invention des nouveaux styles de
casts. Cependant, les nouveaux styles de casts te permettent
d'exprimer clairement ce qui pourrait être interprêté comme une
violation du système de type de ce qui ne l'est pas. Par exemple,
dynamic_cast<> ne te laisse pas faire mumuse. Si tu utilises
const_cast<> sur quelque chose qui, en réalité, n'est pas const, ce
n'est pas une violation du système de type. Pourquoi cela devrait-il
être étonnant ?

-- Gaby

Back to top
Gabriel Dos Reis
Guest





PostPosted: Wed Feb 25, 2004 11:48 am    Post subject: Re: Passer outre les protections private/protected Reply with quote

Matthieu Moy <MatthieuNOSPAM.Moy (AT) imag (DOT) fr.invalid> writes:

Quote:
Gabriel Dos Reis <gdr (AT) cs (DOT) tamu.edu> writes:

Pourquoi cela devrait-il être étonnant ?

Avec const, tu dis « Ca, c'est constant ». Avec const_cast, tu dis
« Ah, finalement, non ».

Pas du tout.

Si tu déclares un *objet* const, alors tu es obligé de
l'initialiser à sa création et tu ne peux pas changer son état (sauf
s'il comporte de sous-objets « mutable », auquel cas, tu peux utiliser
const_cast<> pour modifier ces parties là). Autrement, ça peut faire
boom.

Si tu as un pointeur de type « const T* », tu ne dis pas que
l'objet pointé est « constant ». Non. Tu dis simplement que le
pointeur tel quel ne peut pas être directement utilisé pour
potentiellement modifier l'état de l'objet pointé. En fait, tu dis
« l'objet pointé est *peut-être* constant, mais ce n'est pas sûr å
100%, et dans le cas où il n'est pas en réalité constant, je veux
faire cette modification-ci, avec const_cast<> ».

Pareil avec un « const T& ».

Quote:
Ca ne veut pas dire qu'il n'y a pas des cas ou le const_cast est
utile, on est d'accord.

Je ne parlais pas de cas d'utilité, mais de la manière dont tu décris
« const » et « const_cast ».

-- Gaby

Back to top
Matthieu Moy
Guest





PostPosted: Wed Feb 25, 2004 12:28 pm    Post subject: Re: Passer outre les protections private/protected Reply with quote

Gabriel Dos Reis <gdr (AT) cs (DOT) tamu.edu> writes:

Quote:
Pourquoi cela devrait-il être étonnant ?

Avec const, tu dis « Ca, c'est constant ». Avec const_cast, tu dis
« Ah, finalement, non ».

Avec « private », tu dis « Les autres ne peuvent pas toucher à ça ».
Je ne trouverais pas étonnant qu'il y ai un truc qui permette de dire
« Ah, finalement, si ». C'est tout.

Ca ne veut pas dire qu'il n'y a pas des cas ou le const_cast est
utile, on est d'accord.

--
Matthieu

Back to top
Loïc Joly
Guest





PostPosted: Thu Feb 26, 2004 7:37 am    Post subject: Re: Passer outre les protections private/protected Reply with quote

Matthieu Moy wrote:
Quote:
Gabriel Dos Reis <gdr (AT) cs (DOT) tamu.edu> writes:


Pourquoi cela devrait-il être étonnant ?


Avec const, tu dis « Ca, c'est constant ». Avec const_cast, tu dis
« Ah, finalement, non ».

Plus présisément, tu dis : Même si la façon dont j'ai accès à l'onjet
prétend que l'objet est constant, je sais que ce n'est pas vraiment le
cas et que l'objet a été créé variable. Donc je vais le rappeler au
programme.


--
Loïc

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.