sigchanyzer: analyseur statique pour signaler lutilisation de canaux de signal non tamponnés au signal.Notifier qui pourrait perdre des signaux

(Cuong Manh Le) (1 décembre 2020)

TL; DR: Nous avons développé un analyseur statique «  sigchanyzer « qui signalera les instances de canaux non tamponnés passés dans le signal.Notify: un scénario qui va bien averti comme un bogue qui pourrait empêcher le signal dêtre délivré. Nous faisons don de ce pass au projet Go et même à tous les développeurs Go exécutant go vet ou go test lactivera automatiquement

signal perdu 🙁

Motivation

Pour rendre vos programmes réactifs aux entrées des utilisateurs et aux stimuli externes du système, vous aimeriez probablement que vos programmes soient capables de gérer les signaux UNIX, par exemple:

  • Arrêt progressif du serveur HTTP lors de la réception de SIGTERM
  • Un exécutable de ligne de commande sarrête traitement des entrées supplémentaires lors de la réception de SIGINT
  • Fermeture de toutes les connexions à la base de données avant le nettoyage et larrêt

Go fournit le signal . Notifier pour effectuer ce relais de signaux, par exemple dans:

signal.Notify exemple

Problème de non-application:

Bien quil soit assez facile à utiliser, il est également facile pour vous de vous tirer une balle dans le pied. La documentation pour signal.Notify dit explicitement:

signal.Notify

Comme vous pouvez le voir dans godoc ci-dessus et dans lexemple précédent, le canal du signal doit être mis en mémoire tampon pour que le programme fonctionne correctement. Très bien, mais malheureusement, les outils de bibliothèque standard de Go nont aucune application pour empêcher les utilisateurs dobtenir ce bogue dans 🙁 Il y a même un problème pour lajout cette vérification dans go vet.

Même le code de la bibliothèque standard Go a ce bogue: = (à 2 endroits importants, selon CL 274332

Enquête plus approfondie

Nous avons déjà avait la preuve que le bogue était courant, mais étant donné que nous avons été en contact avec nos amis de SourceGraph à propos dune recherche de code sans rapport et de quelques idées, nous en avons des conseils sur la façon dinteragir et de rechercher à laide de SourceGraph , et nous avons exécuté cette requête dans leur console, en recherchant les 100 principaux dépôts Go sur Github en recherchant make(chan os.Signal)

repogroup:go-gh-100
not file:test
not file:Godeps
not file:vendormake(chan os.Signal)
recherche de t Le top 100 des référentiels Go sur Github

sigchanyzer à la rescousse…

Nous avons construit cet analyseur statique «sigchanyzer» en interne chez Orijtech, Inc. et lorsque nous lavons exécuté dans le monde extérieur, nous avons été alarmés par la fréquence de ce bogue, ce qui nous a donné impulsion supplémentaire pour ouvrir le code source et le donner au projet Go.

Utilisation:

Considérez ce programme bogué:

programme de notification de signal de bogue

Exécutez sigchanyzer dessus:

sigchanyzer run

Jusquici tout va bien, sigchanyzer signale un bogue à la ligne 11 , qui est lappel à signal.Notify.

sigchanyzer peut également résoudre le problème pour vous:

sigchanyzer la corrigé!

Et votre programme est désormais sûr et fonctionne correctement.

Avec laide de sigchanyzer , nous avons pu livrer un tas de correctifs pour certains dépôts:

De plus, nous allons faire un don au projet Go et faire de un CL pour ajouter cette passe à tools / go / analysis / passes , et finalement chaque utilisateur go exécutant go vet ou go test sera capable de lutiliser et de corriger son code.

Conclusion

Le langage de programmation Go est conçu pour être facile à écrire, facile à lire, facile à entretenir et minimise autant que possible leffort du programmeur. Chez Orijtech, Inc., nous utilisons Go dans notre travail quotidien, et nous nous concentrons sur lamélioration de la qualité du code Go écrit par les développeurs Go, et nous aidons à fournir un code Go plus sûr et plus facile à maintenir.

Vous pouvez obtenir ceci passez aujourdhui en lançant:

get github.com/orijtech/sigchanyzer/cmd/sigchanyzer

Merci de le partager avec vos amis, de faire part de vos commentaires, de signaler des bugs et de profiter!

Merci davoir lu jusquici.

Cordialement,

Cuong Manh Le , Emmanuel T Odeke

Département dingénierie @ Orijtech, Inc.