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

-fsanitize-coverage的trace-pc与trace-pc-guard参数有什么区别?

Clang -fsanitize-coverage 两种trace模式差异

这两个模式都是SanitizerCoverage提供的控制流插桩能力,核心差异如下:

  • 入参与插桩逻辑差异
    trace-pc插入的桩函数为__sanitizer_cov_trace_pc(),无任何入参,运行时只能通过返回地址间接获取当前插桩点的PC信息,且每次走到插桩点都会无条件执行桩函数。
    trace-pc-guard插入的桩函数为__sanitizer_cov_trace_pc_guard(uint32_t *guard),每个插桩点对应一个独有的32位guard变量指针作为入参,执行桩函数前会先检查guard值:如果为0则直接跳过调用,仅非0时执行插桩逻辑。
  • 运行时开销差异
    trace-pc是全量无条件插桩,控制流密集的场景下运行时开销更高,没有动态关闭的能力。
    trace-pc-guard支持运行时动态修改guard值来开启/关闭对应插桩点的统计,冷路径插桩点关闭后几乎无额外开销,整体性能比trace-pc好30%~50%(不同场景下数值会有波动)。
  • 适用场景与扩展性差异
    trace-pc仅适合不需要动态调整插桩的全量覆盖统计场景,实现逻辑简单,自定义扩展空间小。
    trace-pc-guard支持精细粒度的插桩控制,适合增量fuzzing、热点路径过滤、分模块覆盖统计等场景,也是当前AFL++、libFuzzer等主流fuzz工具的默认选择。同时guard变量还可以用来存储命中次数、路径权重等自定义状态,不需要额外维护PC到状态的映射表,内存开销更低。

补充说明:配合-fsanitize-coverage=trace-pc-guard,pc-table参数使用时,编译器会额外生成guard变量与对应PC的全局映射表,运行时可以直接通过guard快速定位到对应的代码位置,不需要手动做地址解析。

内容的提问来源于stack exchange,提问作者SeekaMoon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:27:04