You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让LibFuzzer仅生成偶数长度输入以模糊测试指定函数?

如何让cargo fuzz(LibFuzzer封装)仅生成偶数长度的输入

当然可以跳过那个长度检查的无效测试,直接让LibFuzzer只生成符合要求的偶数长度输入,这里给你两种实用的方案:

方法1:在Fuzz Target层处理输入(推荐)

这是最简单直接的方式,不需要修改LibFuzzer的核心逻辑,只需要在你的fuzz目标代码里,对原始输入做一层过滤或调整,确保传递给toFuzz的是偶数长度的字符串:

#![no_main]
use libfuzzer_sys::fuzz_target;

// 假设你的toFuzz函数已经被正确引入
fn toFuzz(input: String) -> i32 {
    if input.len() % 2 == 1 {
        return 0;
    }
    // 核心逻辑...
    1
}

fuzz_target!(|data: &[u8]| {
    // 调整输入为偶数长度:如果是奇数,就截掉最后一个字节
    let even_length_data = if data.len() % 2 == 1 { &data[..data.len()-1] } else { data };
    // 转换成字符串(按需处理无效UTF-8的情况)
    if let Ok(input_str) = String::from_utf8(even_length_data.to_vec()) {
        toFuzz(input_str);
    }
});

这种方式能确保所有进入toFuzz核心逻辑的输入都是偶数长度,完全跳过了无意义的长度检查分支测试,而且LibFuzzer会通过不断变异输入,覆盖各种偶数长度的场景,不会影响核心逻辑的测试深度。

方法2:自定义LibFuzzer的输入生成策略(进阶)

如果你想让LibFuzzer本身就只生成偶数长度的输入(而非事后调整),可以通过实现LibFuzzer的自定义变异/交叉接口来实现。不过这种方法需要编写C/C++代码(因为LibFuzzer的自定义接口是C语言的),再链接到你的Rust项目中,相对复杂一些:

  • 实现LLVMFuzzerCustomMutator函数,确保每次变异后的输入长度始终为偶数
  • 实现LLVMFuzzerCustomCrossOver函数,保证交叉生成的新输入长度也是偶数
  • 在fuzz target中注册这些自定义函数

不过对于你的场景,方法1已经足够高效好用,没必要折腾进阶方案。


内容的提问来源于stack exchange,提问作者Sleik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:51:03