Google开源Python模糊测试引擎Atheris
Google最近宣布开源了一款新的Python模糊测试引擎Atheris,旨在发现Python代码及其原生扩展中的错误。Atheris支持Python 2.7和Python 3.3+版本,并强烈推荐使用Python 3.8+以获得更好的代码覆盖率支持。
Atheris的功能与特点
Atheris可以与Address Sanitizer和Undefined Behavior Sanitizer工具结合使用,以检测内存损坏和未定义行为(如缓冲区溢出、未对齐或空指针)。Atheris不仅适用于Python代码,还支持CPython编写的原生扩展。
Atheris是一个覆盖率导向的(灰盒)模糊测试引擎,利用Clang的libFuzzer来检测被测试代码并收集覆盖率信息。它动态生成输入,以增加代码覆盖率。
使用示例
以下是一个Python代码模糊测试的示例:
import atheris
import sys
def TestOneInput(data):
if data == b"bad":
raise RuntimeError("Badness!")
atheris.Setup(sys.argv, TestOneInput)
atheris.Fuzz()
在这个示例中,TestOneInput
是被测试的函数,Atheris会反复调用该函数,并自动生成输入,直到发生崩溃或异常。
Atheris提供了一个FuzzedDataProvider
,支持多种输入形状(如字符串、列表、整数、浮点数、区间)。Atheris还可以与基于属性的测试工具Hypothesis结合使用,以编写模糊测试套件,并将导致故障的输入缩小到较小的可重现故障案例。
测试策略
Atheris负责测试用例的生成和执行,但程序员需要识别被测试函数的错误行为。这可以通过使用交叉引用预言(差分模糊测试)来实现。如果没有测试预言或变形属性,程序员仍然可以使用模糊测试来检测故障,例如当被测试函数引发意外异常或未能通过故障检测机制时。
实际应用案例
Google举例说明了检查意外异常的有用性。例如,他们测试的一个YAML解析库声称只会引发YAMLError,但Atheris检测到了许多其他异常,如ValueError和TypeError,这表明解析器存在缺陷。
模糊测试的价值
模糊测试和差分模糊测试是强大的自动化测试技术,已经在现有软件中发现了许多错误,如C编译器、Java反编译器、杀毒软件等。Nick Fitzgerald在InfoQ采访中解释了生成测试如何帮助发现其他方法难以检测的错误。
开源与贡献
Atheris是一个开源项目,遵循Apache 2.0许可证,支持Linux(32位和64位)和Mac OS X。欢迎贡献,但必须遵循适当的指南。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。