LLVMFuzzerCustomMutatorLLVMFuzzerCustomMutatorprintfmallocstd::string::appenduint8_t*std::vectorstd::stringmutate_data->Rand()rand()std::random_devicemax_size
extern "C" size_t LLVMFuzzerCustomMutator(uint8_t *data, size_t size, size_t max_size, unsigned int seed) {
// 使用 seed 初始化本地 rng(仅用于确定性调试,实际应只用 mutate_data->Rand())
// 但注意:libFuzzer 不传 seed 给你 —— 这里只是示意;真实代码中删掉这行,直接用 Rand()
auto &mutate_data = *reinterpret_cast(seed); // ❌ 错误!libFuzzer 不传 FuzzerMutateData*
// ✅ 正确方式:libFuzzer v14+ 传的是 FuzzerMutateData,但你不能依赖其内部布局
// 实际应这样(参考 llvm-project/llvm/lib/Fuzzer/FuzzerInterface.h):
// struct FuzzerMutateData { uint32_t (Rand)(); };
// 所以你只能调用 ((FuzzerMutateData*)seed)->Rand()
if (size == 0 || max_size == 0) return size;
立即学习“C++免费学习笔记(深入)”;
C知道
CSDN推出的一款AI技术问答工具
下载
// 示例:50% 概率插入一个合法 JSON key("k":)
if (((FuzzerMutateData*)seed)->Rand() % 2 == 0 && size + 4 <= max_size) {
memmove(data + 4, data, size);
data[0] = '"'; data[1] = 'k'; data[2] = '"'; data[3] = ':';
return size + 4;
}
// 示例:20% 概率把某个数字改成 "9223372036854775807"(int64_max)
if (((FuzzerMutateData)seed)->Rand() % 5 == 0) {
for (size_t i = 0; i + 10 < size; ++i) {
if (data[i] >= '0' && data[i] <= '9') {
const char maxint = "9223372036854775807";
size_t len = strlen(maxint);
if (i + len <= max_size) {
memcpy(data + i, maxint, len);
return std::min(size - (i+10) + len, max_size);
}
}
}
}
return size; // 默认不修改
}
strlenmemcpystd::minLLVMFuzzerCustomCrossOverLLVMFuzzerCustomCrossOverdata1[0..pos]data2[pos..]ERROR: libFuzzer: deadly signalstd::stringstd::vectormallocstd::bad_allocdata[size]sizemax_sizemax_sizemax_sizeif (size > max_size) return size;memmovememcpy