sigchanyzer: statisk analysator att rapportera användning av obuffrade signalkanaler för att signalera.Annonsera vilka som kan förlora signaler

(Cuong Manh Le) (1 dec 2020)

TL; DR: Vi har utvecklat en statisk analysator “ sigchanyzer ”som rapporterar fall av obuffrade kanaler som skickas till signal. Meddela: ett scenario som är bra varnas som ett fel som kan orsaka att signalen inte levereras. Vi donerar detta pass till Go-projektet och till och med varje Go-utvecklare som kör go vet eller go test aktiveras automatiskt

förlorad signal 🙁

Motivation

För att göra dina program lyhörda för användaringångar och externa stimuli från system, skulle du troligtvis vilja att dina program ska kunna hantera UNIX-signaler, till exempel:

  • Graciös avstängning av HTTP-servern när du tar emot SIGTERM
  • En kommandorads körbar stopp bearbetning av ytterligare inmatning vid mottagning av SIGINT
  • Stängning av alla databasanslutningar innan rengöring och avstängning

Go ger signal. Meddela för att uppnå detta vidarebefordran av signaler, till exempel i:

signal. Meddela exempel

Problem från icke-verkställighet:

Även om det är ganska enkelt att använda, är det också lätt för dig att skjuta dig själv i foten. Dokumenten för signal. Anmäl uttryckligen säg:

signal. Meddela

Som du kan se i godoc ovan och från föregående exempel måste signalkanalen buffras för att programmet ska fungera korrekt. Allt bra och bra, men tyvärr har Go: s standardbiblioteksverktyg ingen verkställighet för att hindra användare från att få detta fel 🙁 Det finns till och med ett problem att lägga till denna check till go vet.

Till och med Go-standardbibliotekets kod har detta fel: = (på två viktiga platser, enligt CL 274332

Undersöker vidare

Vi har redan hade bevis på att felet var vanligt, men med tanke på att vi har varit i kontakt med våra vänner från SourceGraph om en icke-relaterad kodsökning och några idéer, fick vi några vägledning om hur man interagerar och söker med SourceGraph , och vi körde denna fråga i deras konsol och letade efter de 100 bästa Go-förvaren på Github och sökte efter make(chan os.Signal)

repogroup:go-gh-100
not file:test
not file:Godeps
not file:vendormake(chan os.Signal)
söker efter t han topp 100 Go-arkiv på Github

sigchanyzer till undsättning …

Vi byggde den här statiska analysatorn ”sigchanyzer” internt hos Orijtech, Inc. och när vi körde den i omvärlden var vi oroliga över hur vanligt detta fel är, så det gav oss ytterligare drivkraft för att öppna källkoden och donera den till Go-projektet.

Användning:

Tänk på det här buggy-programmet:

buggy signal notify program

Kör sigchanyzer på det:

sigchanyzer run

Hittills så bra, sigchanyzer rapporterar ett fel på line 11 , vilket är samtalet till signal.Notify.

sigchanyzer kan också åtgärda problemet åt dig:

sigchanyzer fixade det!

Och ditt program är nu säkert och fungerar bra.

Med hjälp från sigchanyzer kunde vi leverera en massa korrigeringar för vissa arkiv:

Ytterligare mer kommer vi att donera detta till Go-projektet och gjorde till en CL för att lägga till detta pass till verktyg / go / analysis / pass och så småningom kommer alla go-användare som kör go vet eller go test kunna använda den och fixa sin kod.

Slutsats

Go-programmeringsspråket är utformat för att vara lätt att skriva, lätt att läsa, lätt att underhålla och minimera programmerarens ansträngning så mycket som möjligt. På Orijtech, Inc. använder vi Go i vårt dagliga arbete och vi fokuserar på att förbättra kvaliteten på Go-koden skriven av Go-utvecklare och hjälper oss att leverera säkrare, mer underhållbar Go-kod.

Du kan få den här passera idag genom att springa:

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

Dela det med dina vänner, ge feedback, rapportera fel och njut!

Tack för att du läste så här långt.

Vänliga hälsningar,

Cuong Manh Le , Emmanuel T Odeke

Engineering Department @ Orijtech, Inc.