Steve, Sie haben ein völlig falsches mentales Modell, was eine C-Funktion ist.
someType resultFunc = calloc(1024, 1);
memcpy(resultFunc, &isNot, 1024);
aus dem Code-Fragment, kann ich vermuten, dass Sie denken, dass Sie Funktion des kompilierten Code in einen Block von Speicher kopieren und sie dann wieder verwenden. So etwas stinkt nach Lisp, nur nicht in Lispeln machst du es nicht so.
In der Tat, wenn Sie sagen "& IsNot", erhalten Sie einen Zeiger auf Funktion. Das Kopieren des Speichers, auf den der Zeiger zeigt, ist kontraproduktiv - der Speicher wurde initialisiert, als Sie Ihre ausführbare Datei in den Speicher geladen haben, und sie ändert sich nicht. In jedem Fall würde das Schreiben von someFunc() zu einem Core-Dump führen, da der Heap-Speicher, auf dem someFunc läuft, nicht ausgeführt werden kann - dies schützt Sie vor allen Arten von Viren.
Sie scheinen eine Implementierung von Closures in C zu erwarten. Diese Implementierung ist einfach nicht da. Im Gegensatz zu Lisp oder Perl oder Ruby kann C Elemente eines Stapelrahmens nicht beibehalten, nachdem Sie diesen Rahmen verlassen haben. Selbst wenn in einigen Compilern verschachtelte Funktionen erlaubt sind, bin ich mir sicher, dass Sie innerhalb dieser Funktionen nicht auf nicht-globale Variablen verweisen können. Das Schließende an Closures ist in der Tat ein C++ - Objekt, das den Zustand speichert und operator() implementiert, aber es ist ein völlig anderer Ansatz, und Sie müssten die Dinge immer noch manuell erledigen.
Update: here ist der relevante Teil der GCC-Dokumentation. Suchen Sie nach "Aber diese Technik funktioniert nur so lange, wie die enthaltende Funktion (hack, in diesem Beispiel) nicht beendet wird."
danke für den Link, mein Lieblingszitat war "Wenn Sie versuchen, die verschachtelte Funktion über ihre Adresse aufzurufen, nachdem die enthaltene Funktion beendet wurde, wird die Hölle los." – luke