谷歌开源Python模糊测试工具Atheris

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。欢迎贡献,但必须遵循适当的指南。

阅读 43
0 条评论