61 votes

Que signifie ((void (*)())buf)(); ?

Je suis en train de résoudre un problème d'exploitation binaire sur picoCTF et je suis tombé sur ce morceau de code :

((void (*)())buf)();

buf est un tableau de caractères.

J'ai résolu le problème mais je n'arrive pas à comprendre ce qu'il fait exactement. J'ai regardé este mais je n'ai pas pu le faire.

Qu'est-ce que ((void (*)())buf)(); C'est-à-dire ?

136voto

Joachim Pileborg Points 121221

void (*)() est un type, le type étant "pointeur vers une fonction qui prend des arguments indéterminés et ne renvoie aucune valeur".

(void (*)()) est une conversion de type vers le type ci-dessus.

(void (*)())buf coule buf au type ci-dessus.

((void (*)())buf)() appelle la fonction (sans passer d'arguments).

En bref : il indique au compilateur de traiter buf comme un pointeur vers une fonction, et d'appeler cette fonction.

11voto

P__J__ Points 12922

Pointeur buf est converti en pointeur vers une fonction void prenant un nombre indéterminé de paramètres, puis déréférencé (c'est-à-dire que la fonction est appelée).

9voto

lukeg Points 1607

C'est un typecast, suivi d'un appel de fonction. D'abord, buf est transformé en un pointeur vers une fonction qui retourne void . La dernière paire de parenthèses signifie que la fonction est ensuite appelée.

7voto

S.S. Anne Points 13829

Il transforme le tableau de caractères en un pointeur vers une fonction ne prenant aucun argument et retournant void et l'appelle ensuite. Le déréférencement du pointeur n'est pas nécessaire en raison du fonctionnement des pointeurs de fonction.

Une explication :

Ce "tableau de caractères" est en fait un tableau de code machine. Lorsque vous transformez le tableau en un void (*)() et l'appelle, il exécute le code machine à l'intérieur du tableau. Si vous fournissez le contenu du tableau, je pourrais le désassembler pour vous et vous dire ce qu'il fait.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X