全数字实时仿真平台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地址信息則不需要繼續分析,但是我們還需要統計函數中的分支覆蓋率情況。每種架構的分支指令不同,格式上也不盡相同,針對不同架構都需要構建對應的指令分析方式。
不同架構的跳轉指令如下表:
| 架構 | 跳轉指令 |
| SPARC | ba,bcc,bcs,be,bg,bge,bgu,ble,bleu,bn,bne,bneg,bpos,bbc,bvs,fble,fbne,fbule,fbuge |
| MIPS | bnez,beq,bne,beqz,bteqz,btnez |
| TIC6x | bnop,b |
| TIC28x | sb,sbf |
| TIC55x | BCC |
| POWERPC | bgt,bne,ble,beq,bge,blt |
| ARM | beq,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值與記錄中的也不匹配那么就證明中間文件被篡改,都需要重新生成相應的文件,以保證結果的正確性。
?
?
?
?
總結
以上是生活随笔為你收集整理的全数字实时仿真平台SkyEye目标码覆盖率关键技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python私有成员和保护成员,喜大普奔
- 下一篇: 高性能全数字嵌入式仿真测试软件SkyEy