【5.19】三、白盒测试方法—程序插桩法

news2024/11/19 2:45:14

目录

3.2 程序插桩法

3.2.1 目标代码插桩

3.2.2 源代码插桩

小提示:HeisenBugs

黑盒测试和白盒测试的异同


3.2 程序插桩法

程序插桩法是一种被广泛使用的软件测试技术,由J.C.Huang教授提出。简单来说,程序插桩就是往被测试程序中插入测试代码以达到测试目的的方法,插入的测试代码被称为探针根据测试代码插入的时间可以将程序插桩法分为目标代码插桩源代码插桩

3.2.1 目标代码插桩

目标代码插桩是指向目标代码(二进制代码)插入测试代码获取程序运行信息的测试方法,也称为动态程序分析方法。

目标代码插桩对程序运行时的内存监控、指令跟踪、错误检测等有着重要意义。相比于逻辑覆盖法,目标代码插桩在测试过程中不需要代码重新编译或链接程序,并且目标代码的格式和具体的编程语言无关,主要和操作系统相关,因此目标代码插桩有着广泛的使用。

1. 目标代码插桩的原理

目标代码插桩法的原理是在程序运行平台和底层操作系统之间建立中间层,通过中间层检查执行程序、修改指令,开发人员、软件分析工程师等对运行的程序进行观察,判断程序是否被恶意攻击或者出现异常行为,从而提高程序的整体质量。

2. 目标代码插桩法的执行模式

由于目标代码是可执行的二进制程序,因此目标代码的插桩可分为两种情况:一种是对未运行的目标代码插桩,从头到尾插入测试代码,然后执行程序。这种方式适用于需要实现完整系统或仿真时进行的代码覆盖测试。另一种情况是向正在运行的程序插入测试代码,用来检测程序在特定时间的运行状态信息。

目标代码插桩具有以下3种执行模式:

(1)即时模式(Just-In-Time):原始的二进制或可执行文件没有被修改或执行将修改部分的二进制代码生成文件副本存储在新的内存区域中,在测试时仅执行修改部分的目标代码

(2)解释模式(Interpretation Mode):在解释模式中目标代码被视为数据,测试人员插入的测试代码作为目标代码指令的解释语言,每当执行一条目标代码指令,程序就会在测试代码中查找并执行相应的替代指令,测试通过替代指令的执行信息就可以获取程序的运行信息。

(3)探测模式(Probe Mode):探测模式使用新指令覆盖旧指令进行测试,这种模式在某些体系结构(如x86)中比较好用。

两种情况:对未运行的目标代码插桩,向正在运行的程序插入测试代码;

三种模式:即时模式,解释模式,探测模式。

3. 目标代码插桩工具

由于目标程序是可执行的二进制文件,人工插入代码是无法实现的,因此目标代码插桩一般通过相应的插桩工具实现,插桩工具提供的API可以为用户提供访问指令。常见的目标代码插桩工具主要有:

(1)Pin-Dynamic Binary Instrumentation Tools(简称Pin)

Pin是由Intel公司开发的免费框架,它可以用于二进制代码检测与源代码检测。Pin支持IA-32、x86-64、MIC体系,可以运行在Linux、Windows和Android平台。Pin具有基本块分析器、缓存模拟器、指令跟踪生成器等模块,使用该工具可以创建程序分析工具、监视程序运行的状态信息等。Pin非常稳定可靠,常用于大型程序测试,如Office办公软件、虚拟现实引擎等。

(2)DynamoRIO

DynamoRIO是一个许可的动态二进制代码检测框架,作为应用程序和操作系统的中间平台,它可以在程序执行时实现程序任何部分的代码转换。DynamoRIO支持IA-32、AMD64、Arch64体系,可以运行在Linux、Windows和Android平台。DynamoRIO包含内存调试工具、内存跟踪工具、指令跟踪工具等。

3.2.2 源代码插桩

源代码插桩是指对源文件进行完整的词法、语法分析后,确认插桩的位置,植入探针代码。相比于目标代码插桩,源代码插桩具有针对性和精确性。源代码插桩模型:

从图中可以看出,源代码插桩是在程序执行之前完成的,因此源代码插桩在程序运行过程中会产生探针代码的开销。相比于目标代码插桩,源代码插桩实现复杂程度低。源代码插桩是源代码级别的测试技术,探针代码程序具有较好的通用性,使用同一种编程语言编写的程序可以使用一个探针代码程序来完成测试。 

下面通过一个小案例来讲解源代码插桩。该案例是一个除法运算:

1  #include <stdio.h>
2  #define ASSERT(y) if(y){  printf("出错文件:%s\n",__FILE__);\
3                             printf(" 在第 %d行:\n",__LINE__\);
4                             printf(" 提示:除数不能为0 !\n");\
5                          }        // 定义 ASSERT(y)
6  int main()
7  {
8      int x,y;
9      printf(" 请输入被除数:");
10     scanf("%d",&x);
11     printf(" 请输入除数:");
12     scanf("%d",&y);
13     ASSERT(y==0);             // 插入的桩(即探针代码)
14     printf("%d",x/y);
15     return 0;
16 }

为了监视除法运算除数输入是否正确,在代码第13行插入宏函数ASSERT(y),当除数为0时打印错误原因、出错文件、出错行数等信息提示。宏函数ASSERT(y)中使用了C语言标准库的宏定义“__FILE__”提示出错文件、“__LINE__”提示文件出错位置。

程序运行后,提示输入被除数和除数,在输入除数后,程序宏函数ASSERT(y)判断除数是否为0,若除数为0则打印错误信息,程序运行结束;若除数不为0,则进行除法运算并打印计算结果。根据除法运算规则设计测试用例,如表:

对插桩后的C源程序进行编译、链接,生成可执行文件并运行,然后输入表中的测试用例数据,观察测试用例的实际执行结果与预期结果是否一致。

程序插桩测试方法有效地提高了代码测试覆盖率,但是插桩测试方法会带来代码膨胀、执行效率低下和HeisenBugs,在一般情况下插桩后的代码膨胀率在20%~40%,甚至能达到100%导致插桩测试失败。

小提示:HeisenBugs

HeisenBugs即海森堡Bug,它是一种软件缺陷这种缺陷的重现率很低,当人们试图研究时Bug会消失或改变行为。实际开发软件测试中,这种缺陷也比较常见,例如,测试人员测试到一个缺陷提交给开发人员后,开发人员执行缺陷重现步骤却得不到报告的缺陷,因为缺陷已经消失或者出现了其他缺陷。

黑盒测试和白盒测试的异同

1. 黑盒测试和白盒测试比较

黑盒测试过程中不用考虑内部逻辑结构,仅仅需要验证软件外部功能是否符合用户实际需求。黑盒测试可以发现以下缺陷。(1)外部逻辑功能缺陷,如界面显示信息错误等。(2)兼容性错误,如系统版本支持、运行环境等。(3)性能问题,如运行速度、响应时间等。

白盒测试可以设计测试用例尽可能覆盖程序中的分支语句,分析程序内部结构。白盒测试常用于以下几种情况。(1)源程序中含有多个分支,在设计测试用例时要尽可能覆盖所有分支,提高测试覆盖率。(2)内存泄漏检查迅速,黑盒测试只能在程序长时间运行中发现内存泄漏问题,而白盒测试能立即发现内存泄漏问题。

2. 测试阶段

黑盒测试与白盒测试在不同的测试阶段使用情况也不同,两者在不同阶段的使用情况如:

在测试过程中,黑盒测试与白盒测试结合使用会大大提升软件测试质量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/545049.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

合肥工业大学计算机组成原理课设-系统硬件综合设计

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;信息安全本科生课设-系统硬件综合设计报告 &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#…

Varnish代理服务器

一.Varnish概述 1.Varnish 简介 Varnish是一款高性能且开源的反向代理服务器和HTTP加速器&#xff0c;其采用全新的软件体系机构&#xff0c;和现在的硬件体系紧密配合。与传统的squid相比&#xff0c;Varnish具有高性能、速度快、管理更加方便等优点&#xff0c;目前很多大型…

Python:如何基于滑动窗口进行气候因子间的相关系数分析?(逐像元)

目录 01 常规的相关系数简单说明 02 滑动窗口下的相关系数分析 最近处理一些气候因子的统计分析&#xff0c;遇到一些问题&#xff0c;记录一下。 01 常规的相关系数简单说明 在研究滑动窗口前&#xff0c;我们先来研究一下常规的相关系数分析&#xff0c;为了简化问题&…

《The Element of Style》阅读笔记 —— 章节 I Elementary Rules of Usage

前言&#xff1a;本科期间担任科研助理时&#xff0c;有幸从导师那里借来这本书通读&#xff0c;只记得自己当时在本子上做了一些笔记&#xff0c;但是想不起来具体记了什么&#x1f602;前段时间再次从学院的讲座活动中听闻这本书&#xff0c;决定重温一遍&#xff0c;本篇为此…

实验一 结构化分析与设计——数据流图DFD与模块结构图SC

一、实验目的&#xff1a; 掌握传统结构化分析方法中功能建模的基本思想&#xff0c;即数据流分析技术。数据流图DFD是软件系统的逻辑模型&#xff0c;描绘数据在系统中从输入到输出所经历的变换&#xff08;即加工处理&#xff09;。 同时&#xff0c;了解变换型和事务型数据…

Copernicus DEM 30 metre dataset now freely available01 December 2020

欧空局宣布,除2019年发布的哥白尼DEM 90米分辨率外,30米分辨率数据的访问权限现已延长,数据集对任何注册用户开放和免费。 自2019年以来,哥白尼方案配备了全球一致的高分辨率数字高程模型,供所有用户使用,以处理各种应用。 哥白尼DEM结合了平坦的水体、连贯的河流流、编…

外汇客户收支风险管理系统助力外汇业务便利化

外管局2019年开始发文推行跨境投资便利化政策&#xff0c;2023年商务部等17部门又发文支持贸易外汇收支便利化政策&#xff0c;从一个小范围试点政策&#xff0c;到各部委大力推广支持&#xff0c;银行业内重点推广&#xff0c;这3年间外汇业务便利化经历了什么&#xff1f; …

狂飙,ChatGPT 官方 iOS 版本应用上线

ChatGPT正式发布App&#xff0c;可在苹果应用商店下载&#xff0c;安卓版也不远了 在手机上也能玩ChatGPT了&#xff01;当地时间周四&#xff08;5月18日&#xff09;&#xff0c;人工智能研究公司OpenAI在官网宣布&#xff0c;其在美国推出了聊天机器人ChatGPT的iPhone应用&a…

写公开信可别等被喷,才发现其实可以这样

正文共 1022 字&#xff0c;阅读大约需要 4 分钟 公务员必备技巧&#xff0c;您将在4分钟后获得以下超能力&#xff1a; 快速生成公开信 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图片由Le…

Unity A* Pathfinding Project

先下载免费版 https://arongranberg.com/astar/download# 教程首页 https://arongranberg.com/astar/docs/getstarted.html 创建一个plane 当地面 创建一个gameobject 添加组件 PathFinder 长这样 调整每个格子大小的 创建两个layer 一个是阻挡物的 一个是地面的 这里填入阻…

Helm方式部署 zookeeper+kafka 集群 ——2023.05

文章目录 一、添加helm仓库二、安装部署集群2.1 在线安装zookeeperkafka集群2.2 离线安装zookeeperkafka集群 三、验证kafka与zookeeper是否绑定四、测试集群附&#xff1a;可改善地方卸载应用 一、添加helm仓库 # 添加bitnami和官方helm仓库&#xff1a; helm repo add bitna…

独立版:云贝O2O-V2-2.6.3 优化区域代理登录刷新问题

独立版&#xff1a;v2云贝O2O平台版本、版本更新至2.6.3&#xff0c;微信小程序在线上传、后端可开源&#xff0c;即刻源码持续维护更新中&#xff0c;最新全插件&#xff08;4个&#xff09;包更新&#xff0c;包修复、这个是源码&#xff0c;独立版&#xff1b; 支持一键更新…

C++——模板(初阶) + string

作者&#xff1a;几冬雪来 时间&#xff1a;2023年5月19日 内容&#xff1a;C模板 string讲解 目录 前言&#xff1a; 1.模板&#xff1a; 1.函数模板的隐/显示实例化&#xff1a; 2.类模板&#xff1a; 2.STL&#xff1a; 1. 什么是STL&#xff1a; 2.STL六大组件…

【Java入门】Java的语言概述

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Java入门篇系列&#xff0c;该专栏主要讲解&#xff1a;什么是java、java的数据类型与变…

JavaSE入门篇——类和对象(实例理解)

文章目录 一、面向对象简述二、类与对象的基本概念三、类的定义与使用四、this引用五、对象的构造及初始化六、static成员七、 代码块 一、面向对象简述 面向对象是一种现在最为流行的程序设计方法&#xff0c;几乎现在的所有应用都以面向对象为主了&#xff0c;最早的面向对象…

DRMS全国服务中心第一期讲师特训会圆满召开

&#xff0c;时长01:00 近日&#xff0c;【DRMS】数字权益管理系统在美丽的泉城济南展开了为期两天一夜的“【DRMS】全国服务中心首期讲师特训”。此次特训主要针对服务中心的负责人和讲师进行的一场从认知到理念、从规划到执行、从机制到流程的全方位特训。特训中&#xff0c;…

麒麟信安操作系统里安装达梦数据库无法通过./DmServiceDMSERVER启动数据库实例服务的处理

问题现象如下&#xff1a; 但是通过./dmserver pathxxx/dm.ini又能正常启动 查看日志发现有生成日志&#xff1a;/home/dmdba/dmdbms/log/ dm_unknown_yyyymm.log。 日志内容如下&#xff1a; fail to load libpmem.so, libpmem.so: cannot open shared object file: No such …

Nexus私服搭建与使用

文章目录 1 私服简介2 私服安装步骤1:下载解压步骤2:启动Nexus步骤3:浏览器访问步骤4:首次登录重置密码 3 私服仓库分类4 本地仓库访问私服配置步骤1:私服上配置仓库步骤2:配置本地Maven对私服的访问权限步骤3:配置私服的访问路径 5 私服资源上传与下载步骤1:配置工程上传私服的…

css属性选择器、css3结构选择器、伪元素选择器、仿土豆网隐藏遮罩层案例、伪元素清除浮动

属性选择器 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>属性选择器</title><style>…

Kafka在Java项目中的应用

Kafka在Java项目中的应用 Docker 安装Kafka 一.首先需要安装docker,可看这篇文章安装docker 二.拉取zookeeper和KafKa镜像 docker pull wurstmeister/zookeeperdocker pull wurstmeister/kafkaKafka组件需要向zookeeper进行注册,所以也需要安装zookeeper 三.启动zookeeper…