sigchanyzer : 정적 분석기 신호에 버퍼링되지 않은 신호 채널의 사용을보고합니다. 신호를 잃을 수있는 항목 알림

(Cuong Manh Le) (2020 년 12 월 1 일)

TL; DR : 정적 분석기를 개발했습니다. “ sigchanyzer ”는 신호로 전달되는 버퍼링되지 않은 채널의 인스턴스를보고합니다. 알림 : 좋은 시나리오 신호가 전달되지 않을 수있는 버그로 경고했습니다. 이 패스를 Go 프로젝트와 go vet 또는 go test 자동으로 활성화됩니다.

lost signal : (

동기

프로그램이 사용자 입력 및 외부 자극에 반응하도록 다음과 같이 프로그램이 UNIX 신호를 처리 할 수 ​​있기를 원할 것입니다.

  • SIGTERM 수신시 HTTP 서버의 정상 종료
  • 명령 줄 실행 파일이 중지됩니다. SIGINT 수신시 추가 입력 처리
  • 정리 및 종료 전에 모든 데이터베이스 연결 닫기

Go는 신호를 제공합니다. 이러한 신호 릴레이를 수행하려면 알림 (예 :

signal.Notify 예제

비 집행으로 인한 문제 :

사용하기가 상당히 쉽지만 발을 쏘는 것도 쉽습니다. signal.Notify에 대한 문서는 명시 적으로 다음과 같이 말합니다.

signal.Notify

위의 godoc 및 이전 예에서 볼 수 있듯이 프로그램이 올바르게 작동하려면 신호 채널이 버퍼링되어야합니다. 모두 훌륭하지만, 안타깝게도 Go의 표준 라이브러리 도구에는 사용자가이 버그를 가져 오는 것을 방지하기위한 시행이 없습니다. 🙁 추가하는 데 문제가 있습니다. Go vet을 확인하세요.

Go 표준 라이브러리 코드에도이 버그가 있습니다. CL 274332

추가 조사

우리는 이미 버그가 흔하다는 증거가 있었지만 SourceGraph 의 친구들과 관련없는 코드 검색 및 몇 가지 아이디어에 대해 연락을했기 때문에 SourceGraph 를 사용하여 상호 작용 및 검색하는 방법에 대한 지침을 제공하고 콘솔에서이 쿼리를 실행하여 Github에서 make(chan os.Signal)

repogroup:go-gh-100
not file:test
not file:Godeps
not file:vendormake(chan os.Signal)
t 검색 그는 Github의 상위 100 개 Go 저장소

sigchanyzer를 구출합니다…

우리는 Orijtech, Inc.에서 내부적으로이 정적 분석기 “sigchanyzer”를 구축했으며 외부 세계에서 실행했을 때이 버그가 얼마나 흔한 지 놀라웠습니다. 오픈 소스를 추가하고 Go 프로젝트에 기부합니다.

사용법 :

이 버그 프로그램을 고려하세요.

버기 신호 알림 프로그램

sigchanyzer 실행 :

sigchanyzer 실행

지금까지 sigchanyzer 라인에서 버그를보고했습니다. 11 signal.Notify 에 대한 호출입니다.

sigchanyzer도 문제를 해결할 수 있습니다.

sigchanyzer가 문제를 해결했습니다!

이제 프로그램이 안전하고 정상적으로 작동합니다.

sigchanyzer 의 도움으로 Google은 일부 저장소에 대한 다양한 수정 :

더 나아가이를 Go 프로젝트에 기부하고 CL을 만들 것입니다. 이 패스를 tools / go / analysis / passes 에 추가하면 결국 go vet 또는 go test를 실행하는 모든 이동 사용자가 그것을 사용하고 코드를 수정할 수 있습니다.

결론

Go 프로그래밍 언어는 작성하기 쉽고, 읽기 쉬우 며, 유지 보수하기 쉽고 프로그래머의 노력을 최대한 최소화하도록 설계되었습니다. Orijtech, Inc.에서는 일상 업무에서 Go를 사용하고 Go 개발자가 작성한 Go 코드의 품질을 개선하는 데 중점을두고 더 안전하고 유지 관리가 쉬운 Go 코드를 제공 할 수 있도록 지원합니다.

이것을 얻을 수 있습니다. 다음을 실행하여 오늘 통과하세요.

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

친구와 공유하고, 피드백을 제공하고, 버그를보고하고, 즐기세요!

읽어 주셔서 감사합니다. 여기까지입니다.

감사합니다.

Cuong Manh Le , Emmanuel T Odeke

엔지니어링 부서 @ Orijtech, Inc.