 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Matthieu Moy Guest
|
Posted: Tue Feb 24, 2004 12:14 pm Post subject: Passer outre les protections private/protected |
|
|
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 )
Hmm, je ne trouve pas ça très satisfaisant intellectuellement
parlant ;-)
Merci de vos réponses,
--
Matthieu
|
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Tue Feb 24, 2004 12:23 pm Post subject: Re: Passer outre les protections private/protected |
|
|
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
|
Posted: Tue Feb 24, 2004 12:30 pm Post subject: Re: Passer outre les protections private/protected |
|
|
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
|
Posted: Tue Feb 24, 2004 12:39 pm Post subject: Re: Passer outre les protections private/protected |
|
|
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
|
Posted: Tue Feb 24, 2004 12:55 pm Post subject: Re: Passer outre les protections private/protected |
|
|
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
|
Posted: Tue Feb 24, 2004 1:39 pm Post subject: Re: Passer outre les protections private/protected |
|
|
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
|
Posted: Tue Feb 24, 2004 4:47 pm Post subject: Re: Passer outre les protections private/protected |
|
|
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
|
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
|
Posted: Wed Feb 25, 2004 6:38 am Post subject: Re: Passer outre les protections private/protected |
|
|
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
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
|
Posted: Wed Feb 25, 2004 7:08 am Post subject: Re: Passer outre les protections private/protected |
|
|
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
|
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++ )
Merci quand même,
--
Matthieu
|
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Wed Feb 25, 2004 7:21 am Post subject: Re: Passer outre les protections private/protected |
|
|
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
|
Posted: Wed Feb 25, 2004 10:53 am Post subject: Re: Passer outre les protections private/protected |
|
|
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++ )
|
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
|
Posted: Wed Feb 25, 2004 11:48 am Post subject: Re: Passer outre les protections private/protected |
|
|
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
|
Posted: Wed Feb 25, 2004 12:28 pm Post subject: Re: Passer outre les protections private/protected |
|
|
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
|
Posted: Thu Feb 26, 2004 7:37 am Post subject: Re: Passer outre les protections private/protected |
|
|
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 |
|
 |
|
|
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
|
|