本博客(http://blog.csdn.net/livelylittlefish)贴出作者(阿波)相关研究、学习内容所做的笔记,欢迎广大朋友指正!
Content
0. 序
1. 基本块概念
2. 基本块图及插桩点分析
2.1 基本块图
2.2 有效基本块图
2.3 带桩点信息的有效基本块图
2.4 插桩位置及桩代码执行情况分析
3. 小结
Appendix:源代码中对Basic Block的解释
0.序
由前面几篇文章,例如:
Linux平台代码覆盖率测试-.gcda/.gcno文件及其格式分析
Linux平台代码覆盖率测试-GCC插桩前后汇编代码对比分析
我们已经知道了代码覆盖率测试的一些相关概念,例如Basic Block,Arcs等。本文重点叙述这些基本概念,并仍以前面的test.c为例说明基本块图(Basic Block Graph)及插桩点。
本文所用gcc版本为gcc-4.1.2。test.c代码如下。
00001:#include
00002:
00003:intmain(void)
00004:{
00005: inti,total;
00006:
00007: total=0;
00008:
00009: for(i=0;i<10;i++)
00010: total+=i;
00011:
00012: if(total!=45)
00013: printf("Failure/n");
00014: else
00015: printf("Success/n");
00016: return0;
00017:}
00018:
1.基本块概念
通过基本块的划分,可以把程序分为一组代码段,每一段代码中的第一条语句被执行,则整段代码都被执行一次。
那么,什么是基本块(Basic Block)?
基本块
- 程序中一个顺序执行的语句序列
- 只有一个出口语句和一个入口语句
- 执行时只能从入口语句入,从出口语句退出
- 基本块中的所有语句的执行次数一定是相同的
- 一般由多个顺序执行语句后跟一个跳转语句组成
因此,基本块的最后一条语句一定是一个跳转语句,且跳转的目的地一定是另一个基本块的第一条语句。如果跳转语句是有条件的,就产生了一个分支(arc),该基本块就有两个基本块作为目的地。如果把每个基本块当作一个节点,那么一个函数中的所有基本块就构成了一个有向图,称之为基本块图(Basic Block Graph)。且只要知道图中部分BB或arc的执行次数就可以推算出所有的BB