asasalint

Table of Contents

  1. 解決する問題
  2. 設定
  3. オプション
  4. サンプル
    1. 検出例
    2. 修正例
  5. 注意点
  6. 参考リンク

asasalint は可変長引数関数(...any)にスライスをそのまま渡しているパターンを検出するツールです。

解決する問題

...any を受け取る関数にスライスを展開せずに渡すと、スライス全体が 1 つの引数として扱われます。コンパイルは通りますが、実行時に意図しない動作を引き起こします。

1
2
3
4
5
6
7
8
9
10
11
12
// Before: スライスを展開せずに渡している
func LogArgs(args ...any) {
fmt.Println(len(args)) // 引数の数を表示
}

func Wrapper(args ...any) {
LogArgs(args) // args がスライスとして1つの引数になる
}

func main() {
Wrapper(1, 2, 3) // LogArgs には []any{1,2,3} が1つの引数として渡る → len = 1
}
1
2
3
4
// After: スライスを展開して渡す
func Wrapper(args ...any) {
LogArgs(args...) // args を展開して渡す → len = 3
}

設定

公式ドキュメント

1
2
3
4
5
6
7
8
9
10
11
# .golangci.yml 設定例
version: "2"

linters:
enable:
- asasalint
settings:
asasalint:
exclude:
- Append
use-builtin-exclusions: true

オプション

オプション デフォルト 説明
exclude []string [^(fmt|log|logger|t|).(Print|Fprint|Sprint|Fatal|Panic|Error|Warn|Warning|Info|Debug|Log)(|f|ln)$] チェック対象外にする関数名の正規表現リスト。ビルトイン除外とマージされる
use-builtin-exclusions bool true ビルトインの除外リストを有効にする

サンプル

検出例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// asasalint が警告するパターン

// 1. 可変長引数の転送で展開を忘れている
func FormatMessage(msg string, args ...any) string {
return fmt.Sprintf(msg, args) // asasalint: args should be unpacked with '...'
}

func main() {
s := FormatMessage("Hello %s, you are %d", "Alice", 30)
// 期待: "Hello Alice, you are 30"
// 実際: "Hello [Alice 30], you are %!d(MISSING)"
}

// 2. ラッパー関数での転送
func LogInfo(args ...any) {
customLogger(args) // asasalint: args should be unpacked with '...'
}

func customLogger(args ...any) {
for _, a := range args {
fmt.Println(a)
}
}

修正例

1
2
3
4
5
6
7
func FormatMessage(msg string, args ...any) string {
return fmt.Sprintf(msg, args...) // args... で展開
}

func LogInfo(args ...any) {
customLogger(args...) // args... で展開
}

注意点

  • fmt.Printflog.Printf などの標準ライブラリ関数はデフォルトで除外されている。独自のロガーやフォーマッターで同様のパターンがある場合に効果を発揮する
  • use-builtin-exclusions: false にするとビルトイン除外が無効になり、すべての関数がチェック対象になる
  • この問題はコンパイルエラーにならないため、テストでも発見しにくい。静的解析での検出が特に重要

参考リンク