sigchanyzer: analizator statyczny zgłosić użycie niebuforowanych kanałów sygnałowych do sygnalizacji. Powiadomienie, które może spowodować utratę sygnałów.

(Cuong Manh Le) (1 grudnia 2020 r.)

TL; DR: Opracowaliśmy analizator statyczny „ sigchanyzer ”, który zgłasza przypadki przekazywania niebuforowanych kanałów do sygnału.Notify: scenariusz, który jest dobry ostrzeżony jako błąd, który może spowodować, że sygnał nie zostanie dostarczony. Przekazujemy tę przepustkę projektowi Go, a nawet każdemu deweloperowi Go działającemu go vet lub go test włączy ją automatycznie

utracony sygnał 🙁

Motywacja

Aby Twoje programy reagowały na dane wejściowe użytkownika i zewnętrzne bodźce z system, najprawdopodobniej chciałbyś, aby Twoje programy były w stanie obsługiwać sygnały UNIX, na przykład:

  • Sprytne zamknięcie serwera HTTP podczas odbierania SIGTERM
  • Wykonywanie wiersza poleceń zatrzymuje się przetwarzanie dalszych danych wejściowych podczas odbierania SIGINT
  • Zamykanie wszystkich połączeń z bazą danych przed czyszczeniem i zamykaniem

Go dostarcza sygnał . Powiadom , aby wykonać to przekazywanie sygnałów, na przykład w:

signal.Notify example

Problem związany z brakiem egzekwowania:

Chociaż jest dość łatwy w użyciu, łatwo jest też strzelić sobie w stopę. Dokumenty dla signal.Notify wyraźnie powiedz:

signal.Notify

Jak widać w godoc powyżej iz poprzedniego przykładu, kanał sygnału musi być buforowany, aby program działał poprawnie. Wszystko dobrze, ale niestety standardowe narzędzia biblioteki Go nie mają żadnego wymuszenia, aby uniemożliwić użytkownikom uzyskanie tego błędu w 🙁 Istnieje nawet problem z dodaniem to sprawdzenie u weterynarza.

Nawet kod standardowej biblioteki Go ma ten błąd: = (w 2 ważnych miejscach, zgodnie z CL 274332

Dalsze badanie

Już mamy dowody na to, że błąd jest powszechny, ale biorąc pod uwagę, że kontaktowaliśmy się z naszymi przyjaciółmi z SourceGraph w sprawie niepowiązanego wyszukiwania kodu i kilku pomysłów, mamy kilka wskazówki dotyczące interakcji i wyszukiwania za pomocą SourceGraph i uruchomiliśmy to zapytanie w ich konsoli, wyszukując 100 najpopularniejszych repozytoriów Go na Github, szukając make(chan os.Signal)

repogroup:go-gh-100
not file:test
not file:Godeps
not file:vendormake(chan os.Signal)
szukam t on 100 najlepszych repozytoriów Go na Github

sigchanyzer na ratunek…

Zbudowaliśmy ten statyczny analizator „sigchanyzer” wewnętrznie w firmie Orijtech, Inc. dalszy bodziec do otwarcia kodu źródłowego i przekazania go projektowi Go.

Zastosowanie:

Rozważ ten błędny program:

błędny sygnał powiadamiający program

Uruchom na nim sigchanyzer :

sigchanyzer run

Jak dotąd, sigchanyzer zgłasza błąd na linii 11 , czyli wywołanie signal.Notify.

sigchanyzer może również rozwiązać problem za Ciebie:

sigchanyzer naprawił to!

Twój program jest teraz bezpieczny i działa prawidłowo.

Z pomocą sigchanyzer byliśmy w stanie dostarczyć kilka poprawek dla niektórych repozytoriów:

Co więcej, przekażemy to na projekt Go i uczynimy CL aby dodać ten przebieg do tools / go / analysis / passes i ostatecznie każdy użytkownik go korzystający z go vet lub go test będzie w stanie z niego skorzystać i naprawić swój kod.

Wniosek

Język programowania Go został zaprojektowany tak, aby był łatwy do napisania, czytelny, łatwy w utrzymaniu i maksymalnie zminimalizował wysiłek programisty. W Orijtech, Inc. używamy Go w naszej codziennej pracy i koncentrujemy się na poprawie jakości kodu Go napisanego przez programistów Go i pomagamy nam dostarczać bezpieczniejszy, łatwiejszy w utrzymaniu kod Go.

Możesz to uzyskać zdaj dzisiaj, uruchamiając:

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

Podziel się nim ze znajomymi, prześlij opinię, zgłoś błędy i baw się dobrze!

Dziękujemy za przeczytanie do tej pory.

Z poważaniem,

Cuong Manh Le , Emmanuel T Odeke

Dział inżynieryjny @ Orijtech, Inc.