5个版本 (1个稳定版本)

1.0.0 2024年1月13日
1.0.0-rc.12023年11月29日
0.1.2 2022年7月3日
0.1.1 2022年7月3日
0.1.0 2022年6月17日

#369硬件支持

MIT 协议

26KB
288

Rust Crates

嵌入式-hal-fuzz

嵌入式Rust硬件驱动程序的模糊测试库。有关详细信息,请参阅文档

功能状态

  • I²C(读取,写入读取)
  • SPI(全双工,写入,写入迭代器,事务性)
  • 无操作延迟
  • 串行
  • I/O引脚(输入引脚,输出引脚)
  • PWM

lib.rs:

该crate专为模糊测试设备驱动程序或完整应用程序而设计。它提供了如何模糊设备驱动程序/应用程序的最佳猜测。

入门

如果您不熟悉Rust中的模糊测试,则建议您阅读cargo-fuzz书籍

安装cargo-fuzz

要安装cargo-fuzz,请运行

cargo install cargo-fuzz

在项目中初始化cargo fuzz

要将您的项目设置为使用cargo fuzz,请运行

cargo-fuzz init

这将在“fuzz”目录下添加一个名为targets的目标。

添加新的嵌入式模糊测试目标

要添加新的嵌入式模糊测试目标,请运行

cargo-fuzz add <my_target>

这将在“fuzz/fuzz_targets/my_target.rs”中添加一个新的二进制目标。默认情况下,您的目标将类似于以下内容;

#![no_main]
use libfuzzer_sys::fuzz_target;

fuzz_target!(|data: &[u8]| {
    // fuzzed code goes here
});

要使用此库,只需将您需要的所有类型捆绑到一个模糊测试上下文对象中,例如:

use libfuzzer_sys::fuzz_target;
use embedded_hal_fuzz::digital::{ArbitraryInputPin, ArbitraryOutputPin};
use embedded_hal_fuzz::spi::ArbitrarySpiBus;
use embedded_hal::spi::SpiBus;
use embedded_hal::digital::{InputPin, OutputPin};
use arbitrary::Arbitrary;

#[derive(Debug, Arbitrary)]
struct Ctx {
  input_pin: ArbitraryInputPin,
  output_pin: ArbitraryOutputPin,
  spi: ArbitrarySpiBus<u16>,
  other_data: Vec<u8>,
}
fuzz_target!(|ctx: Ctx| {
  let Ctx {input_pin, mut output_pin, mut spi, other_data } = ctx;
  let _ = output_pin.set_high();
});

这些被模糊测试的外设将返回任意结果,包括Ok/Err类型。由于这些输入由模糊测试数据驱动,因此这些类型非常适合模糊测试您的驱动程序。

依赖项

~0.4–0.9MB
~19K SLoC