sigchanyzer: statische analyzer om het gebruik van ongebufferde signaalkanalen te rapporteren om te signaleren. Geef aan welke signalen kunnen verliezen

(Cuong Manh Le) (Dec 1, 2020)

TL; DR: We hebben een statische analysator ontwikkeld “ sigchanyzer “die gevallen rapporteert van niet-gebufferde kanalen die in signaal worden omgezet. Melding: een goed scenario gewaarschuwd als een bug waardoor het signaal niet kan worden afgeleverd. We doneren deze pas aan het Go-project en zelfs aan elke Go-ontwikkelaar die go vet of go test zal het automatisch laten inschakelen

verloren signaal 🙁

Motivatie

Om uw programmas te laten reageren op gebruikersinvoer en externe stimuli van de systeem, zou je waarschijnlijk willen dat je programmas UNIX-signalen kunnen verwerken, bijvoorbeeld:

  • Probleemloos afsluiten van HTTP-server bij ontvangst van SIGTERM
  • Een uitvoerbaar bestand op de opdrachtregel stopt het verwerken van verdere invoer bij het ontvangen van SIGINT
  • Alle databaseverbindingen sluiten voor opschonen en afsluiten

Go levert signaal. Waarschuw om deze doorgifte van signalen te bewerkstelligen, bijvoorbeeld in:

signal. Voorbeeld melden

Probleem door niet-handhaving:

Hoewel het redelijk eenvoudig te gebruiken is, is het ook gemakkelijk voor u om uzelf in de voet te schieten. De documenten voor signal.Notify zeggen expliciet:

signal.Notify

Zoals je kunt zien in godoc hierboven en uit het vorige voorbeeld, moet het signaalkanaal worden gebufferd om het programma correct te laten werken. Allemaal goed en wel, maar helaas heeft de standaardbibliotheektool van Go geen handhaving om te voorkomen dat gebruikers deze bug krijgen in 🙁 Er is zelfs een probleem met het toevoegen van deze check in go vet.

Zelfs de Go-standaardbibliotheekcode heeft deze bug: = (op 2 belangrijke plaatsen, volgens CL 274332

Verder onderzoeken

We zijn al had bewijs dat de bug veel voorkomt, maar aangezien we in contact zijn geweest met onze vrienden van SourceGraph over een niet-gerelateerde codezoekopdracht en enkele ideeën, hebben we enkele richtlijnen voor interactie en zoeken met SourceGraph , en we hebben deze zoekopdracht uitgevoerd in hun console, op zoek naar de top 100 Go-opslagplaatsen op Github, zoekend naar make(chan os.Signal)

repogroup:go-gh-100
not file:test
not file:Godeps
not file:vendormake(chan os.Signal)
zoeken naar t de top 100 Go-opslagplaatsen op Github

sigchanyzer om te redden …

We hebben deze statische analysator “sigchanyzer” intern gebouwd bij Orijtech, Inc. en toen we hem in de buitenwereld uitvoerden, waren we gealarmeerd over hoe vaak deze bug voorkomt, dus dat gaf ons verdere impuls om het open source te maken en het te doneren aan het Go-project.

Gebruik:

Beschouw dit buggy-programma:

buggy signaleer programma

Voer sigchanyzer erop uit:

sigchanyzer run

Tot zover, sigchanyzer rapporteert een bug op regel 11 , dat is de aanroep naar signal.Notify.

sigchanyzer kan het probleem ook voor je oplossen:

sigchanyzer heeft het opgelost!

En je programma is nu veilig en werkt goed.

Met de hulp van sigchanyzer konden we leveren een heleboel fixes voor sommige repositories:

Verder gaan we dit doneren aan het Go-project en van een CL om deze pas toe te voegen aan tools / go / analysis / passes , en uiteindelijk zal elke go-gebruiker die go vet of go test draait in staat om het te gebruiken en hun code te repareren.

Conclusie

De Go-programmeertaal is ontworpen om gemakkelijk te schrijven, gemakkelijk te lezen en te onderhouden te zijn, en de inspanning van de programmeur zoveel mogelijk te minimaliseren. Bij Orijtech, Inc. gebruiken we Go in ons dagelijkse werk, en we richten ons op het verbeteren van de kwaliteit van de Go-code die is geschreven door Go-ontwikkelaars en om ons te helpen veiligere, beter te onderhouden Go-code te leveren.

Je kunt dit krijgen ga vandaag voorbij door:

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

Deel het met je vrienden, geef feedback, meld bugs en geniet ervan!

Bedankt voor het lezen tot nu toe.

Met vriendelijke groet,

Cuong Manh Le , Emmanuel T Odeke

Afdeling Engineering @ Orijtech, Inc.