PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : String als function pointer verwenden - möglich?



Meillo
18-06-2008, 10:40
Hoi Community,

ich habe ein Programm, das ein Wort aus einer Datei liest und anhand dieses Wortes eine Funktion aufruft. Momentan habe ich ein großes if-else-if um die verschiedenen möglichen Worte auf die einzelnen Funktionen abzubilden.

Ich könnte das Programm stark vereinfachen, wenn ich einfach direkt die Funktion, die dem Wort entspricht, aufrufen könnte. Mit Function Pointern also.

Dazu muss ich aber vom dem String irgendwie auf den Function Pointer kommen.
Oder ich muss direkt einen Namen als Function Pointer aus der Textdatei lesen.

Ist sowas möglich?
Vorschläge ...

Lin728
18-06-2008, 11:31
Also so einfach über Funktionspointer geht das nicht, libffi kann sowas.

ContainerDriver
18-06-2008, 13:50
Man könnte die verschiedenen Funktionspointer + die entsprechenden Funktionsnamen in einer Liste ablegen und dann in der Liste einfach nach dem Funktionsnamen suchen. Das Problem ist, dass die aufzurufenden Funktionen alle den gleichen Rückgabewert + die gleichen Parameter (Anzahl + Typ) benötigen.

Gurß, FLorian

anda_skoa
18-06-2008, 15:34
Oder mit einem assoziativen Container (map, hash), der als Key den Namen und als Value den Functionpointer hält

Ciao,
_

panzi
18-06-2008, 20:39
Oder mit einem assoziativen Container (map, hash), der als Key den Namen und als Value den Functionpointer hält

Ciao,
_

Alles andere wäre eh zu gefährlich. Wenn man z.B. mit dlopen und dlsym eine Funktion aus einer .so läd und man den Namen aus einer unsicheren Quelle hat, dann könnte da arg was damit angestellt werden. Man glaubt nicht welche Manipulationen Leute schaffen wenn man einen Funktionspointer umbiegen kann.

Meillo
19-06-2008, 07:12
Man könnte die verschiedenen Funktionspointer + die entsprechenden Funktionsnamen in einer Liste ablegen und dann in der Liste einfach nach dem Funktionsnamen suchen.keine schlechte Idee


Das Problem ist, dass die aufzurufenden Funktionen alle den gleichen Rückgabewert + die gleichen Parameter (Anzahl + Typ) benötigen.das ist klar, und der Fall.


Oder mit einem assoziativen Container (map, hash), der als Key den Namen und als Value den Functionpointer hälthört sich noch besser an. Bedarf in C wohl Handarbeit, wobei sich das schon machen ließe.


Alles andere wäre eh zu gefährlich. Wenn man z.B. mit dlopen und dlsym eine Funktion aus einer .so läd und man den Namen aus einer unsicheren Quelle hat, dann könnte da arg was damit angestellt werden. Man glaubt nicht welche Manipulationen Leute schaffen wenn man einen Funktionspointer umbiegen kann.Eine Validierung der erlaubten Funktionen war sowieso vorgesehen.


Die Varianten mit der Liste oder dem assoziativen Array gefällt mir aber ziemlich gut.
... dass ich darauf nicht selbst gekommen bin ;-)

Besten Dank!