C++:如何创建默认构造函数已删除的类实例测试LibFuzzer接口?
问题:默认构造函数被删除时,如何创建类实例完成LibFuzzer测试
原C++类定义
class one: public two { public: explicit one (specifier const& use_case); one() = delete; void stat(Statistic val); };
测试代码(触发错误版本)
extern "C" LLVM..(Data, Size) { Statistics val = Size; //Assigning the size; one obj; //Creating an instance of one obj.stat(val); //Call stat function and pass the value return 0; }
触发错误
Error: call to deleted constructor 'one'
用户需求
如何在类one默认构造函数被显式删除的情况下,创建其实例并成功执行上述LibFuzzer测试?
解决方案
类one仅提供了带specifier const&参数的构造函数,默认构造已被禁用,必须通过这个参数化构造函数创建实例,具体步骤如下:
准备合法的
specifier类型对象
根据specifier实际类型初始化合法对象:- 若为基础类型(如
int、std::string),可直接用固定值或从Fuzzer输入数据中提取值构造; - 若为自定义类型,需确保该对象符合类
one构造函数的要求,比如调用其自身合法构造方式初始化。
- 若为基础类型(如
修正LibFuzzer入口函数签名
LibFuzzer入口函数必须遵循标准签名:extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size),原代码中的LLVM..(Data, Size)是错误写法。使用参数化构造函数创建
one的实例
用准备好的specifier对象作为参数,调用one的构造函数创建实例,再调用stat方法。
修改后的测试代码示例
假设specifier是可通过字符串构造的类型(如std::string),示例代码如下:
#include <cstdint> // 假设Statistic和specifier的定义已存在 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { // 从Fuzzer输入构造specifier对象 specifier test_spec(reinterpret_cast<const char*>(Data), Size); // 使用参数化构造函数创建one的实例 one obj(test_spec); // 构造Statistic参数并调用stat方法 Statistic val = static_cast<Statistic>(Size); obj.stat(val); return 0; }
如果specifier需要固定合法值(比如枚举常量),可直接使用:
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { specifier test_spec(/* 合法固定值,比如枚举值DEFAULT_SPEC */); one obj(test_spec); Statistic val = static_cast<Statistic>(Size); obj.stat(val); return 0; }
内容的提问来源于stack exchange,提问作者SNH
相关产品推荐
相关产品推荐

