
動的にロードされたルールを実行する分析ベースのGOリンター。
あなたはルールを書き、 ruleguardそれらが満足しているかどうかをチェックします。
ruleguardはGithub codeqlといくつかの類似点がありますが、行くだけに専念しています。
特徴:
また、他の静的アナライザーに簡単に埋め込むこともできます。 Go-Criticは例として使用できます。
最新リリース{Linux/AMD64、Linux/ARM64、Darwin/AMD64、Darwin/ARM64、Windows/AMD64、Windows/ARM64}からバイナリを入手することをお勧めします。
ソースからルールガードをインストールしたい場合は、次のように簡単です。
# Installs a `ruleguard` binary under your `$(go env GOPATH)/bin`
$ go install -v github.com/quasilyte/go-ruleguard/cmd/ruleguard@latest
# Get the DSL package (needed to execute the ruleguard files)
$ go get -v -u github.com/quasilyte/go-ruleguard/dsl@latestGOモジュール内にある場合、現在のモジュール用に
dslパッケージがインストールされ、それ以外の場合はパッケージを$ gopathにインストールすると、グローバルに利用可能になります。
$GOPATH/binシステム$PATHの下にある場合、その後ruleguardコマンドを利用できるようにする必要があります。
$ ruleguard -help
ruleguard: execute dynamic gogrep-based rules
Usage: ruleguard [-flag] [package]
Flags:
-rules string
comma-separated list of ruleguard file paths
-e string
execute a single rule from a given string
-fix
apply all suggested fixes
-c int
display offending line with this many lines of context (default -1)
-json
emit JSON outputテストrules.goを作成します。goファイル:
//go:build ruleguard
// +build ruleguard
package gorules
import "github.com/quasilyte/go-ruleguard/dsl"
func dupSubExpr ( m dsl. Matcher ) {
m . Match ( `$x || $x` ,
`$x && $x` ,
`$x | $x` ,
`$x & $x` ).
Where ( m [ "x" ]. Pure ).
Report ( `suspicious identical LHS and RHS` )
}
func boolExprSimplify ( m dsl. Matcher ) {
m . Match ( `!($x != $y)` ). Suggest ( `$x == $y` )
m . Match ( `!($x == $y)` ). Suggest ( `$x != $y` )
}
func exposedMutex ( m dsl. Matcher ) {
isExported := func ( v dsl. Var ) bool {
return v . Text . Matches ( `^p{Lu}` )
}
m . Match ( `type $name struct { $*_; sync.Mutex; $*_ }` ).
Where ( isExported ( m [ "name" ])).
Report ( "do not embed sync.Mutex" )
m . Match ( `type $name struct { $*_; sync.RWMutex; $*_ }` ).
Where ( isExported ( m [ "name" ])).
Report ( "do not embed sync.RWMutex" )
}テストexample.goを作成します。GOターゲットファイル:
package main
import "sync"
type EmbedsMutex struct {
key int
sync. Mutex
}
func main () {
var v1 , v2 int
println ( ! ( v1 != v2 ))
println ( ! ( v1 == v2 ))
if v1 == 0 && v1 == 0 {
println ( "hello, world!" )
}
}そのターゲットファイルでruleguardを実行します。
$ ruleguard -rules rules.go -fix example.go
example.go:5:1: exposedMutex: do not embed sync.Mutex (rules.go:24)
example.go:12:10: boolExprSimplify: suggestion: v1 == v2 (rules.go:15)
example.go:13:10: boolExprSimplify: suggestion: v1 ! = v2 (rules.go:16)
example.go:14:5: dupSubExpr: suspicious identical LHS and RHS (rules.go:7) -fix引数を使用してruleguard実行したため、両方とも提案された変更がexample.goに適用されます。
パターンのデバッグ中に役立つ-eモードもあります。
$ ruleguard -e ' m.Match(`!($x != $y)`) ' example.go
example.go:12:10: ! (v1 ! = v2) Report("$$")を指定されたパターンに自動的に挿入します。
-debug-group <name> flagを使用して、いくつかのルールが一致を拒否した理由についての説明を見ることができます(例えば、 Where()条件が失敗しました)。
-e生成されたルールにはe名があるため、デバッグもできます。
まず、ルールセットをロードするために開始中にルールガードファイル( rules.goなど)を解析します。
その後、ロードされたルールを使用して、指定されたターゲット(GOファイル、パッケージ)を確認します。
rules.goファイルは、 dsl APIの観点から書かれています。ルールガードファイルには、ルールグループとして機能する一連の関数が含まれています。このような関数はすべて、グループ内のルールを定義および構成するために使用される単一のdsl.Matcher引数を受け入れます。
ルール定義は常にMatch(patterns...)メソッド呼び出しで始まり、 Report(message)メソッド呼び出しで終了します。
これら2つの間に追加の呼び出しがあります。たとえば、 Where(cond)コールは一致に制約を適用して、それが受け入れられているか拒否されているかを決定します。したがって、たとえパターンに一致していても、 Where()条件を満たさない限り、レポートメッセージは作成されません。
RuleGuardがdslパッケージを動作させるには、実行時に利用できる必要があります。そうでない場合、次のようなエラーが表示されます。
$ ruleguard -rules rules.go .
ruleguard: load rules: parse rules file: typechecker error: rules.go:6:8: could not import github.com/quasilyte/go-ruleguard/dsl (can't find import: "github.com/quasilyte/go-ruleguard/dsl")
これは、DSLパッケージをモジュールに追加することで修正されます。
$ ruleguard-test go get github.com/quasilyte/go-ruleguard/dsl
go: downloading github.com/quasilyte/go-ruleguard v0.3.18
go: downloading github.com/quasilyte/go-ruleguard/dsl v0.3.21
go: added github.com/quasilyte/go-ruleguard/dsl v0.3.21
$ ruleguard-test ruleguard -rules rules.go .
.../test.go:6:5: boolExprSimplify: suggestion: 1 == 0 (rules.go:9)
あなたが過去にrule.goファイルでビルド制約を使用するというアドバイスに従っている場合、次のように:
$ ruleguard-test head -4 rules.go
//go:build ignore
// +build ignore
package gorules
go.modファイルは、間接的な依存関係としてDSLをリストしていることに気付くでしょう。
$ grep dsl go.mod
require github.com/quasilyte/go-ruleguard/dsl v0.3.21 // indirect
今すぐgo mod tidy実行した場合、 go.modファイルからDSLパッケージが消えることに気付くでしょう。
$ go mod tidy
$ grep dsl go.mod
$
これは、 go mod tidy 、すべてのビルド制約が有効であるかignoreように動作するためです。これはGO Webサイトに文書化されています。
これは、 ruleguardやrulesなどの別のビルド制約を使用して修正されます。
注: go-criticとgo-perfguard IRプレプロポーション機能を使用してルールを埋め込みました。