Question :
Vous avez un pointeur vide renvoyé par dlsym(), et vous besoin d'appeler la fonction pointée par ce pointeur vide. Vous avez essayé de diffuser avec static_cast et reinterpret_cast, mais aucun n'a fonctionné. Quelles options avez-vous ?
Réponse :
La conversion directe d'un pointeur vide en pointeur de fonction est interdite dans C 98/03. Il peut être pris en charge sous condition en C 0x, mais son comportement est défini par l'implémentation.
Solutions non standard :
Malgré l'ambiguïté de la norme, il existe plusieurs solutions non standard. solutions standard qui peuvent fonctionner sur la plupart des plates-formes, bien qu'elles soient considérées comme un comportement non défini :
Option 1 :
<code class="cpp">typedef void (*fptr)(); fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>
Option 2 :
<code class="cpp">fptr my_fptr = 0; reinterpret_cast<void*&>(my_fptr) = gptr;</code>
Option 3 (Slow Motion) :
<code class="cpp">void (**object_ptr)() = &my_ptr; void **ppv = reinterpret_cast<void**>(object_ptr); *ppv = gptr;</code>
Ces options exploitent le fait que l'adresse d'un pointeur de fonction est un pointeur d'objet, permettant une casting à l'aide de reinterpret_cast.
Remarque :
Ces solutions ne sont pas garanties de fonctionner sur toutes les plates-formes et ne sont pas considérées comme la norme C . Utilisez-les à vos propres risques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!