全数字实时仿真平台SkyEye目标码覆盖率关键技术

1. 研究背景

1.1零插桩目标码覆盖率统计技术

随着武器装备的复杂度的大幅度增加,运行在装备上的嵌入式系统也越来越复杂,功能迭代越来越多,代码中就可能就会存在部分无用代码,或者在执行过程中无法测试覆盖的分支,这可能就会给软件带来很大的漏洞,严重降低软件的可靠性。因此,需要构建一个能够动态分析代码执行覆盖情况的能力,来检测代码中未执行覆盖情况。

通过覆盖率统计分析,得出嵌入式软件执行覆盖情况,查看软件中有那些函数未执行,函数中哪些分支未执行,由此分析软件中函数为什么没有执行,函数中分支为什么没有执行,调整测试方法使尽可能多的函数和函数分支得到测试,大大提升软件的可靠性。

在覆盖率分析时需要分析覆盖率、指令函数覆盖率、指令函数分支覆盖率、源代码行覆盖率、源代码函数覆盖率、源代码函数分支覆盖率。

目前大部分覆盖率统计技术都是通过在源代码中插桩的方式来进行统计覆盖率情况,就是在函数入口,分支语句等地方写入特定标志语句,执行后统计标志信息,来计算覆盖率情况,但是这样做会带来很多的额外成本,如:需要修改源代码,目标码文件增大等问题。这就增加了人工成本,或者由于目标码过大无法下载到目标板等等问题。为解决这些问题,我们需要实现一个不需要插桩就能统计覆盖率的技术。

2. 关键技术

2.1零插桩目标码覆盖率统计技术

(1)零插桩技术

零插桩统计覆盖率需要分析的是嵌入式软件的基本特性和执行特性。在不插桩的前提下,使用反汇编工具生成嵌入式软件目标码的反汇编文件,通过分析反汇编文件获取想要的基础信息,如函数指令信息,地址对应源码行号信息等。在与仿真验证工具配合获取执行PC地址信息,分析嵌入式软件的执行覆盖情况,实现零插桩分析覆盖率的目的。

(2)多架构嵌入式软件目标码分析技术

针对不同架构,如:ARM、SPARC、DSP、PPC等构建相应的嵌入式软件目标码分析技术,能够准确分析嵌入式软件目标码的反汇编文件中的函数名称、函数所有的指令地址信息、函数中分支指令的信息,分支指令的PC地址,分支指令的跳转地址,分支指令的下一条地址等信息、PC指令地址所对应源码的行号信息等。通过这些基础信息,与执行信息配合实现统计覆盖率信息。

(3)数据缓存技术

反汇编和数据分析都是一个比较耗时的阶段,对于大型嵌入式软件可能会有几十万甚至上百万的指令数量级,每次进行分析都会耗费一定的时间,为减少时间上的浪费,提出数据缓存技术,在执行的目标码不变的情况下,尽可能的存储下所有固定分析数据,如目标码的反汇编文件,反汇编文件分析结果,源码文件分析结果等。都可以存储下来,但是在目标码文件修改后,所有缓存文件都需要进行相应更新。

3. 技术途径

3.1零插桩目标码覆盖率统计技术

(1) 零插桩技术

零插桩技术主要需要分析嵌入式软件的目标码及源代码,通过提取目标码及源代码中的特征信息,获取函数信息,及函数中的分支信息。整体流程如下:

 

(2)动态执行PC信息

在仿真环境中,运行嵌入式软件就是将嵌入式软件编译好的二进制文件解析成对应的汇编指令写入仿真硬件环境中,然后一条条执行指令,模拟出嵌入式软件在真实环境中的运行效果。在运行过程中将执行的每条指令地址记录下来就可以得到执行信息。

记录指令执行信息通过创建一个记录设备来完成记录工作,每次处理器执行一条指令时将地址信息传给记录设备由记录设备存储执行地址信息。在记录设备中,会根据收到的地址信息创建相应的地址表来记录执行情况,当收到地址信息后检索当前地址表是否有该地址如果没有将创建一块地址空间映射该地址,如果有该地址的地址表,将会在该地址表对应位置做+1操作。在需要执行信息的时候将检索所有的地址表,将所有非0的地址输出到文件中,达到记录指令流的效果。

 

(3)目标码文件分析

在反汇编文件中会展示目标码中所有的指令信息,包括指令地址、指令操作数、指令名称等信息,通过处理该反汇编文件就可以获取统计目标码覆盖率所需的信息。

 

经过调研发现反汇编文件的格式都是固定的,都基本满足如下格式:

 

解析反汇编文件获取所有的函数指令地址信息。解析过程中还需要获取跳转指令信息,跳转信息获取需要获取三个地址,跳转指令的地址,来确定这个跳转指令是否被执行,跳转的地址,来确定是否进入True分支,跳转指令的下一条地址,来确定是否执行False分支。

每种架构的指令格式都不尽相同所以需要单独处理。

(4)源代码文件分析

在反汇编时,加入-l参数可以在反汇编信息中加入源代码行号信息,如下图:

 

经调研发现反汇编信息中,行号信息与指令信息对应关系是固定的,都基本满足如下格式:

 

处理反汇编文件信息,提取文件行号与指令地址对应信息,计算时如行号的某一条指令被执行那么对应源代码的这一行也就被执行了,但是在反汇编信息中只有产生指令操作的源代码才被认为是有效行,所以本项目中也只统计产生指令操作的有效行,进行各种计算。

源代码的分支信息需要通过分析源代码文件获得准确的分支信息,本项目中采用clang工具提取源代码文件的抽象语法树,通过抽象语法树获取源代码的分支信息。获取到抽象语法树后提取语法数中关于for、if...else、while、switch...case...default等代码块的行号。

其中for、while的分支计算方法为如果执行了该分支起始行不管有没有执行分支块内代码也会认为执行该分支的False分支,如果执行了分支块内代码那也就会认为执行了该分支的True分支。

其中if分支有多种情况如下:

情况一:

if(xxxxxx){xxxxxxx
}

 

情况二:

if(xxxxxx){xxxxxxx
}else{xxxxxxx
}

 

情况三:

if(xxxxxx){xxxxxxx
}else if{xxxxxxx
}else{xxxxxxx
}

 

在计算时遇到情况一,如果执行到了分支起始行不管有没有执行分支块内代码也会认为执行该分支的False分支,如果执行了分支块内代码那也就会也会任务执行了该分支的True分支。遇到了情况二,如果执行了true分支内代码行则认为执行了true分支,如果执行了false分支内代码行则认为执行了false分支。遇到情况三,会将代码分成两个分支对,第一个分支对:if下代码块为true分支,else if下代码块为flase分支,第二个分支对:else if下代码块为true分支,else下代码块为false分支,如果有更多的else if 分析方法一致。

其中switch...case...default的计算方法为有多少个case、default就有多少个分支。

(5)结果计算

获取所需信息后,就可以通过公式计算所需覆盖率结果。

目标码总语句覆盖率:

 

 

目标码总分支覆盖率:

 

目标码函数语句覆盖率:

 

目标码单个函数分支覆盖率:

 

源代码总语句覆盖率:

 

源代码总分支覆盖率:

 

源代码函数语句覆盖率:

 

源代码单个函数分支覆盖率:

 

3.2 多架构嵌入式软件目标码分析技术

每种架构的嵌入式软件目标码反汇编格式整体结构基本一致,但不同架构的指令格式都不尽相同,都有各自的特点,如果只需要函数指令PC地址信息则不需要继续分析,但是我们还需要统计函数中的分支覆盖率情况。每种架构的分支指令不同,格式上也不尽相同,针对不同架构都需要构建对应的指令分析方式。

不同架构的跳转指令如下表:

架构跳转指令
SPARCba,bcc,bcs,be,bg,bge,bgu,ble,bleu,bn,bne,bneg,bpos,bbc,bvs,fble,fbne,fbule,fbuge
MIPSbnez,beq,bne,beqz,bteqz,btnez
TIC6xbnop,b
TIC28xsb,sbf
TIC55xBCC
POWERPCbgt,bne,ble,beq,bge,blt
ARMbeq,bgt,bls,bhi,bcc,bcs,ble,bne,bge,blt

通过调研总结发现如下规律:

SPARC架构跳转指令格式:

be  40101b9c <_longjmp+0x54>

be,a   40101ba8 <_longjmp+0x60>

MIPS架构跳转指令格式:

bnez    v0,bf001990 <myprintf+0xa68>

beq     a0,a3,bf0018c8 <myprintf+0x9a0>

TIC6x架构跳转指令格式:

[b0] b .S1 10800a28 <$C$L4>

[!b0] b .S1 10802220 <__c6xabi_llshl>

|| [!b0] b .S1 10802220 <__c6xabi_llshl>

TIC28x架构跳转指令格式:

sb           13, geq

sb           fffffff2, neq

PPC架构跳转指令格式:

blt-    10550c <ipnet_configure+0x1f8>

beq-    cr7,1055b0 <ipnet_string+0x68>

ARM架构跳转指令格式:

beq     12a68 <strlen+0x24>

bcs     12b64 <__default_signal_handler+0x8c>

TIC55x架构跳转指令格式:

BCC __cmpd,AC2>=#0

BCC #0x0024b0,!TC1

根据以上指令格式特点均可提取出想要的指令信息。

3.3 数据缓存技术

在仿真验证工具中运行的目标码修改都是通过修改源代码实现的,所以在做数据缓存时主要针对这两个地方进行监控,如果目标码文件或者源代码文件进行了修改那么就要更新相应的数据文件,如目标码文件修改就要修改反汇编文件,反汇编文件解析数据,如源码文件修改就要修改源码文件所对应的函数起止行号信息、分支行号信息等。

在记录时以记录每个文件的md5值作为标准,如果目标码文件或者源码文件的md5值与记录中的不匹配那么就证明文件做了修改,如果中间分析文件的md5值与记录中的也不匹配那么就证明中间文件被篡改,都需要重新生成相应的文件,以保证结果的正确性。

 

 

 

 

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

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

相关文章

MCDC — 修正判定条件覆盖

什么是MCDC&#xff1f; 答&#xff1a;修正判定条件覆盖-----程序中的每个输入和输出都至少被调用一次&#xff0c;在程序中的每一个条件必须产生所有可能的输出结果至少一次&#xff0c;并且每一个判定中的每一个条件必须能够独立影响一个判定的输出&#xff0c;即在其他条件…

python terminal调试_python执行命令行调试工具pdb

调试pdbpdb是基于命令行的调试工具&#xff0c;非常类似gnu的gdb(调试c/c)。命令简写命令作用breakb设置断点(用法&#xff0c;b &#xff1a;在第数字行设置断点。.........................................................)b 直接回车&#xff0c;查看所有断点continuec直接…

20以内分数化小数表_如何使用标准正态分布表?

正态分布这个概念在统计学中很常见&#xff0c;在做与正态分布有关计算的时候经常会用到标准正态分布表。如果知道一个数值的标准分数即z-score&#xff0c;就可以非常便捷地在标准正态分布表中查到该标准分数对应的概率值。任何数值&#xff0c;只要符合正态分布的规律&#x…

迪捷软件团队研发的国产替代MBSE系统建模仿真软件

近年来&#xff0c;系统工程的概念越来越火热。其中MBSE&#xff08;基于模型的系统工程&#xff09;是最受大家推崇的。在复杂系统和安全关键的开发领域&#xff0c;如果你不能说出一些跟MBSE有关的一些词儿&#xff0c;那么你是无法号称自己站在时代前沿的。 与传统的系统工程…

greendao删除其中一条_广东东莞将迎来一条新地铁,全长58公里,设24站,沿途市民有福了...

感谢大家阅读&#xff0c;在阅读之前&#xff0c;麻烦您先点击上面的“蓝色字体”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续“免费”收到文章阅读了&#xff0c;每天都会有新鲜热门话题推送&#xff0c;完全是“免费订阅”哦&#xff0c;敬请放心关注阅读~ (内…

系统仿真平台SkyEye可替代国外Matlab/Sumlink等同类软件

传统的系统开发过程&#xff0c;都是由工程师根据项目需求书来编写代码完成系统的开发&#xff0c;但随着功能的扩充和版本的迭代&#xff0c;系统中庞大的代码量很难确保正确无误&#xff0c;给后期测试和仿真带来了很大的压力和成本&#xff0c;在航空航天、卫星系统、核电等…

不满6位补零 字符串_vb6.0中字符串中不足位数前面补0的方法

通过data获取图片拓展名//通过图片Data数据第一个字节 来获取图片扩展名- (NSString *)contentTypeForImageData:(NSData *)data {uint8_t c;[data getBytes:&c length:1];switch (c) {case 0xFF:return "jpeg";case 0x89:return "png";case 0x47:retu…

全数字实时仿真平台SkyEye故障注入测试

故障注入测试&#xff08;Fault Injection Test&#xff09;&#xff0c;简称FIT&#xff0c;是一种可靠性验证技术&#xff0c;在安全关键领域&#xff0c;设备的可靠性与安全性是检验装备制造生产的重要指标之一&#xff0c;针对现有的安全关键领域工程可靠性验证方案中就包括…

js微信监听返回_JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法...

在实际的应用中&#xff0c;我们常常需要实现在移动app和浏览器中点击返回、后退、上一页等按钮实现自己的关闭页面、调整到指定页面或执行一些其它操作的需求&#xff0c;那在代码中怎样监听当点击微信、支付宝、百度糯米、百度钱包等app的返回按钮或者浏览器的上一页或后退按…

玻尔兹曼分布涨落_科学网—高分子统计物理漫谈-涨落耗散定理-2 - 苗兵的博文...

涨落耗散定理是平衡态统计物理的一个极为重要的结果&#xff0c;该定理将一个统计力学体系的涨落关联与其对外界刺激的响应用一个干净的等式联系了起来。有了该定理&#xff0c;测量响应就可以获得平衡态体系的关联性质&#xff0c;反之亦然。如果取静态极限&#xff0c;涨落耗…

全数字实时仿真平台SkyEye经典案例——卫星

1. SkyEye 简介 SkyEye&#xff0c;中文全称天目全数字实时仿真软件&#xff0c;是基于可视化建模的硬件行为级仿真平台&#xff0c;支持用户通过拖拽的方式对硬件进行行为级别的仿真和建模。采用基于LLVM的二进制加速技术&#xff0c;加上各种编译器的轻量级的优化技术&#…

pxc mysql mycat_Mycat+Pxc的配置

1 schema.xml配置文件Balance属性负载均称类型0:不开启读写分离机制&#xff0c;所有读操作都发送到当前可用的writeHost上1&#xff1a;全部的readHost与stand by writeHost参与select语句的负载均衡&#xff0c;简单的说&#xff0c;当双主双从模式(M1-S1&#xff0c;M2-S2 并…

全数字实时仿真平台SkyEye经典案例——空间站项目

1. SkyEye 简介 SkyEye&#xff0c;中文全称天目全数字实时仿真软件&#xff0c;是基于可视化建模的硬件行为级仿真平台&#xff0c;支持用户通过拖拽的方式对硬件进行行为级别的仿真和建模。采用基于LLVM的二进制加速技术&#xff0c;加上各种编译器的轻量级的优化技术&#…

mysql 索引合并_MySQL 索引合并(Index Merge)优化

本文问题什么是Index Merge&#xff1f;Index Merge的限制有哪些&#xff1f;如何查看语句是否使用了Index Merger&#xff1f;Index Merge有哪几种&#xff1f;分别适用于那些情景&#xff1f;如何控制优化器是否使用Index MergeIndex Merge 索引合并索引合并检索方法可以检索…

软件定义汽车带来的困境——如何破局?

目录 为什么软件定义汽车会掀起如此大的讨论热潮&#xff1f; 汽车软件的发展方向 软件开发商的挑战与机遇 近两年&#xff0c;关于汽车软件的讨论越来越多&#xff0c;国产替代的呼声也越来越高&#xff0c;软件定义汽车是业内非常火热的话题之一。 为什么软件定义汽车会掀起…

mysql中upper的用法_Oracle LOWER() 和 UPPER()函数的使用方法

Oracle LOWER() 和 UPPER()函数的使用方法一列返回行不区分大小写这是常见的做法&#xff0c;使列不区分大小写&#xff0c;以确保您所希望返回所有行。SELECT *FROM COURSESWHERE LOWER(education_delivery_method) classroom您可以使用Oracle的UPPER() or LOWER() 函数来在你…

FMI在仿真软件SkyEye中的应用

1.仿真技术的困境 随着科技的发展&#xff0c;我国在安全攸关领域对于嵌入式软件的应用日益广泛&#xff0c;并且对于软硬件的性能及可靠性等方面要求变得更高。面对各种复杂的系统设计所提供的设计和分析手段也逐渐完善&#xff0c;其中仿真技术在近几年越来越受到重视&#x…

mysql命令行cmd_CMD命令行操作MySQL

连接MySQL服务器&#xff1a;mysql -u用户名 -p密码mysql -u用户名 -pEnter Password:输入密码(无密码则直接回车)mysql -h主机名 -u用户名 -p密码 -D数据库名称退出&#xff1a;exit quit \q ctrlc显示帮助信息&#xff1a;\h取消本行命令&#xff1a;\c 取消当前…

c#ovalshape_【原创】C# 实现拖拉控件改变位置与大小(SamWang)(附源代码下载)

前言&#xff1a;很多时候我们需要在运行时&#xff0c;动态地改变控件的位置以及大小&#xff0c;以获得更好的布局。比如说实际项目中的可自定义的报表、可自定义的单据等诸如此类。它们有个特点就是允许客户或者二次开发人员设计它们需要的界面设置功能。本人以前也做过可自…

jmeter提取mysql数据_通过jmeter读取数据库数据,并取值作为请求的入参

为提升测试技能&#xff0c;督促自己学习。故写了这篇文章。测试小白一枚&#xff0c;最近感觉达到了自己认为的瓶颈期。总是有想法&#xff0c;想突破&#xff0c;但是无从入手。工具类用过fiddler、jmeter、charels、postman..大体接口测试工具&#xff0c;均多多少少使用过。…