Maison  >  Article  >  développement back-end  >  Pourquoi la fonction principale de Go inclut-elle une boucle infinie et un déréférencement nul apparemment inutile ?

Pourquoi la fonction principale de Go inclut-elle une boucle infinie et un déréférencement nul apparemment inutile ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-25 04:49:30331parcourir

Why does Go's main function include an infinite loop and a seemingly pointless nil dereference?

Démêler la boucle infinie dans la fonction principale de Go

Comprendre le problème

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 ?

Le comportement inattendu

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.

Briser la boucle

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.

Code inaccessible

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."

Panique et violation de segmentation

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.

Conclusion

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn