GO语言(十八):模糊测试入门(下)-

Python014

GO语言(十八):模糊测试入门(下)-,第1张

Reverse为了解决这个问题,如果输入不是有效的 UTF-8 ,让我们返回一个错误。

a.在您的文本编辑器中,将现有Reverse函数替换为以下内容。

如果输入字符串包含无效的 UTF-8 字符,此更改将返回错误。

b.由于 Reverse 函数现在返回错误,因此修改main函数以丢弃额外的错误值。将现有main功能替换为以下内容。

这些调用Reverse应该返回一个 nil 错误,因为输入字符串是有效的 UTF-8。

c.您将需要导入错误和 unicode/utf8 包。main.go 中的 import 语句应如下所示。

d.修改reverse_test.go文件检查是否有错误,如果返回产生错误则跳过测试

除了返回之外,您还可以调用t.Skip()以停止执行该模糊输入。

a.使用 go test 运行测试

b.使用go test -fuzz=Fuzz进行模糊测试,几秒钟后,停止用ctrl-C模糊测试。

除非您通过-fuzztime标志进行限制,否则模糊测试将一直运行,直到遇到失败的输入。如果没有发生故障,默认是永远运行,并且可以使用 中断该过程ctrl-C。

c. 使用go test -fuzz=Fuzz -fuzztime 30s。如果没有30 秒发现失败,它会在退出模糊测试。

模糊测试通过了!

做得很好!您刚刚学习了在 Go 中进行模糊测试。

— main.go —

— reverse_test.go —

语料库文件以特殊格式编码。这是种子语料库和生成语料库的相同格式。

下面是一个语料库文件的例子:

第一行用于通知模糊引擎文件的编码版本。虽然目前没有计划未来版本的编码格式,但设计必须支持这种可能性。

下面的每一行都是构成语料库条目的值,如果需要,可以直接复制到 Go 代码中。

在上面的示例中,我们在 a []byte后跟一个int64。这些类型必须按顺序与模糊测试参数完全匹配。这些类型的模糊目标如下所示:

指定您自己的种子语料库值的最简单方法是使用该 (*testing.F).Add方法。在上面的示例中,它看起来像这样:

但是,您可能有较大的二进制文件,您不希望将其作为代码复制到您的测试中,而是作为单独的种子语料库条目保留在 testdata/fuzz/{FuzzTestName} 目录中。golang.org/x/tools/cmd/file2fuzz 上的file2fuzz工具可用于将这些二进制文件转换为为[]byte.

要使用此工具:

语料库条目:语料库 中的一个输入,可以在模糊测试时使用。这可以是特殊格式的文件,也可以是对 (*testing.F).Add。

覆盖指导: 一种模糊测试方法,它使用代码覆盖范围的扩展来确定哪些语料库条目值得保留以备将来使用。

失败的输入:失败的输入是一个语料库条目,当针对 模糊目标运行时会导致错误或恐慌。

fuzz target: 模糊测试的目标功能,在模糊测试时对语料库条目和生成的值执行。它通过将函数传递给 (*testing.F).Fuzz实现。

fuzz test: 测试文件中的一个被命名为func FuzzXxx(*testing.F)的函数,可用于模糊测试。

fuzzing: 一种自动化测试,它不断地操纵程序的输入,以发现代码可能容易受到的错误或漏洞等问题。

fuzzing arguments: 将传递给 模糊测试目标的参数,并由mutator进行变异。

fuzzing engine: 一个管理fuzzing的工具,包括维护语料库、调用mutator、识别新的覆盖率和报告失败。

生成的语料库: 由模糊引擎随时间维护的语料库,同时模糊测试以跟踪进度。它存储在$GOCACHE/fuzz 中。这些条目仅在模糊测试时使用。

mutator: 一种在模糊测试时使用的工具,它在将语料库条目传递给模糊目标之前随机操作它们。

package: 同一目录下编译在一起的源文件的集合。

种子语料库: 用户提供的用于模糊测试的语料库,可用于指导模糊引擎。它由 f.Add 在模糊测试中调用提供的语料库条目以及包内 testdata/fuzz/{FuzzTestName} 目录中的文件组成。这些条目默认使用go test运行,无论是否进行模糊测试。

测试文件: 格式为 xxx_test.go 的文件,可能包含测试、基准、示例和模糊测试。

漏洞: 代码中的安全敏感漏洞,可以被攻击者利用。