LLVM入门教学——SanitizerCoverage插桩(Linux)

1、介绍

  • LLVM 的 SanitizerCoverage 是一种代码覆盖工具,设计用于支持基于 fuzzing 的测试和其他安全相关工具。SanitizerCoverage 在编译时插桩代码,以在运行时收集覆盖信息,从而帮助识别未覆盖的代码路径,提高测试的有效性和全面性。
  • SanitizerCoverage可以用户自定义桩代码,参考:LLVM入门教学——SanitizerCoverage插桩(自定义桩代码)-CSDN博客
  • 本文使用的是SanitizerCoverage自带的桩代码

2、步骤

  • 准备一个test.c文件,计算该程序运行时的覆盖率。
    • #include <stdio.h>
       
      int main(int argc, char *argv[])
      {
          int a, b;
          char op;
          int result;
          scanf("%d%c%d", &a, &op, &b);
          switch (op) {
              case '+':
                  result = a + b;
                  break;
              case '-':
                  result = a - b;
                  break;
              case '*':
                  result = a * b;
                  break;
              case '/':
                  result = a / b;
                  break;
              default:
                  return 1;
          }
          printf("%d\n", result);
          return 0;
      }
  • 编译时插入桩代码。
    • clang -fsanitize=address -fsanitize-coverage=trace-pc-guard -o test test.c
    • -fsanitize-coverage=trace-pc-guard:对边进行插桩。(默认:edge)
    • -fsanitize-coverage=func,trace-pc-guard:对每个函数插桩。
    • -fsanitize-coverage=bb,no-prune,trace-pc-guard:对基本块插桩。
  • 执行程序获取覆盖率数据文件。
    • ASAN_OPTIONS=coverage=1 ./test
    • 可能遇到段错误,重新执行即可。
  • .sancov文件是 AddressSanitizer生成的覆盖率文件,这些文件包含了程序在运行时覆盖的代码部分的信息。将该文件转换为覆盖率信息。
    • sancov -symbolize *.sancov ./test > test.symcov
  • 查看覆盖率信息。
  • 打印覆盖的函数:
    • sancov -covered-functions *.sancov ./test
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恣睢s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值