Question

en C ++, je peux facilement créer un pointeur de fonction en prenant l'adresse d'une fonction de membre. Cependant, est-il possible de changer l'adresse de cette fonction locale?

i.e.. dire que j'ai FoncA () et FoncB () dans la même classe, défini différemment. Je cherche à changer l'adresse de FoncA () à celle de FoncB (), de telle sorte qu'au moment de l'exécution d'appel FoncA () fait des résultats dans un appel à FoncB (). Je sais que ce qui est laid, mais je dois le faire, merci!

EDIT ----------

Renseignements généraux sur ce que je suis en train de faire:

J'espère mettre en place des tests unitaires pour une base de code existant, quelques-unes des méthodes de la classe de base qui tous mes modules sont héritant de sont non virtuel. Je ne suis pas autorisé à modifier un code de production. Je peux jouer avec le processus de construction et de remplacement dans une classe de base avec les méthodes pertinentes définies au virtuel, mais je pensais que je préfère utiliser un hack comme celui-ci (que je pensais était possible).

En outre, je suis intéressé par le sujet par curiosité technique, à travers le processus d'essayer de pirater ce problème j'apprends tout à fait un peu sur la façon dont les choses telles que le travail de consultation génération de code et la fonction sous la capot, que je ne l'ai pas eu la chance d'apprendre à l'école juste après avoir terminé 2e année d'université. Je ne suis pas sûr que je vais à jamais être enseigné des choses à l'école que je suis dans un programme d'ingénierie informatique plutôt que CS.

Retour sur le sujet La méthode la FoncA () et FoncB () ont en effet la même signature, de sorte que le problème est que je ne peux obtenir l'adresse d'une fonction à l'aide de l'opérateur &? Est-ce que je raison de dire que je ne peux pas changer l'adresse de la fonction, ou échanger le contenu à cette adresse sans altérer les parties de la mémoire? DLL serait injection être une bonne approche pour une telle situation, si les fonctions sont exportées vers un dll?

Était-ce utile?

La solution

Non. Les fonctions sont compilées dans le fichier exécutable, et leur adresse est fixe pendant toute la durée de vie du programme.

La chose la plus proche est des fonctions virtuelles. Donnez-nous un exemple de ce que vous essayez d'accomplir, je vous promets qu'il ya une meilleure façon.

Autres conseils

Il ne peut se faire de la façon dont vous le décrivez. La seule façon de changer la cible d'un appel lié statiquement est en modifiant le code exécutable réel de votre programme. Le langage C n'a pas de caractéristiques qui pourraient y parvenir.

Si vous voulez des appels de fonction à résoudre au moment de l'exécution, vous devez soit utiliser des appels explicitement indirects (appel par l'intermédiaire des pointeurs de fonction), ou utiliser les fonctions linguistiques qui sont basées sur la résolution des appels d'exécution (comme des fonctions virtuelles), ou vous pouvez utiliser plaine de branchement avec un bon vieux if ou switch. Ce qui est plus approprié dans votre cas dépend de votre problème.

Techniquement, il est peut-être possible pour des fonctions virtuelles en modifiant la vtable du type, mais vous certainement ne peut pas le faire sans violer la norme (ce qui provoque un comportement non défini) et nécessiterait la connaissance de la façon dont gère spécifiques votre compilateur vtables.

Pour les autres fonctions, il est impossible, car les adresses des fonctions sont directement écrites dans le code du programme, qui est généralement une zone de mémoire en lecture seule.

Qu'est-ce que vous voulez est un pointeur vers une fonction, vous pouvez pointer vers FoncA ou FoncB en supposant qu'ils ont la même signature.

Je suis assez sûr que cela est impossible dans le plus pur C ++. C ++ n'est pas un langage dynamique.

Vous ne pouvez pas faire ce que vous voulez faire directement. Cependant, vous pouvez obtenir un résultat similaire avec des critères légèrement différents, en utilisant quelque chose que vous êtes déjà familier avec - pointeurs de fonction. Considérez:

// This type could be whatever you need, including a member function pointer type.
typedef void (*FunctionPointer)();

struct T {
   FunctionPointer Function;
};

Maintenant, vous pouvez définir le membre Function sur une instance de T donné, et l'appeler. Ceci est à peu près aussi proche que vous pouvez raisonnablement obtenir, et je suppose que, puisque vous êtes déjà au courant des pointeurs de fonction que vous êtes déjà au courant de cette solution.

Pourquoi ne pas modifier votre question avec une description plus complète du problème que vous essayez de résoudre? En l'état actuel, il semble vraiment que vous essayez de faire quelque chose d'horrible.

est simple!

Pour

  

au moment de l'exécution d'appel FoncA () résultats effectivement dans un appel à FoncB ().

écriture funcA() similaire à ce qui suit:

int funcA( int a, int b) {
  return funcB( a, b );
}

: -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top