Pointeurs de fonction NULL

Quel est le comportement de l’appel d’un pointeur de fonction null?

void (*pFunc)(void) = NULL; pFunc(); 

Pourquoi est-il conseillé d’initialiser à NULL des pointeurs de fonction encore inutilisés?

En C et C ++, cela s’appelle undefined behaviour , ce qui signifie que cela peut conduire à une erreur de segmentation , rien ou quoi que ce soit ne provoquera en fonction de votre compilateur, du système d’exploitation sur lequel vous exécutez ce code, de l’environnement (etc.). ..) veux dire.

L’initialisation d’un pointeur sur une fonction ou d’un pointeur sur NULL en général aide certains développeurs à s’assurer que leur pointeur n’est pas initialisé et n’est pas égal à une valeur aléatoire, ce qui leur évite de le déréférencer par accident.

  1. Que se passe-t-il lorsque vous essayez d’accéder à NULL? Ce qui suit est vrai à propos des données aussi bien que du code, et c’est ce qui se produit lorsque vous essayez de lire NULL (ou toute adresse de 0 à 4096, c’est-à-dire au moins la première page du segment). La cause première de ceci réside dans l’architecture de segmentation / pagination du système d’exploitation et du microprocesseur

    Lorsque vous essayez d’accéder à une adresse NULL (ou 0), dans l’une des sections de données ou de code, une erreur de segmentation (qui est en fait une erreur de page meursortingère) est générée. La première page de la section est traitée comme un espace d’adressage virtuel (ou une partie non valide de celui-ci). C’est à dessein que la première page est maintenue invalide (ou non présente) afin qu’au moins une adresse contenue dans le pointeur puisse être représentée comme invalide dans le programme au moment de l’exécution.

    Le descripteur de page de la 1ère page (qui contient l’adresse virtuelle 0, NULL), a le premier bit “présent” comme 0 (signifie sa page non valide). Maintenant, si vous essayez d’accéder au pointeur NULL (adresse 0), une erreur de page se produira car la page n’est pas présente et le système d’exploitation essaiera de gérer cette erreur de page. Lorsque le gestionnaire d’erreurs de page constate qu’il tente d’accéder à la première page, qui est traitée comme une partie non valide de l’espace d’adressage virtuel, il interrompt le processus. C’est tout sur le processus de l’espace utilisateur. Si vous essayez d’accéder au pointeur NULL dans le processus système (code au niveau du kernel), votre système d’exploitation échouera et provoquera un crash du système.

    Liens: http://en.wikipedia.org/wiki/Page_fault#Invalid http://en.wikipedia.org/wiki/protection_mémoire#Paged_virtual_memory http://pdos.csail.mit.edu/6.828/2005/readings/ i386 / s05_02.htm

    Ce qui précède est suffisant car je pense que vous devriez lire ceci aussi. http://www.iecc.com/linker/linker04.txt

  2. Pourquoi le pointeur de fonction est initialisé à NULL? Bien que si vous essayez d’appeler avec NULL, cela va donner une erreur de page / segment. NULL signifie sa fonction invalide. S’il contient une adresse erronée mais dans un espace d’adressage virtuel valide de la section de code, je pense que tout code à cette adresse sera appelé, ce qui pourrait être encore plus catastrophique (spl dans le cas de systèmes en temps réel). Initialise funcp = funct_foo_name + 1; Appelez maintenant la fonction en utilisant le pointeur de la fonction. Le pointeur de fonction pointe vers un espace d’adressage virtuel valide de la section de code. La fonction bt démarrera à partir d’un endroit incorrect à exécuter. ce qui pourrait entraîner une mauvaise exécution du code ou un mauvais ordre.

Il est conseillé, pour la même raison que l’initialisation des pointeurs “normaux” (de données) à NULL car cela facilite potentiellement la recherche de certaines erreurs. Les avis sur si cela est utile ou non varient bien sûr 🙂