Trampolin (Informatik)



Ein Trampolin ist ein Stück Programm – Code , das nach konfiguration von Umgebungsvariablen zu Einer other Funktion springt. Ein Trampolin dient als Sprungbrett, andere Funktionen aufzurufen. Dies ist ein wichtiger Nützlich, wenn man Parameter übergibt, der einen Cousin in der Signature of Function findet.

Motivation

In der Sprache C Kann man sterben Funktion qsortVerwenden, um Felder von Daten zu sortieren. qsorthat folgende Unterschrift:

 Leerer qsort ( Hohlraum * Feld ,
 size_t Element Zahl ,
 size_t elementgroesse ,
 int ( * vergleichsfunktion ) ( const ungültig * a , const Hohlraum * b ));

Die Funktion Wird ein Feld als Zeiger, stirbt Größe jeden Element in Bytes and a Vergleichsfunktion übergibt Anzahl der Elemente des Feld, stirbt. Die Vergleichsfunktion erhalten als Argument Zwei Zeiger zu den zu vergleichenden Element ( aund b) und liefert EINEN Wert kleiner Null für a < bNull für a == band a Grösser Wert Null für den Fall a > bzurück.

Ankommen, man möchte eine Funktion schreiben, die ein Feld von vorzeichenlosen Ganzzahlen zustst unsigned intnach ihrem Rest bzgl. eines der Partys Divisors und dann nach seine Größe sortiert. Wenn der Divisor eine feste Konstante DIVISORist, dann ist die Funktion modsortleicht zu implementieren:

#include <stdlib.h>
/ * Hilfsfunktion zum Vergleich * /
static int modvergleich ( unsigned int * a , unsigned int * b ) {
 unsigned int rest_a = a % DIVISOR , rest_b = b % DIVISOR ;
 / * Nach Erholung persönlicher Riss Dann nach Wert sortieren * /
 wenn ( rest_a =! Rest_b ) {
 wenn ( rest_a > rest_b )
 return 1 ;
 sonst
 Rückkehr - 1 ;
 } Else {
 wenn ( a == b ) return 0 ;
 sonst , wenn ( a > b ) return 1 ;
 sonst zurück - 1 ;
 }
}
/ * allgemeine Sortierfunktion * /
void modsort ( unsigniertes int * feld , size_t elementzahl ) {
 qsort ( feld , elementzahl ,sizeof ( unsigned int ), & modvergleich );
}

Aber war Tut Mann, wenn DIVISORerst zur Laufzeit bekannt ist? Man Könnte Hier eine globale Variable Verwenden stirbt ist aber insbesondere bei parallelem – Code ein Problem: Ein Anderer Thema Könnte Variable überschreiben sterben und so sterben ergebnisse verfälschen (Mit Modernen Compiler-Erweiterung Wie z B.. Thread-Speicherung ist stirbt auflösbar). War Tut Mann auch? Hier finden Sie Trampolin ins Spiel: Es wird die Adresse Trampoline an der Funktion qsortüberbegeben. This that divisor this divisor as after after after this divisor.

Verwendung von Trampolinen

In der Regel wurden Trampolin-Cousins ​​direkt verwöhnt, und diejenigen, die sprachen, sprachen keine direkte Rüben an. GCC hat eine Spracherweiterung für die Sprache C, die die Funktion , auch die Funktionsdefinition in der anderen Funktionsdefinition, verloschen hat. Weiterleiten eines dieser Dinge selbst. Suchen Sie sich selbst. Functional, so gcc ein Trampolin [1] auf ihnen Stack:

#include <stdlib.h>
/ * Sortierfunktion mit extra Divisor * /
ungültig modsort2 ( unsigned int * Feld , size_t Element Zahl , unsigned int Divisor ) {
 int modvergleich ( unsigned int * a , unsigned int * b ) {
 unsigned int rest_a = a % Divisor , rest_b = b % Divisor ;
 / * nach Rest sortieren, dann nach Wert sortieren * /
 wenn ( rest_a =! rest_b ) {
 wenn ( rest_a > rest_b )
 return 1 ;
 sonst
 zurück - 1 ;
 } Else {
 wenn ( a == b ) return 0 ;
 sonst , wenn ( a > b ) return 1 ;
 sonst zurück - 1 ;
 }
 }
 qsort ( Feld , Elementzahl, sizeof ( unsigned int ), & modvergleich );
}

Trampolin kann auch auf andre Speicherbereiche angebracht werden, die schreibbar und ausführbar sind. Dies muss nicht gleichzeitig der Fall sein; das Speicher-Attribut kann ggf. Zwischen Erzeugungen und Ausführungen umgeschaltet werden. Harvard Architects , die im Microcontroller typischerweise für Trampolin Cousin in Betracht sind.

Die dynamische Erzeugung von Maschinenkode forciert prozessorspezifische Quelltext-Stückchen, wenn sie nicht im (ggf. prozessorspezifischen) Compiler eingebaut wird.

Sicherheit

Trampolinberge und sich keine Sicherheitsprobleme. Bei der automatischen Erzeugung dieses Codes durch den Compiler ist zu beachten, dass die Ausführung von Code auf dem Stack zu erlauben ist. Das ist ein Elend, wir sind dem Sicherheitsrisiko bekannt, was bedeutet, dass wir die Mechanismen der Aktivierung von nutzen können, die die normalerweise unverständliche Ausführung von Code aus dem Stack verbieten werden.

Moderne APIs erleichtern es Trampolinen oder Gewinderäumen. Der „Herumschleppen“ lösche Datenzeiger, macht aber APIs etwas unhandlich.

Einzelstunden

  1. Hochspringen↑ Frage zum Thema »Implementierung verschachtelter Funktionen« bei Stack Overflow. Abgerufen am 20. Mai 2012 .