程序插桩-实例
程序员文章站
2024-03-19 08:50:52
...
本文主要介绍插装的实例,在测试分类下已经简单介绍了程序插装的基本概念以及插装的位置,更多知识可以查看程序插装相关文献,现将整个插装的流程通过一段C语言程序进行实例说明。
- 注:还处于学习阶段,实例较简单,内容尚待改进,错误之处请指出。
步骤一: Visual studio 编辑代码
1.file->new->project,弹出的窗口中选择第一项W32 console application,如下图所示:
2.对窗口下方的项目名称及存储位置进行编辑后,点击OK,对弹出的窗口点击next,对empty project选项进行勾选,如下图所示:
3.在右侧窗口下方的源文件处鼠标右键,选择add->new item,如下图所示:
4.在弹出的窗口中选择C++ File,对文件进行命名,选择存储位置,点击add,如下图所示:
步骤二:插装说明
采用网上一个说明,图片出处请点击链接,图片具体说明请点击链接,代码请看上一篇博文:控制流图、圈复杂度
该图片中的虚线内容是在源程序的基础上新添加计数语句,用于说明程序的执行情况。
步骤三:插装实例
* 以计算分支覆盖率为例
* 在有关插装的博文中,可以了解到插装主要是在程序的入口处、分支处添加计数语句,我理解的就是添加打印语句,打印语句中包含分支的计数、程序所经历的分支说明,通过多个测试用例,检测代码是否将所有的分支都走了一遍,全部走完即为分支覆盖率百分之百。
下面是我作业中所使用的一部分代码内容:
void menu()
{
int choice;
printf("\n\t\t******************** 主菜单 ********************");
printf("\n\t\t*********** 1-添加纪录 2-查询纪录 ************");
printf("\n\t\t*********** 3-删除纪录 4-修改记录 ************");
printf("\n\t\t*********** 5-显示纪录 6-退出系统 ************");
printf("\n\t\t************************************************");
printf("\n\t\t请选择:");
scanf("%d", &choice);
rewind(stdin);
printf("\n");
switch (choice)
{
case 1:
head = insert(head);
rewind(stdin);
menu();
break;
case 2:
search(head);
rewind(stdin);
menu();
break;
case 3:
head = delet(head);
rewind(stdin);
menu();
break;
case 4:
head = alter(head);
rewind(stdin);
menu();
break;
case 5:
show(head);
rewind(stdin);
menu();
break;
default:
printf("\n\t\t谢谢使用!!");
break;
}
}
在上述分支处添加计数语句:
void menu()
{
int choice;
printf("\n\t\t******************** 主菜单 ********************");
printf("\n\t\t*********** 1-添加纪录 2-查询纪录 ************");
printf("\n\t\t*********** 3-删除纪录 4-修改记录 ************");
printf("\n\t\t*********** 5-显示纪录 6-退出系统 ************");
printf("\n\t\t************************************************");
printf("\n\t\t分支数为:%d\n", i); /*插装探针*/
printf("\n\t\t请选择:");
scanf("%d", &choice);
rewind(stdin);
printf("\n");
switch (choice)
{
case 1:
printf("\n\t\t分支:%d\n", ++i); /*插装探针*/
head = insert(head);
rewind(stdin);
menu();
break;
case 2:
printf("\n\t\t分支:%d\n", ++i); /*插装探针*/
search(head);
rewind(stdin);
menu();
break;
case 3:
printf("\n\t\t分支:%d\n", ++i); /*插装探针*/
head = delet(head);
rewind(stdin);
menu();
break;
case 4:
printf("\n\t\t分支:%d\n", ++i); /*插装探针*/
head = alter(head);
rewind(stdin);
menu();
break;
case 5:
printf("\n\t\t分支:%d\n", ++i); /*插装探针*/
show(head);
rewind(stdin);
menu();
break;
default:
printf("\n\t\t分支:%d\n", ++i); /*插装探针*/
printf("\n\t\t谢谢使用!!");
break;
}
}
- 计算语句覆盖率做法与之相同,为了节省探针的个数,需要将代码分块,在每一块的入口处或出口处添加计数语句或打印语句,对执行情况进行说明。
上一篇: 内存分配
下一篇: 高性能的贪吃蛇C语言实现