Frage

in C ++, kann ich leicht einen Funktionszeiger erstellen, indem Sie die Adresse einer Elementfunktion nehmen. Allerdings ist es möglich, die Adresse der lokalen Funktion zu ändern?

d. sage ich funcA () und funcB () in der gleichen Klasse haben, unterschiedlich definiert. Ich suche die Adresse funcA () zu der funcB (), so dass während der Laufzeit Aufruf funcA () tatsächlich zu einem Aufruf zu funcB () zu ändern. Ich weiß, das ist hässlich, aber ich brauche, dies zu tun, danke!

EDIT ----------

Hintergrund auf, was ich versuche zu tun:

Ich hoffe, Unit-Tests für eine bestehende Code-Basis zu implementieren, einige der Methoden in der Basisklasse, die alle meiner Module aus erben sind nicht virtuell. Ich bin keine Produktion Code bearbeiten erlaubt. Ich kann auf virtuelles Set mit den einschlägigen Verfahren in einer Basisklasse mit dem Build-Prozess und Ersatz Geige, aber ich dachte, dass ich eher einen Hack wie diese verwenden würde (was ich dachte, war möglich).

Auch ich bin aus technischen Neugier am Thema interessiert ist, wie durch den Prozess des versucht, dieses Problem zu hacken um lerne ich einiges darüber, wie die Dinge wie Code-Generierung und Funktion Look-up-Arbeiten im Rahmen der Haube, die ich noch keine Gelegenheit gehabt haben, in der Schule, die gerade fertig zweiten Jahr der Universität zu lernen. Ich bin nicht sicher, wie ich jemals solche Dinge in der Schule gelehrt würde, wie ich in einem Computer Engineering-Programm bin und nicht CS.

Zurück zum Thema Die das Verfahren funcA () und funcB () haben in der Tat die gleiche Signatur, so dass das Problem ist, dass ich nur die Adresse einer Funktion mit dem Operator & bekommen kann? Werde ich richtig sein zu sagen, dass ich nicht die Adresse der Funktion ändern kann, oder tauschen Sie den Inhalt an dieser Adresse ohne Teile des Speichers korrumpieren? Würde DLL-Injektion einen guten Ansatz sein für eine Situation wie diese, wenn die Funktionen in eine DLL exportiert werden?

War es hilfreich?

Lösung

Nein. Die Funktionen werden in die ausführbaren Datei kompiliert, und ihre Adresse wird während der gesamten Lebenszeit des Programms festgelegt.

Die nächste Sache ist virtuelle Funktionen. Geben Sie uns ein Beispiel, was Sie versuchen, zu erreichen, ich verspreche es gibt einen besseren Weg.

Andere Tipps

Es kann nicht so, wie Sie es beschreiben, durchgeführt werden. Der einzige Weg, das Ziel für einen statisch gebundenen Aufruf zu ändern, ist von dem tatsächlichen ausführbaren Code des Programms zu ändern. C ++ Sprache hat keine Funktionen, die das erreichen könnte.

Wenn Sie Funktionsaufrufe wollen zur Laufzeit aufgelöst werden müssen, die Sie verwenden entweder explizit indirekte Anrufe (Anruf über Funktionszeiger) oder Verwendung Sprach-Features, die auf Laufzeit-Call-Resolution basieren (wie virtuelle Funktionen), oder Sie können Ebene Verzweigung mit guten alten if oder switch verwenden. Welche geeignetere in Ihrem Fall ist, hängt von Ihrem spezifischen Problem.

Technisch könnte es für virtuelle Funktionen möglich werden, indem die V-Tabelle des Typs ändern, aber Sie sicherlich können es nicht tun, ohne den Standard zu verletzen (nicht definiertes Verhalten verursacht), und es wäre Kenntnisse erfordern, wie Ihre spezifischen Compiler Griffe vtables.

Für andere Funktionen ist es nicht möglich, weil die Adressen der Funktionen direkt an Programmcode geschrieben werden, die auf einem Nur-Lese-Speicherbereich im Allgemeinen ist.

Was Sie wollen, ist ein Zeiger auf eine Funktion, können Sie es zu FuncA oder FuncB Punkt unter der Annahme, dass sie die gleiche Signatur haben.

Ich bin ziemlich sicher, das ist unmöglich, in reinen C ++. C ++ ist nicht eine dynamische Sprache.

Sie können nicht tun, was Sie direkt tun wollen. Sie können jedoch ein ähnliches Ergebnis mit einigen etwas anderen Kriterien erreichen, etwas mit Ihnen bereits vertraut ist mit - Funktionszeigern. Bedenken Sie:

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

struct T {
   FunctionPointer Function;
};

Jetzt können Sie das Function Mitglied an einer bestimmten T Instanz festgelegt, und es nennen. Das ist etwa so nahe wie man vernünftigerweise bekommen, und ich nehme an, dass, da Sie bereits Kenntnis von Funktionszeigern sind Sie bereits Kenntnis von dieser Lösung.

Warum nicht Sie Ihre Frage mit einer vollständigeren Beschreibung des Problems bearbeiten Sie zu lösen sind versuchen? Wie es aussieht, es klingt wirklich wie Sie versuchen, etwas Schreckliches zu tun.

Es ist einfach!

Für

  

zur Laufzeit aufrufen funcA () tatsächlich zu einem Aufruf zu funcB ().

Schreib funcA() ähnlich wie folgt vor:

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

: -)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top