0

0

如何使用SanitizerCoverage为c++代码生成覆盖率报告? (模糊测试基础)

尼克

尼克

发布时间:2026-01-17 16:07:03

|

476人浏览过

|

来源于php中文网

原创

SanitizerCoverage 是 LLVM 提供的编译时插桩机制,用于运行时收集执行路径信息,本身不生成覆盖率报告,需配合 llvm-cov 或 lcov 等工具解析数据并渲染成 HTML 或 summary 报告。

如何使用sanitizercoverage为c++代码生成覆盖率报告? (模糊测试基础)

SanitizerCoverage 是什么,它能生成“覆盖率报告”吗?

SanitizerCoverage 本身不是覆盖率报告工具,它是 LLVM 提供的一组编译时插桩机制,用于在运行时收集代码执行路径信息(比如哪些 basic block、edge 或函数被触发)。它不直接输出 HTML 或 summary 报告——你得靠 llvm-cov 或第三方脚本(如 lcov)来解析生成的覆盖率数据并渲染成可读格式。模糊测试中常用它配合 libFuzzerAFL++ 收集路径覆盖,但“报告”这一步必须手动补全。

如何编译 C++ 代码启用 SanitizerCoverage 插桩

关键在于链接时保留符号和调试信息,并启用正确的插桩级别。默认 -fsanitize-coverage=trace-pc-guard 最常用,兼顾性能与精度;避免用 trace-pc(无 guard 表,无法做跨进程/多 fuzz 实例聚合)。

  • -fsanitize-coverage=trace-pc-guard:生成 __sanitizer_cov_trace_pc_guard 调用点,配合 runtime guard 数组记录命中状态
  • -g -O2:必须带调试信息(-g),否则 llvm-cov 无法映射到源码行
  • -fno-omit-frame-pointer:部分覆盖率工具链(如旧版 llvm-cov)依赖 frame pointer 定位函数边界
  • 禁用 LTO:-flto 会干扰插桩位置,导致覆盖率漏报,除非你明确用 -fsanitize-coverage=trace-pc-guard -fuse-ld=lld -Wl,-plugin-opt=save-temps 配合 LLD
clang++ -g -O2 -fno-omit-frame-pointer \
  -fsanitize-coverage=trace-pc-guard \
  -o target_fuzzer target.cpp -fsanitize=fuzzer

运行后如何提取和转换覆盖率数据

SanitizerCoverage 运行时把覆盖率写入内存中的 __sanitizer_cov_trace_pc_guard_init 初始化的 guard 数组,但不会自动落盘。你需要主动触发 dump,或依赖 fuzzer 自动保存(如 libFuzzer 的 -dump_coverage=1)。

  • libFuzzer 场景:加 -dump_coverage=1 参数,运行结束后会在当前目录生成 coverage.dat(二进制格式)
  • 自定义程序:调用 __sanitizer_dump_coverage()(需链接 compiler-rt,且该函数非稳定 ABI,LLVM 版本间可能变化)
  • 转换为 llvm-cov 可读格式:用 llvm-profdata merge -sparse coverage.dat -o default.profdata
  • 生成报告:llvm-cov show ./target_fuzzer -instr-profile=default.profdata -show-inlined -Xdemangler=c++filt

注意:coverage.dat 是稀疏格式,不能直接用 xxd 查看;如果看到 ERROR: Failed to load coverage: Unsupported format version,说明 llvm-profdata 和编译器 LLVM 版本不一致(比如用 clang-16 编译,却用 llvm-profdata-15 解析)。

Favird No-Code Tools
Favird No-Code Tools

无代码工具的聚合器

下载

立即学习C++免费学习笔记(深入)”;

模糊测试中容易忽略的覆盖率陷阱

覆盖率数字高 ≠ 测试质量好。SanitizerCoverage 在 fuzzing 中尤其容易产生误导:

  • 只统计“是否执行过”,不区分执行次数或输入敏感度——一个 crash 输入和一个普通输入对覆盖率贡献相同
  • 插桩粒度是 basic block,函数内联后 block 合并,可能导致“看似覆盖了函数”实则只进了某个分支
  • 未初始化的 guard 数组(__sanitizer_cov_trace_pc_guard_init 未被调用)会导致全程零覆盖,常见于静态构造函数未触发或 main 之前就 exit 的场景
  • ASan/UBSan 等其他 sanitizer 与 Coverage 共存时,需统一用 -fsanitize=address,coverage,不能分开加,否则插桩逻辑冲突

真正要靠的是把 llvm-cov 输出和 fuzzer 的 corpus/crash 目录交叉比对——比如某个 .cpp 文件显示 90% 行覆盖,但所有 crash 都来自剩下 10% 的边界条件,那这部分才最值得深挖。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
edge是什么浏览器
edge是什么浏览器

Edge是一款由Microsoft开发的网页浏览器,是Windows 10操作系统中默认的浏览器,其目标是提供更快、更安全、更现代化的浏览器体验。本专题为大家提供edge浏览器相关的文章、下载、课程内容,供大家免费下载体验。

1728

2023.08.21

IE浏览器自动跳转EDGE如何恢复
IE浏览器自动跳转EDGE如何恢复

ie浏览器自动跳转edge的解决办法:1、更改默认浏览器设置;2、阻止edge浏览器的自动跳转;3、更改超链接的默认打开方式;4、禁用“快速网页查看器”;5、卸载edge浏览器;6、检查第三方插件或应用程序等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

397

2024.03.05

如何解决Edge打开但没有标题的问题
如何解决Edge打开但没有标题的问题

若 Microsoft Edge 浏览器打开后无标题(窗口空白或标题栏缺失),可尝试以下方法解决: 重启 Edge:关闭所有窗口,重新启动浏览器。 重置窗口布局:右击任务栏 Edge 图标 → 选择「最大化」或「还原」。 禁用扩展:进入 edge://extensions 临时关闭插件测试。 重置浏览器设置:前往 edge://settings/reset 恢复默认配置。 更新或重装 Edge:检查最新版本,或通过控制面板修复

1038

2025.04.24

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

887

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

461

2024.06.27

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

492

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.10.25

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

236

2023.12.07

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

AngularJS教程
AngularJS教程

共24课时 | 4.1万人学习

CSS教程
CSS教程

共754课时 | 42.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号