Go命令行—vet

Go版权所有。本源码的使用受BSD许可证约束,该许可证可以在LICENSE文件中找到。

简化的死码检测器。用于跳过对无法访问的代码的某些检查(例如,对特定于代码的代码进行重复检查)。

vet检查源代码并报告可疑结构,例如参数与格式字符串不相匹配的Printf调用。vet内部实现方法不能保证所有的报告都中涉及问题的真实性, 但它可以发现编译器未捕获到的错误。

可以用三种方式调用:

对于包

go vet package/path/name

vet 审查提供路径的软件包。

对于文件

go tool vet source/directory/*.go

vet 审查该路径下的所有go文件。

对于文件夹

go tool vet source/directory

vet会递归进入目录,审查它找到的每个包。

如果错误地调用工具,Vet的退出代码是2,如果报告出现问题,则为1,没有问题为0。请注意,该工具不检查每一个可能的问题,所以它应该只用作指导,而不是作为程序正确性的确切指标。

默认情况下,将设置-all标志,以便执行所有检查。如果任何标志显式设置为true,则只运行这些测试。相反,如果任何标志显式设置为false,则只有那些测试被禁用。 因此 -printf=true运行printf检查,-printf=false 运行除 printf 检查之外的所有检查。

默认情况下,vet使用 go install some/pkg 生成的目标文件来检查代码。 如果提供了-source 标志,vet只审查源代码。

可用选项:

Assembly declarations

标志:-asmdecl

对汇编文件和Go函数声明不做匹配验证。

Useless assignments

标志:-assign

检查无用的内存分配。

Atomic mistakes

标志:-atomic

检查 sync/atomic 包常见的错误用法。

Boolean conditions

标志:-bool

检查涉及布尔运算符的错误。

Build tags

标志:-buildtags

检查错误的编译命令标签。

Invalid uses of cgo

标志:-cgocall

检测违反cgo指针传递规则的情况。

Unkeyed composite literals

标志:-composites

检测复合结构文字未使用规定的语法。

Copying locks

标志:-copylocks

检测是否有错误的传递锁。

HTTP responses used incorrectly

标志:-httpresponse

检查是否出现错误的推迟了对HTTP响应函数调用,同时检查响应返回的错误是否为nil。

Failure to call the cancelation function returned by WithCancel

标志:-lostcancel

检查context.WithCancel,WithTimeout和WithDeadline返回的取消函数是否被调用, 否则新的上下文将保持活动状态,直到其父级上下文被取消(后台上下文永远不会被取消)。

Methods

标志:-methods

检测是否存在标准库函数名称非标准签名,包括:

Format GobEncode GobDecode MarshalJSON MarshalXML
Peek ReadByte ReadFrom ReadRune Scan Seek
UnmarshalJSON UnreadByte UnreadRune WriteByte
WriteTo

Nil function comparison

标志:-nilfunc

函数调用可用性判断。

Printf family

标志:-printf

检测是否有对Printf系列中的函数(包括具有这些名称的函数)的可疑调用,以下情况不考虑:

Print Printf Println
Fprint Fprintf Fprintln
Sprint Sprintf Sprintln
Error Errorf
Fatal Fatalf
Log Logf
Panic Panicf Panicln

-printfuncs标志可以用来重新定义这个列表。如果函数名以'f'结尾,则假定该函数以fmt.Printf的方式采用格式描述符字符串。如果没有,vet 对看起来像格式描述符字符串的参数提示错误。

它还检查是否使用Writer作为Printf的第一个参数。

Range loop variables

标志:-rangeloops

检测在闭包中是否有错误的循环变量调用。

Shadowed variables

标志:-shadow=false (experimental; must be set explicitly)

检测是否有无意中隐藏的变量。

Shifts

标志:-shift

检测是否有等于或大于变量的长度的调用。

Struct tags

标志:-structtags

检测是否有不符合 reflect.StructTag.Get 格式的结构标签。

Tests and documentation examples

标志:-tests

检测是否有不正确名称或签名的函数,以及在示例测试中未将文件标识符包含在包中。

Unreachable code

标志:-unreachable

检测是否有无法访问的代码。

Misuse of unsafe Pointers

标志:-unsafeptr

unsafe.Pointer将整数转换为指针可能有不正确的用法。 从uintptr到unsafe.Pointer的转换是无效的,如果它意味着在内存中有一个uintptr类型的变量,它包含一个指针值,因为这个单词在堆栈复制和垃圾收集器中是不可见的。该检测如上情况是否存在。

Unused result of certain function calls

标志:-unusedresult

检测是否有需要检查的err返回值而没有检查。默认情况下,这包括fmt.Errorf和fmt.Sprintf之类的函数以及String和Error之类的方法。标志-unusedfuncs和-unusedstringmethods控制对集合的检查。

Other flags

-all (default true)
	启用所有非实验性检查。
-v
	详细模式
-printfuncs
	类似print函数的名称列表,以逗号分隔。
	更多细节查看 -printf 。
-shadowstrict
	对检查影子变量开启严格模式。

vet是一个Go源码的静态检查工具。查看doc.go以获得其他内容。