🧟‍♂️

【Go】deadcodeで使われていないゴミコードを検知する

2020/12/01に公開

はじめに

Goに限った話ではないのですが、開発が進んでいくと、使われていないコード、つまり書かれているものの一切実行されない変数、関数、が気が付いたらリポジトリに存在する事があります。
念のため用意したが使われなかった、呼び出し元を消したが関数本体を消し忘れた、といった理由が考えられます。

お堅い言葉でいうと到達不能コードと呼ばれるものです。
英語圏ではdead codeと呼ばれているようです。

そんなデッドコードを簡単に発見するOSSを発見したので共有します。

deadcodeとは

リポジトリはこちら
スタンドアローン型のシンプルなツールです、200行もない単一のgo実行ファイルです。
シンプルすぎてREADMEすらありません。(コミットしたら喜ぶだろうか)

使い方はgit cloneしてgo run deadcode.goでも動きますがもう少しスマートな方法を紹介します。

インストール

goの実行バイナリとしてインストールできれば良いです、下記のコマンドでインストールできます。

go install github.com/tsenart/deadcode

deadcodeで何ができるか

サンプルでこのようなファイルを書いてみます。

package main

import (
	"fmt"
)

var (
	livingValue string
	deadValue   string
)

func main() {
	livingValue = "Living"
	fmt.Println(livingFunc())
}

func livingFunc() string {
	return livingValue
}

func deadFunc() string {
	return "Dead"
}

実行すると文字列"Living"が出力されます。
deadValuedeadFuncが到達不能コードのサンプルになります。

このmain.goがあるディレクトリでdeadcodeを実行すると、下記画像のようになります。

deadcode: main.go:7:1: deadValue is unused
deadcode: main.go:21:1: deadFunc is unused

のような形式で、デッドコードの変数、関数名、場所が出力されました。
あとは念のため本当に消しても良いコードか調査して消すだけです。

コマンドライン引数でパスを指定すればカレントディレクトリ以外も調査できます。

注意としては再帰関数はデッドコードと化していても検知できないというエッジケースがあったり、テスト専用のユーティリティ関数がテストファイル以外に書かれている場合(良くないですが)、必要なものもデッドコードとして検知される場合があります。
当然作者は保証してくれないので、消すときはしっかり確認しましょう。

これで定期的に掃除できると生産性が高まりますね。

Discussion