sigchanyzer: analizzatore statico segnalare luso di canali di segnale senza buffer per segnalare. Avvisare quale potrebbe perdere segnali

(Cuong Manh Le) (1 dicembre 2020)

TL; DR: Abbiamo sviluppato un analizzatore statico “ sigchanyzer “che segnalerà le istanze di canali senza buffer che vengono trasmessi al segnale. Nota: uno scenario che va bene avvertito come un bug che potrebbe causare la mancata consegna del segnale. Stiamo donando questo pass al progetto Go e anche ogni sviluppatore Go che esegue go vet o go test lo abiliterà automaticamente

segnale perso 🙁

Motivazione

Per rendere i tuoi programmi sensibili agli input dellutente e agli stimoli esterni sistema, molto probabilmente vorresti che i tuoi programmi fossero in grado di gestire i segnali UNIX, ad esempio:

  • Arresto graduale del server HTTP quando riceve SIGTERM
  • Un eseguibile da riga di comando si arresta elaborazione di ulteriori input alla ricezione di SIGINT
  • Chiusura di tutte le connessioni al database prima di ripulire e arrestare

Go fornisce il segnale . Invia una notifica per eseguire questa trasmissione di segnali, ad esempio in:

signal.Notify example

Problema dovuto alla mancata applicazione:

Sebbene sia abbastanza facile da usare, è anche facile per te spararti sul piede. I documenti per signal.Notify dicono esplicitamente:

signal.Notify

Come puoi vedere in godoc sopra e dallesempio precedente, il canale del segnale deve essere bufferizzato affinché il programma funzioni correttamente. Tutto bene, ma sfortunatamente gli strumenti della libreria standard di Go non hanno alcuna applicazione per impedire agli utenti di ottenere questo bug in 🙁 Cè anche un problema per laggiunta questo controllo in go vet.

Anche il codice della libreria standard Go ha questo bug: = (in 2 punti importanti, come da CL 274332

Ulteriori indagini

Già abbiamo avuto la prova che il bug fosse comune, ma dato che siamo stati in contatto con i nostri amici di SourceGraph riguardo a una ricerca di codice non correlata e ad alcune idee, ne abbiamo indicazioni su come interagire e cercare utilizzando SourceGraph e abbiamo eseguito questa query nella loro console, cercando i 100 migliori repository Go su GitHub cercando make(chan os.Signal)

repogroup:go-gh-100
not file:test
not file:Godeps
not file:vendormake(chan os.Signal)
alla ricerca di t egli top 100 repository Go su Github

sigchanyzer in soccorso …

Abbiamo costruito questo analizzatore statico “sigchanyzer” internamente a Orijtech, Inc. e quando lo abbiamo eseguito nel mondo esterno, eravamo allarmati da quanto fosse comune questo bug, quindi questo ci ha dato ulteriore impulso allopen source e donarlo al progetto Go.

Utilizzo:

Considera questo programma difettoso:

programma di notifica del segnale con bug

Esegui sigchanyzer su di esso:

sigchanyzer run

Fin qui tutto bene, sigchanyzer segnala un bug alla riga 11 , che è la chiamata a signal.Notify.

sigchanyzer può anche risolvere il problema per te:

sigchanyzer ha risolto il problema!

E ora il tuo programma è sicuro e funziona correttamente.

Con laiuto di sigchanyzer , siamo stati in grado di fornire un sacco di correzioni per alcuni repository:

Inoltre, faremo una donazione al progetto Go e renderemo un CL per aggiungere questo passaggio a tools / go / analysis / pass e alla fine ogni utente go che esegue go vet o go test sarà in grado di usarlo e correggere il loro codice.

Conclusione

Il linguaggio di programmazione Go è progettato per essere facile da scrivere, facile da leggere, facile da mantenere e ridurre al minimo lo sforzo del programmatore il più possibile. In Orijtech, Inc. utilizziamo Go nel nostro lavoro quotidiano e ci concentriamo sul miglioramento della qualità del codice Go scritto dagli sviluppatori Go e ci aiutiamo a fornire un codice Go più sicuro e gestibile.

Puoi ottenerlo passa oggi eseguendo:

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

Per favore condividilo con i tuoi amici, fornisci feedback, segnala bug e divertiti!

Grazie per aver letto fin qui.

Cordiali saluti,

Cuong Manh Le , Emmanuel T Odeke

Dipartimento di ingegneria @ Orijtech, Inc.