
동적으로로드 된 규칙을 실행하는 분석 기반 Go Linter.
규칙을 작성하고 ruleguard 만족하는지 확인합니다.
ruleguard 는 GitHub CodeQL과 약간의 유사점이 있지만 전용으로 전용입니다.
특징:
다른 정적 분석기에 쉽게 내장 할 수도 있습니다. go-critic은 예로 사용될 수 있습니다.
최신 릴리스 {Linux/AMD64, Linux/ARM64, Darwin/AMD64, Darwin/Arm64, Windows/AMD64, Windows/Arm64}에서 바이너리를 얻는 것이 좋습니다.
Source에서 Ruleguard를 설치하려면 다음과 같이 간단합니다.
# 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 시스템 경로에있는 경우 $ gopath/ $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: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 작성 .GGO 대상 파일 :
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> 플래그를 사용하여 일부 규칙이 일치를 거부 한 이유에 대한 설명을 볼 수 있습니다 (예 : Where() 조건이 실패).
-e 생성 규칙에는 e 이름이 있으므로 디버깅 할 수 있습니다.
먼저, 규칙 세트를로드하기 위해 시작하는 동안 규칙 거부 파일 (예 : rules.go )을 구문 분석합니다.
로드 된 규칙은 지정된 대상 (GO 파일, 패키지)을 확인하는 데 사용됩니다.
rules.go 파일은 dsl API 측면에서 작성됩니다. Ruleguard 파일에는 규칙 그룹으로 사용되는 기능 세트가 포함되어 있습니다. 그러한 모든 함수는 단일 dsl.Matcher 인수를 수용하여 그룹 내에서 규칙을 정의하고 구성하는 데 사용됩니다.
규칙 정의는 항상 Match(patterns...) 메소드 호출로 시작하고 Report(message) 메소드 호출로 끝납니다.
이 둘 사이에 추가 전화가있을 수 있습니다. 예를 들어, 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)
과거의 규칙에 따라 규칙을 사용하는 것에 대한 조언을 따른 경우 :
$ ruleguard-test head -4 rules.go
//go:build ignore
// +build ignore
package gorules
go.mod 파일을 간접 종속성으로 표시한다는 것을 알게됩니다.
$ 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 웹 사이트에 문서화되어 있습니다.
ruleguard 또는 rules 과 같은 다른 빌드 제약 조건을 사용하여 고정됩니다.
참고 : go-critic 및 go-perfguard IR 사전 컴파일 기능을 사용하여 규칙을 포함합니다.