全数字实时仿真平台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;即在其他条件…

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故障注入测试

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

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

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

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

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

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

目录 为什么软件定义汽车会掀起如此大的讨论热潮&#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…

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

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

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

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

如何快速上手mysql_mysql快速上手3

上一章给大家说的是数据库的视图&#xff0c;存储过程等等操作&#xff0c;这章主要讲索引&#xff0c;以及索引注意事项&#xff0c;如果想看前面的文章&#xff0c;url如下&#xff1a;索引简介索引是对数据库表中一个或多个列(例如&#xff0c;employee 表的姓名 (name) 列)…

c mysql 免安装版_MySQL5.6免安装版环境配置图文教程

MySQL是一个小巧玲珑但功能强大的数据库&#xff0c;目前十分流行。但是官网给出的安装包有两种格式&#xff0c;一个是msi格式&#xff0c;一个是zip格式的。很多人下了zip格式的解压发现没有setup.exe&#xff0c;面对一堆文件一头雾水&#xff0c;不知如何安装。下面小编将介…

MDL锁导致mysql夯住_MySQL MetaData Lock 案例分享

前言&#xff1a;今天开发童鞋遇到一个奇怪的问题&#xff0c;在测试环境里面执行drop database dbname发现一直夯住不动&#xff0c;等了很久也没有执行&#xff0c;于是问题就到我这里了一、什么是MetaData Lock&#xff1f;MetaData Lock即元数据锁&#xff0c;在数据库中元…

docker 分布式管理群集_Coolpy7分布式物联网MQTT集群搭建

Coolpy7分布式技术&#xff0c;支持多个Coolpy7 Core提供跨数据中心(多活)模式组建群集&#xff0c;支持群集零手动维护(基于Gossip分布式协议作为群集节点状态维护)。Coolpy7从版本号V7.3.2.3开始支持本功能。请到Coolpy7之github项目release下载相关版本https://github.com/C…

vue 数值 拼接字符串_【Vue原理】Compile - 白话版

写文章不容易&#xff0c;点个赞呗兄弟 专注 Vue 源码分享&#xff0c;文章分为白话版和 源码版&#xff0c;白话版助于理解工作原理&#xff0c;源码版助于了解内部详情&#xff0c;让我们一起学习吧 研究基于 Vue版本 【2.5.17】如果你觉得排版难看&#xff0c;请点击 下面链…

gpio驱动蜂鸣器出现破音_五款蜂鸣器驱动电路原理图

蜂鸣器驱动电路图一&#xff1a;典型的蜂鸣器驱动电路&#xff0c;蜂鸣器驱动电路一般包含&#xff1a;一个三极管、一个蜂鸣器、一个续流二极管、一个滤波电容。1、蜂鸣器&#xff1a;发声元件&#xff0c;在其两端施加直流电压(有源蜂鸣器)或者方波(无源蜂鸣器)就可以发声&am…

mysql 多项式_mysql主从复制原理及实现

一.主从复制原理利用MySQL提供的Replication&#xff0c;其实就是Slave从Master获取Binary log文件&#xff0c;然后再本地镜像的执行日志中记录的操作。由于主从复制的过程是异步的&#xff0c;因此Slave和Master之间的数据有可能存在延迟的现象&#xff0c;此时只能保证数据最…

idea创建web项目运行报404错误_使用IDEA新建Web工程启动报404的错误

新换了一个项目组被人吐槽配置文件都能写错&#xff0c;所以打算从头开始一步步搭建一个项目&#xff0c;包含ssm基础框架、mongodb工具类、redis工具类、jsf配置、log配置等今天先来搭建一个web工程。工程搭建好运行时发现404我们都知道&#xff0c;一般404都是由于请求资源的…