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

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&参数的构造函数,默认构造已被禁用,必须通过这个参数化构造函数创建实例,具体步骤如下:

  1. 准备合法的specifier类型对象
    根据specifier实际类型初始化合法对象:

    • 若为基础类型(如int、std::string),可直接用固定值或从Fuzzer输入数据中提取值构造;
    • 若为自定义类型,需确保该对象符合类one构造函数的要求,比如调用其自身合法构造方式初始化。
  2. 修正LibFuzzer入口函数签名
    LibFuzzer入口函数必须遵循标准签名:extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size),原代码中的LLVM..(Data, Size)是错误写法。

  3. 使用参数化构造函数创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:53:11