SideCI Blog

自動コードレビューサービスSideCIを提供している株式会社アクトキャットのコーポレートブログです。



Goのソースコード解析に標準ツールのgo vetを使ってみましょう

企業内においてGoを利用するケースが増えています。コンパイル系であり静的型付けの言語で、実行速度も速いのが特徴です。さらに仕様がシンプルなので習得が容易、かつ書かれたプログラムはマルチプラットフォームで動作します。

人気が出るに従ってチームでGoプロジェクトを進めるケースも多くなるでしょう。そうした中でコードの品質を保ち、保守性を良くするために、ソフトウェアを使ってコードをチェックしましょう。。幾つかのソフトウェアがありますが、今回はGoに標準で組み込まれているgo vetを紹介します。

go vetの使い方

go vetは go tool vet [directory] といった指定方法で実行します。directory はGoのソースコードが入ったディレクトリを指定します。

$ go tool vet path/to/go/project

実行すると、問題のある箇所について指摘が出力されます。

$ go tool vet ./alecthomas/gometalinter/
adjcmartix.go:85: suspect or: char != "" || char != " "
main.go:55: arg usage in Fprint call is a function value, not a function call
resolve.go:161: unreachable code
sparse.go:58: _m might be too small for shift of 32

後はこの指摘事項に沿ってソースコードを修正していくだけです。

ヘルプ

go vet のヘルプは go doc cmd/vet で出力できます。

$ go doc cmd/vet
Vet examines Go source code and reports suspicious constructs, such as
Printf calls whose arguments do not align with the format string. Vet uses
heuristics that do not guarantee all reports are genuine problems, but it
can find errors not caught by the compilers.

It can be invoked three ways:

By package, from the go tool:

    go vet package/path/name

vets the package whose path is provided.

By files:

    go tool vet source/directory/*.go
  :

オプションについて

解析する項目をオプションで指定できます。デフォルトでは -all が指定されており、すべての項目をチェックを実行してくれます。例えば、到達しないコードのみを見つける場合は -unreachable を使います。

$ go tool vet -unreachable ./alecthomas/
alecthomas/gometalinter/_linters/src/golang.org/x/text/unicode/cldr/resolve.go:161: unreachable code
alecthomas/gometalinter/vendor/gopkg.in/yaml.v2/decode.go:123: unreachable code

他にポインタを数値に変換する際に unsafe.Pointer を使っていると警告を出せる -unsafeptr オプションがあります。

$ go tool vet -unsafeptr ./alecthomas/
alecthomas/gometalinter/_linters/src/golang.org/x/tools/go/ssa/interp/external.go:302: possible misuse of unsafe.Pointer

// コードは次のようになっています
if pc != 0 {
  fn = (*ssa.Function)(unsafe.Pointer(pc)) // indeed unsafe!
}

基本的にはすべての項目をチェックで良いと思いますが、必要に応じてフラグを指定して、必要な種類の項目・解析のみを実行してください。


go vet は標準的な、これまでの経験上問題と推測される点を指摘します。つまり指摘事項が必ずしも問題とは限りません。とは言えコンパイラでは問題がない内容でも指摘してくれるでしょう。内容に沿って修正することで、分かりやすいコードに仕上げられるでしょう。

Go言語用のコード解析ツールはCPUリソースを多く消費するものが多くあります。そのため、ローカルのPCで実行するには時間がかかってしまって煩わしく感じることがあるかもしれません。そんな際にはGitHubでPull Requestと連携してGo言語用解析ツールを実行する、コードレビューの自動化用のCIサービスであるSideCIがお役に立てると思います。SideCIはgo vetにも対応しています。無料トライアルがありますので、まずはお試しください