/fsanitize-coverage(配置擦除器覆盖率)

/fsanitize-coverage 编译器选项指示编译器添加调用用户定义函数的各种检测点。 这些选项对于使用 /fsanitize=fuzzer 的模糊场景很有用,例如 OneFuzz。 有关详细信息,请参阅 OneFuzz 文档OneFuzz GitHub 项目

语法

/fsanitize-coverage=edge
/fsanitize-coverage=inline-8bit-counters
/fsanitize-coverage=trace-cmp
/fsanitize-coverage=trace-div
/fno-sanitize-coverage=edge
/fno-sanitize-coverage=inline-8bit-counters
/fno-sanitize-coverage=trace-cmp
/fno-sanitize-coverage=trace-div

备注

实验性 /fsanitize-coverage 编译器选项提供代码覆盖支持和各种选项来修改生成的编译器提供的工具。 指定 /fsanitize=fuzzer 选项时会自动设置所有这些选项。 /fsanitize=fuzzer 选项需要这些选项中提到的相同检测点和回调。

/fsanitize-coverage 选项不允许使用逗号分隔的语法,例如:/fsanitize-coverage=edge,inline-8bit-counters,trace-cmp,trace-div。 分别指定这些选项。

从 Visual Studio 2022 版本 17.0 开始,可以使用 /fsanitize-coverage 选项。

代码覆盖率

/fsanitize-coverage=edge 编译器选项启用沿所有非冗余边缘的代码覆盖率检测。 如果另一个选项已提供或暗示此选项,则使用 /fno-sanitize-coverage=edge 禁用此选项。

内联计数器

/fsanitize-coverage=inline-8bit-counters 编译器选项指示编译器在每个相关边上添加一个内联计数器增量。 此选项还添加了一个你必须实现的 extern "C" void __sanitizer_cov_8bit_counters_init(uint8_t *start, uint8_t *stop) 调用。 参数对应于包含所有创建的 8 位计数器的数组的开始和结束。 如果另一个选项已提供或暗示此选项,则使用 /fno-sanitize-coverage=inline-8bit-counters 禁用此选项。

跟踪比较

/fsanitize-coverage=trace-cmp 编译器选项指示编译器插入对以下函数的调用:

// Before each comparison instruction of the stated size.
void __sanitizer_cov_trace_cmp1(uint8_t Arg1, uint8_t Arg2);
void __sanitizer_cov_trace_cmp2(uint16_t Arg1, uint16_t Arg2);
void __sanitizer_cov_trace_cmp4(uint32_t Arg1, uint32_t Arg2);
void __sanitizer_cov_trace_cmp8(uint64_t Arg1, uint64_t Arg2);

// Before each comparison instruction of the stated size, if one of the operands (Arg1) is constant.
void __sanitizer_cov_trace_const_cmp1(uint8_t Arg1, uint8_t Arg2);
void __sanitizer_cov_trace_const_cmp2(uint16_t Arg1, uint16_t Arg2);
void __sanitizer_cov_trace_const_cmp4(uint32_t Arg1, uint32_t Arg2);
void __sanitizer_cov_trace_const_cmp8(uint64_t Arg1, uint64_t Arg2);

如果另一个选项已提供或暗示此选项,则使用 /fno-sanitize-coverage=trace-cmp 禁用此选项。

跟踪划分

/fsanitize-coverage=trace-div 编译器选项指示编译器插入对以下函数的调用:

// Before a division instruction of the stated size.
void __sanitizer_cov_trace_div4(uint32_t Val);
void __sanitizer_cov_trace_div8(uint64_t Val);

如果另一个选项已提供或暗示此选项,则使用 /fno-sanitize-coverage=trace-div 禁用此选项。

设置高级编译器选项

  1. 打开项目的“属性页”对话框。

  2. 选择“配置属性”>“C/C++”>“命令行”属性页

  3. 修改“其他选项”属性以设置 /fsanitize-coverage 选项。

  4. 选择“确定”或“应用”以保存更改。

另请参阅

MSVC 编译器选项
MSVC 编译器命令行语法
/fsanitize(启用擦除器)
AddressSanitizer 生成和语言参考