赞
踩
- #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;
- }
- // trace-pc-guard-cb.c
- #include <stdint.h>
- #include <stdio.h>
- #include <sanitizer/coverage_interface.h>
-
- // 这个回调由编译器作为模块构造函数插入到每个DSO中。
- // 'start' 和 'stop' 对应于整个二进制(可执行文件或DSO)中保护区域的起始和结束。
- // 这个回调将至少被每个DSO调用一次,并且可能会用相同的参数被多次调用。
- void __sanitizer_cov_trace_pc_guard_init(uint32_t *start,
- uint32_t *stop) {
- static uint64_t N; // 保护的计数器。
- if (start == stop || *start) return; // 只初始化一次。
- printf("INIT: %p %p\n", start, stop);
- for (uint32_t *x = start; x < stop; x++)
- *x = ++N; // 保护应该从1开始。
- }
-
- // 这个回调由编译器在控制流的每个边上插入(应用了一些优化)。
- // 通常,编译器会生成这样的代码:
- // if(*guard)
- // __sanitizer_cov_trace_pc_guard(guard);
- // 但是对于大型函数,它会生成一个简单的调用:
- // __sanitizer_cov_trace_pc_guard(guard);
- void __sanitizer_cov_trace_pc_guard(uint32_t *guard) {
- if (!*guard) return; // 复制保护检查。
- // 如果将 *guard 设置为 0,这段代码将不会再次被该边调用。
- // 现在你可以获取PC并做任何你想做的事:
- // 将其存储在某处或立即符号化并打印。
- // `*guard` 的值是你在
- // __sanitizer_cov_trace_pc_guard_init 中设置的,因此你可以使它们连续
- // 并使用它们来解除数组或位向量的引用。
- void *PC = __builtin_return_address(0);
- char PcDescr[1024];
- // 这个函数是sanitizer运行时的一部分。
- // 要使用它,请链接AddressSanitizer或其他sanitizer。
- __sanitizer_symbolize_pc(PC, "%p %F %L", PcDescr, sizeof(PcDescr));
- printf("guard: %p %x PC %s\n", guard, *guard, PcDescr);
- }
- clang -g -fsanitize-coverage=trace-pc-guard test.c -c
- clang trace-pc-guard-cb.c test.o -fsanitize=address -o test.exe
- test.exe
【注】trace-pc-guard
:用于边缘覆盖。
- 【结果分析】
- 0x009832d8到0x009832f8之间的字节数:
- 0x009832f8 - 0x009832d8 = 0x20
- guard(插入的点)个数 = 0x20 / 4 = 8(每个guard变量占用4个字节)
- 所以SanitizerCoverage在源代码中一共插入了8个点。
- 分析运行结果,在没有输入数据前,执行了两个点(不同的)。输入数据后,又执行了两个点(不同的),所以一共执行了4个点。
- 覆盖率计算
- 假设总共有N个guard变量,而运行时触发了M个不同的guard变量,那么覆盖率可以计算为:
- 覆盖率 = (
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/621786
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。