sigchanyzer:静的アナライザバッファリングされていない信号チャネルを使用して信号を送信することを報告します。信号を失う可能性のあるものを通知します

Cuong Manh Le)(2020年12月1日)

TL; DR:静的アナライザを開発しました。 em> sigchanyzer “は、バッファリングされていないチャネルのインスタンスがシグナルに渡されることを報告します。通知:適切なシナリオ信号が配信されない原因となる可能性があるバグとして警告されました。このパスをGoプロジェクトに寄付し、さらに go vet または go test 自動的に有効になります

信号が失われました:(

動機

プログラムをユーザー入力と外部刺激に応答させるためシステムでは、プログラムでUNIXシグナルを処理できるようにする必要があります。例:

  • SIGTERMを受信したときのHTTPサーバーの正常なシャットダウン
  • コマンドライン実行可能ファイルが停止するSIGINTを受信したときにさらに入力を処理する
  • クリーンアップしてシャットダウンする前にすべてのデータベース接続を閉じる

Goはシグナルを提供します。このシグナルのリレーを実行するように通知します。例:

signal.Notify example

非施行による問題:

使い方はかなり簡単ですが、自分の足を撃つことも簡単です。 signal.Notifyのドキュメントには、次のように明示的に記載されています:

signal.Notify

上記のgodocと前の例からわかるように、プログラムが正しく機能するには、信号チャネルをバッファリングする必要があります。すべてうまくいっていますが、残念ながら、Goの標準ライブラリツールには、ユーザーがこのバグを取得するのを防ぐための強制機能がありません:-( 追加の問題もありますこのチェックインはgovetです。

Go標準ライブラリコードにもこのバグがあります:=( CL 274332

さらに調査中

すでにバグが一般的であるという証拠がありましたが、 SourceGraph の友人と無関係のコード検索といくつかのアイデアについて連絡を取り合っていることを考えると、いくつかのアイデアが得られました。 SourceGraph を使用して対話および検索する方法に関するガイダンス。このクエリをコンソールで実行し、Githubで上位100のGoリポジトリを検索して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が救助に…

この静的アナライザー「sigchanyzer」はOrijtech、Inc。の社内で構築しましたが、外部で実行すると、このバグがどれほど一般的であるかに驚いたため、オープンソースにしてGoプロジェクトに寄付するためのさらなる推進力。

使用法:

このバグのあるプログラムを検討してください:

バギー信号通知プログラム

その上で sigchanyzer を実行します:

sigchanyzer run

これまでのところ、 sigchanyzer lineでバグを報告しています11 は、 signal.Notify の呼び出しです。

sigchanyzerでも、問題を解決できます。

sigchanyzerで修正されました!

これで、プログラムは安全で正常に機能します。

sigchanyzer の助けを借りて、一部のリポジトリの一連の修正:

さらに、これをGoプロジェクトに寄付し、をCLにします。このパスをtools / go / analysis / passs に追加すると、最終的にgo vetまたはgo testを実行しているすべてのgoユーザーはそれを使用してコードを修正することができます。

結論

Goプログラミング言語は、書きやすく、読みやすく、保守しやすく、プログラマーの労力を可能な限り最小限に抑えるように設計されています。 Orijtech、Inc。では、日常業務でGoを使用しており、Go開発者が作成したGoコードの品質の向上に重点を置いており、より安全で保守性の高いGoコードの提供を支援しています。

これを入手できます。 実行して今日合格:

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

友達と共有し、フィードバックを提供し、バグを報告して楽しんでください!

お読みいただきありがとうございます ここまでです。

よろしくお願いします。

Cuong Manh Le Emmanuel T Odeke

エンジニアリング部門@ Orijtech、Inc。