Ressortingctions POSIX sur les types de pointeurs en C

Contexte

La norme POSIX ajoute de nombreuses fonctions de bibliothèque et d’autres identifiants au langage C. Dans la description de la fonction dlsym() , il est dit (avec mon accentuation):

SYNOPSIS

 #include  void *dlsym(void *ressortingct handle, const char *ressortingct name); 

LA DESCRIPTION

La fonction dlsym () doit obtenir l’adresse d’un symbole (un identifiant de fonction ou un identifiant d’object de données) …

La norme C ne garantit pas qu’un pointeur de fonction puisse être converti en void * , ni même que la taille des pointeurs rest la même. Cela ajoute effectivement une ressortingction supplémentaire sur le système de types de C.

Question

Ma question est la suivante:

  • Existe-t-il une référence normative pour cette ressortingction du système de types de C ou est-ce seulement déductible de la description de certaines fonctions de la bibliothèque?
  • POSIX est-il même implémentable sur un système où sizeof ( function pointer ) > sizeof (void *) ?

Références

  • La norme C11 (projet public final): n1570
  • Le standard POSIX du groupe ouvert : POSIX.1-2008
  • La fonction POSIX dlsym()

La référence à dlsym () indique que la conversion n’est pas définie par le standard C, mais qu’une implémentation conforme doit faire en sorte que cela fonctionne correctement. Donc, sur les systèmes où cela ne peut fonctionner, cela ne serait pas une implémentation conforme et documenterait probablement ceci:

Notez que la conversion d’un pointeur * vide en un pointeur de fonction comme dans:

 fptr = (int (*)(int))dlsym(handle, "my_function"); 

n’est pas défini par la norme ISO C. Cette norme nécessite que cette conversion fonctionne correctement sur les implémentations conformes.

il y a un ancien article qui parle de cela du sharepoint vue C ++ et qui renvoie à une ancienne version de la référence dlsym () avec une explication plus détaillée:

La norme ISO C n’exige pas que les pointeurs vers les fonctions puissent être redirigés en pointeurs vers les données. En effet, la norme ISO C n’exige pas qu’un object de type void * puisse contenir un pointeur sur une fonction. Les implémentations prenant en charge l’extension XSI nécessitent toutefois qu’un object de type void * puisse contenir un pointeur sur une fonction. Toutefois, le résultat de la conversion d’un pointeur en fonction en un pointeur vers un autre type de données (à l’exception de void *) n’est pas défini. Notez que les compilateurs conformes à la norme ISO C sont tenus de générer un avertissement si une conversion d’un pointeur void * en pointeur de fonction est tentée comme suit:

 fptr = (int (*)(int))dlsym(handle, "my_function"); 

En raison du problème noté ici, une version future peut soit append une nouvelle fonction pour renvoyer des pointeurs de fonction, soit rendre l’interface actuelle obsolète au profit de deux nouvelles fonctions: l’une qui renvoie les pointeurs de données et l’autre qui renvoie les pointeurs de fonction.