Maison >développement back-end >Golang >Pourquoi la fonction principale de Go inclut-elle une boucle infinie et un déréférencement nul apparemment inutile ?
Dans la fonction principale de la bibliothèque d'exécution de Go (src/runtime/proc. go), il existe une boucle for infinie apparemment sans but. Cet extrait de code particulier :
<code class="go"> exit(0) for { var x *int32 *x = 0 }</code>
a intrigué de nombreux développeurs. Pourquoi cette boucle existe-t-elle et à quoi sert-elle ?
Dans les systèmes dotés d'une unité de protection de mémoire (MPU), attribuer 0 à une région de mémoire protégée (telle que (int)(nil) ou *x dans l'extrait de code ci-dessus) provoque une erreur de segmentation, arrêtant effectivement le programme. Cependant, dans les systèmes sans MPU, écrire 0 sur une adresse mémoire nulle n'entraîne aucun effet perceptible.
Pour résoudre ce problème, les développeurs de Go ont ajouté la boucle for infinie . Son objectif principal est d'arrêter le programme lorsque l'appel de sortie échoue. Étant donné que la fonction exit n'a pas réussi à terminer le programme, il est possible que même un déréférencement nul fonctionne. Et en cas d'échec également, la boucle garantit que le programme reste dans un état inactif.
La boucle for infinie est considérée comme un « code inaccessible » dans des circonstances normales. Il est destiné à servir de mécanisme de sécurité, déclenché uniquement lorsque quelque chose d'inattendu se produit. Les remarques des développeurs dans le code source capturent l'essence de son objectif :
"Si jamais cette boucle est atteinte, quelque chose ne va vraiment pas : l'appel de sortie aurait dû provoquer la fermeture du programme."
Des situations similaires se produisent lorsqu'une panique est déclenchée dans Go. Dans src/runtime/panic.go, à la fin de func fatalpanic(msgs *_panic), un autre extrait de code "inaccessible" existe :
<code class="go"> systemstack(func() { exit(2) }) *(*int)(nil) = 0 // not reached</code>
Si une panique est déclenchée lors de la compilation (comme illustré dans le code source fourni), la fonction fatalpanic est invoquée. Cependant, la fonction de sortie peut ne pas réussir à terminer le programme, provoquant l'exécution de la section « code inaccessible ». Le déréférencement nul ((int)(nil) = 0) déclenche alors une violation de segmentation, arrêtant effectivement le programme.
La boucle for infinie apparemment inutile et Le déréférencement nul dans la bibliothèque d'exécution de Go sert de filet de sécurité pour gérer les scénarios exceptionnels dans lesquels la terminaison du programme via l'appel de sortie échoue. Ils veillent à ce que le programme soit arrêté même lorsque des conditions inattendues surviennent, garantissant ainsi la stabilité du système.
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!