• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      嵌入式處理器P2020機(jī)器碼程序到C語(yǔ)言源程序的溯源方法

      2021-10-20 03:06:14謝文光李琪馬春燕汪克念尹偉張濤
      航空學(xué)報(bào) 2021年9期
      關(guān)鍵詞:代碼指令語(yǔ)法

      謝文光,李琪,馬春燕,*,汪克念,尹偉,張濤

      1. 中國(guó)民航大學(xué) 適航學(xué)院 民航航空器適航審定技術(shù)重點(diǎn)實(shí)驗(yàn)室, 天津 300300

      2. 航空工業(yè)無(wú)線電電子研究所, 上海 200241

      3. 西北工業(yè)大學(xué) 軟件學(xué)院, 西安 710072

      目前,電信、軍事以及工業(yè)嵌入式應(yīng)用領(lǐng)域均要求確保機(jī)器碼程序和C源程序的功能一致性,以防止編譯過(guò)程中插入非C源程序中要求的例外功能,影響嵌入式系統(tǒng)可靠性和安全性[1]。例如民用飛機(jī)機(jī)載軟件通常采用RTCA/DO-178C作為適航符合性方法。對(duì)于A級(jí)軟件(即安全水平最高的研制保證等級(jí)軟件)[2],RTCA/DO-178C要求實(shí)現(xiàn)機(jī)器碼程序到源程序的追溯性。

      PowerPC P2020[3]處理器在航空嵌入式軟件系統(tǒng)和其他嵌入式領(lǐng)域中被廣泛應(yīng)用。C語(yǔ)言應(yīng)用程序需要在PC平臺(tái)X86處理器上通過(guò)C語(yǔ)言編譯器進(jìn)行編譯[4],生成可以在PowerPC P2020處理器上執(zhí)行的機(jī)器碼程序。本文以RTCA/DO-178C中的適航要求[5]作為研究的出發(fā)點(diǎn),以PowerPC P2020處理器的機(jī)器碼程序作為溯源的需求,假設(shè)編譯器在編譯過(guò)程中可能會(huì)插入例外代碼,通過(guò)追溯機(jī)器碼程序和C源程序的溯源關(guān)系,降低安全關(guān)鍵軟件存在的風(fēng)險(xiǎn)和不穩(wěn)定因素。

      目前溯源方法需要程序員人工分析并建立映射關(guān)系,分析難度高、效率低。提升機(jī)器碼程序和C源程序溯源關(guān)系的自動(dòng)化程度是目前研究的熱點(diǎn)之一。Brauer等[6]通過(guò)判斷機(jī)器碼和源代碼的控制流圖是否同構(gòu),提出了一種使用抽象解釋驗(yàn)證部分機(jī)器碼和源代碼可追溯性分析的技術(shù)。Boccardo等[7]利用調(diào)用圖的大小、函數(shù)數(shù)量、控制流圖的頂點(diǎn)和邊的數(shù)量4個(gè)特性,提出了一種使用人工神經(jīng)網(wǎng)絡(luò)來(lái)關(guān)聯(lián)源代碼和機(jī)器碼的方法,但是,該方法實(shí)現(xiàn)的機(jī)器碼的溯源關(guān)系精確性有待提高。文獻(xiàn)[8]采用程序分析技術(shù)建立知識(shí)庫(kù),并對(duì)源代碼進(jìn)行分析,以揭示所使用的變量、算術(shù)操作、邏輯操作、關(guān)系操作和控制結(jié)構(gòu)等參數(shù)。Rapita 公司和GmbH 公司[9-10]分別研制了源碼到機(jī)器碼追溯的可視化工具,靜態(tài)分析C代碼和匯編代碼程序,從分支、函數(shù)、內(nèi)存分配等角度,驗(yàn)證源代碼到機(jī)器碼的追溯關(guān)系。文獻(xiàn)[11]討論了從源代碼到機(jī)器碼追溯涉及的相關(guān)技術(shù),但未給出具體追溯方法。文獻(xiàn)[12]根據(jù)源代碼的典型語(yǔ)法結(jié)構(gòu)及代碼子集,生成源碼、匯編代碼交叉對(duì)照列表,但未給出函數(shù)體中機(jī)器碼和源代碼的代碼行追溯方法。文獻(xiàn)[13]對(duì)惡意代碼可執(zhí)行文件進(jìn)行反匯編及分詞,利用Word2Vec對(duì)反匯編后的十六進(jìn)制碼進(jìn)行矢量化,搭建TextCNN深度學(xué)習(xí)模型進(jìn)行家族譜判定,但該方法僅根據(jù)已有的樣本來(lái)識(shí)別變體,可能導(dǎo)致溯源工作低效甚至無(wú)效。文獻(xiàn)[14]研究目前提出的惡意代碼的溯源技術(shù),指出具有更高級(jí)威脅的惡意代碼檢測(cè)存在缺陷。文獻(xiàn)[15]將源代碼與機(jī)器碼的每一個(gè)語(yǔ)句映射到向量,利用神經(jīng)網(wǎng)絡(luò)體系結(jié)構(gòu),逐句分析源代碼及機(jī)器碼之間的關(guān)系。文獻(xiàn)[16-17]介紹了一種驗(yàn)證MC68020機(jī)器碼正確性的形式化方法,但是該研究并未涉及浮點(diǎn)型程序的驗(yàn)證。文獻(xiàn)[18]將GCC編譯器源代碼中的函數(shù)分為會(huì)修改輸入數(shù)據(jù)的函數(shù)和不會(huì)修改輸入數(shù)據(jù)的函數(shù),人工對(duì)比輸入輸出數(shù)據(jù)檢測(cè)是否被插入惡意代碼,但效率較低。

      基于以上研究背景,本文提出從文件、函數(shù)名、函數(shù)體代碼行3層次實(shí)現(xiàn)PowerPC P2020處理器機(jī)器碼程序與C源程序之間的溯源方法,與現(xiàn)有工作相比,具有以下優(yōu)點(diǎn):

      1) 方法更具有通用性,適用于不同語(yǔ)言、不同處理器型號(hào)之間溯源關(guān)系的研究,只需將 2.4.1 節(jié)中語(yǔ)言語(yǔ)法結(jié)構(gòu)到匯編語(yǔ)言指令序列映射規(guī)則的定義修改為相關(guān)語(yǔ)言及處理器匯編語(yǔ)言指令序列映射規(guī)則的定義即可。

      2) 方法分析機(jī)器碼代碼行和源碼的溯源關(guān)系時(shí),不局限于機(jī)器碼子集、關(guān)鍵語(yǔ)法特征、分支或函數(shù)等。

      3) 方法可以提升溯源的自動(dòng)化程度,并研制落地的實(shí)驗(yàn)環(huán)境實(shí)現(xiàn)溯源對(duì)比的目標(biāo),節(jié)省人工勞動(dòng)。

      4) 方法利用源代碼和機(jī)器碼之間語(yǔ)法和語(yǔ)義的等價(jià)性原理進(jìn)行溯源,更為精確可靠。

      1 PowerPC P2020機(jī)器碼程序到C語(yǔ)言源程序的溯源需求

      自頂向下分解C語(yǔ)言源碼和PowerPC P2020機(jī)器碼之間的溯源關(guān)系,可將C語(yǔ)言源碼和PowerPC P2020機(jī)器碼之間的映射需求分為3部分:

      1) PowerPC P2020機(jī)器碼文件主名應(yīng)與C語(yǔ)言源碼文件主名溯源。

      在編譯過(guò)程[19]中,編譯器會(huì)根據(jù)C源程序文件主名生成相同主名的PowerPC P2020機(jī)器碼文件。在映射函數(shù)及函數(shù)體前,需要先對(duì)生成的機(jī)器碼文件(.o文件)進(jìn)行檢查,建立文件之間的映射關(guān)系,以防在鏈接時(shí)引入未知的文件模塊。

      2) PowerPC P2020機(jī)器碼文件中函數(shù)名應(yīng)與C語(yǔ)言源碼文件中的函數(shù)名溯源。

      在文件主名一一映射的前提下,需要先對(duì)生成的機(jī)器碼文件中所有的函數(shù)名進(jìn)行檢查,建立函數(shù)名之間的映射關(guān)系,以防在鏈接時(shí)引入未知的函數(shù)模塊。

      3) PowerPC P2020機(jī)器碼文件中的函數(shù)體代碼應(yīng)和C語(yǔ)言源碼文件中的函數(shù)體代碼溯源。

      在文件主名與函數(shù)名一一映射的前提下,對(duì)生成的機(jī)器碼中所有的函數(shù)體進(jìn)行檢查,防止在編譯時(shí)引入未知的代碼行。

      2 PowerPC P2020機(jī)器碼程序到C語(yǔ)言源程序的溯源

      2.1 算法概覽

      論文提出的溯源算法 CodeTraceBack的偽代碼如算法1。根據(jù)第1節(jié)的3層次映射需求,溯源算法CodeTraceBack包括3個(gè)子算法,即文件的溯源子算法、函數(shù)聲明的溯源子算法和函數(shù)體的溯源子算法。

      算法1 溯源算法CodeTraceBack偽代碼

      1) 文件溯源(偽代碼1~25行):C源程序與PowerPC P2020機(jī)器碼程序經(jīng)預(yù)處理模塊處理后,獲取C源程序文件主名列表與PowerPC P2020機(jī)器碼程序文件主名列表,對(duì)比得出C源程序與PowerPC P2020機(jī)器碼程序文件主名的溯源關(guān)系,詳見2.2節(jié)。

      2) 函數(shù)聲明溯源(偽代碼26~62行):通過(guò)遍歷C源程序抽象語(yǔ)法樹[20]獲取函數(shù)名列表;通過(guò)遍歷PowerPC P2020機(jī)器碼程序匯編碼獲取函數(shù)名列表。對(duì)比兩項(xiàng)函數(shù)列表分析得出C源程序與PowerPC P2020機(jī)器碼程序函數(shù)名的溯源關(guān)系,詳見2.3節(jié)。對(duì)于函數(shù)可變參數(shù)的情況或其他錯(cuò)誤情況,如果導(dǎo)致函數(shù)聲明中形式參數(shù)和形式參數(shù)個(gè)數(shù)出現(xiàn)溯源問(wèn)題,由于形式參數(shù)會(huì)在函數(shù)體中的代碼行中使用,函數(shù)體溯源時(shí)會(huì)發(fā)現(xiàn)與機(jī)器碼匯編指令集無(wú)法匹配的問(wèn)題。

      3) 函數(shù)體溯源(偽代碼63~103行):根據(jù)C源程序生成的抽象語(yǔ)法樹,結(jié)合論文定義的抽象語(yǔ)法樹節(jié)點(diǎn)與匯編指令集的映射規(guī)則,生成以函數(shù)為單位的期望匯編指令序列。同時(shí),以函數(shù)為單位獲取機(jī)器碼程序?qū)?yīng)的實(shí)際匯編代碼序列。對(duì)比期望的匯編指令序列和編譯器生成的匯編代碼序列,即可得出C源程序與機(jī)器碼程序函數(shù)體的溯源關(guān)系,詳見2.4節(jié)。

      2.2 PowerPC P2020機(jī)器碼程序文件主名與源文件文件主名溯源

      C源程序與PowerPC P2020機(jī)器碼程序文件主名之間的溯源包括經(jīng)預(yù)處理獲取PowerPC P2020機(jī)器碼程序文件主名名稱、C源程序文件主名名稱、建立追溯關(guān)系3個(gè)步驟。

      1) 針對(duì)PowerPC P2020機(jī)器碼程序,預(yù)處理模塊解析其文件主名,去除文件名后綴,生成機(jī)器碼主名列表,標(biāo)記為targetFileNameSet,對(duì)應(yīng)偽代碼中第3行。

      2) 針對(duì)C源程序,預(yù)處理模塊解析其文件主名,去除文件名后綴,生成源文件主名列表,標(biāo)記為sourceFileNameSet,對(duì)應(yīng)偽代碼中第2行。

      3) 建立targetFileNameSet中文件主名到sourceFileNameSet中文件主名的追溯關(guān)系,標(biāo)記為ResultOfFileName。分析機(jī)器碼文件主名列表targetFileNameSet和源文件列表sourceFileNameSet中的文件主名是否相等。若匹配成功,將該文件主名對(duì)應(yīng)的文件目錄和文件主名存儲(chǔ)在ResultOfFileName中;若匹配失敗,則添加該文件主名至ResultOfFileName中,并標(biāo)注其未能追溯的結(jié)果,對(duì)應(yīng)偽代碼中4~23行。ResultOfFileName表格包含3列,即PowerPC P2020機(jī)器碼程序文件主名所在的目錄、C源程序文件主名所在的目錄、文件主名和結(jié)果標(biāo)注。

      2.3 PowerPC P2020機(jī)器碼程序函數(shù)聲明與源文件函數(shù)聲明的溯源

      C源程序與PowerPC P2020機(jī)器碼程序函數(shù)名之間的溯源分為3個(gè)步驟,包括反匯編機(jī)器碼程序獲取機(jī)器碼函數(shù)名列表、通過(guò)語(yǔ)法分析獲取C源程序函數(shù)名列表,以及對(duì)比獲取機(jī)器碼函數(shù)名列表和C源程序函數(shù)名列表的溯源關(guān)系。

      1) 針對(duì)PowerPC P2020機(jī)器碼程序,生成其所有函數(shù)名列表(偽代碼49~61行)。

      偽代碼第50行通過(guò)編譯器套件中提供的“powerpc-linux-gnu-objdump-t”命令對(duì)PowerPC P2020機(jī)器碼程序進(jìn)行反匯編操作。PowerPC P2020機(jī)器碼程序文件遵循ELF格式,偽代碼51~59行解析PowerPC P2020機(jī)器碼程序ELF格式中的符號(hào)表段(.symtab段),識(shí)別函數(shù)名、函數(shù)名所在的行號(hào)以及該函數(shù)名所在的機(jī)器碼文件主名,構(gòu)造PowerPC P2020機(jī)器碼程序所有函數(shù)聲明的列表targetFuncNameSet(偽代碼第60行)。列表中的每個(gè)元素包括3個(gè)屬性信息:函數(shù)名、行號(hào)、機(jī)器碼文件主名。其中,機(jī)器碼文件主名是2.2節(jié)中機(jī)器碼程序成功映射的文件主名。

      2) 針對(duì)C源程序,基于抽象語(yǔ)法樹生成其所有函數(shù)名列表(偽代碼31~48行)。

      語(yǔ)法分析模塊可以利用開源工具Pycparser或其他自主研制的類似工具,生成C源程序文件的抽象語(yǔ)法樹(偽代碼第44行)。每個(gè)抽象語(yǔ)法樹的節(jié)點(diǎn)包含了語(yǔ)法結(jié)構(gòu)的名稱、子節(jié)點(diǎn)信息及其在C源程序中的行號(hào)信息。偽代碼第46行調(diào)用的getSourceFunc函數(shù)(偽代碼31~42行)遍歷抽象語(yǔ)法樹,搜索抽象語(yǔ)法樹中所有FuncDef節(jié)點(diǎn)(函數(shù)聲明節(jié)點(diǎn)),根據(jù)節(jié)點(diǎn)的屬性信息,構(gòu)造C源程序所有函數(shù)聲明的列表sourceFuncNameSet(偽代碼第47行)。列表中的每個(gè)元素包括3個(gè)屬性信息:函數(shù)名、行號(hào)、源文件主名。其中,源文件主名是2.2節(jié)中機(jī)器碼程序成功映射的文件主名。

      3) 建立PowerPC P2020機(jī)器碼程序函數(shù)名和C源程序函數(shù)名之間的追溯關(guān)系(偽代碼第62行)。

      針對(duì)targetFuncNameSet和sourceFuncNameSet中機(jī)器碼文件主名和源文件主名一致的2個(gè)元素,利用偽代碼中的compareSets函數(shù)計(jì)算這2個(gè)元素的函數(shù)名是否相等。建立PowerPC P2020機(jī)器碼程序函數(shù)名和C源程序函數(shù)名之間的追溯關(guān)系列表,標(biāo)記為ResultOfFuncName,將匹配成功的函數(shù)名信息存入該表格中,表格包含6列,即targetFuncNameSet列表中的每個(gè)元素和sourceFuncNameSet列表中的每個(gè)元素,同時(shí)將未匹配成功的進(jìn)行標(biāo)注。

      2.4 PowerPC P2020機(jī)器碼函數(shù)體代碼與源文件函數(shù)體代碼的溯源

      C源程序與PowerPC P2020機(jī)器碼程序的函數(shù)體之間的溯源分為3個(gè)步驟,包括結(jié)合C源程序?qū)?yīng)的抽象語(yǔ)法樹與映射規(guī)則生成期望匯編指令序列、反匯編機(jī)器碼程序獲取實(shí)際的匯編代碼序列,以及獲取匯編代碼序列和期望匯編指令序列的溯源關(guān)系。其中,確定C源程序抽象語(yǔ)法樹節(jié)點(diǎn)生成期望匯編語(yǔ)言指令序列的規(guī)則是本文的核心關(guān)鍵技術(shù)。

      本文建立了抽象語(yǔ)法樹節(jié)點(diǎn)映射到P2020期望匯編語(yǔ)言指令序列的規(guī)則庫(kù),偽代碼第70行即當(dāng)遍歷到抽象語(yǔ)法樹節(jié)點(diǎn)時(shí)則調(diào)用該規(guī)則庫(kù),利用規(guī)則庫(kù)中抽象語(yǔ)法樹節(jié)點(diǎn)與期望匯編指令序列之間關(guān)系的規(guī)則定義,生成源程序的期望匯編指令序列。2.4.1節(jié)將詳細(xì)闡述該抽象語(yǔ)法樹節(jié)點(diǎn)映射到PowerPC P2020匯編語(yǔ)言指令序列的規(guī)則庫(kù)定義。

      2.4.1 C程序語(yǔ)法結(jié)構(gòu)到PowerPC P2020匯編

      語(yǔ)言指令序列映射規(guī)則的定義

      抽象語(yǔ)法樹節(jié)點(diǎn)包含23類,由于論文篇幅所限,本文僅列出函數(shù)類、流程控制類、跳轉(zhuǎn)類、運(yùn)算類等較為常用的抽象語(yǔ)法樹節(jié)點(diǎn),詳細(xì)闡述它們到PowerPC P2020匯編語(yǔ)言指令序列映射規(guī)則的定義。完整的語(yǔ)法結(jié)構(gòu)、語(yǔ)義及對(duì)應(yīng)的P2020匯編代碼序列的映射規(guī)則上傳https:∥gitee.com/angelavor/cto,便于讀者查看。

      1) 函數(shù)類

      ① 函數(shù)調(diào)用節(jié)點(diǎn)funcCall

      對(duì)于C源程序的抽象語(yǔ)法樹的函數(shù)調(diào)用節(jié)點(diǎn)funcCall,生成的匯編語(yǔ)言指令的規(guī)則為

      (1)若調(diào)用語(yǔ)句中不存在實(shí)參:

      生成一條條件跳轉(zhuǎn)指令:bl。

      (2)若調(diào)用語(yǔ)句中存在實(shí)參:

      (a)識(shí)別C語(yǔ)言函數(shù)調(diào)用語(yǔ)句中的實(shí)參對(duì)應(yīng)的抽象語(yǔ)法樹,遍歷該抽象語(yǔ)法樹的各個(gè)節(jié)點(diǎn)類型,生成相應(yīng)的匯編語(yǔ)言指令序列:若參數(shù)類型為整型或者長(zhǎng)整型:lwz;若參數(shù)類型為字符型:lbz、clrlwi、mr;若參數(shù)類型為短整型:lhz、extsh、mr;若參數(shù)類型為浮點(diǎn)型:lwz、efdcfs、evmergehi、mr;若參數(shù)類型為雙精度浮點(diǎn)型:lwz、lwz、mr、mr;若參數(shù)類型為數(shù)組型:addi、mr。

      (b)生成一條函數(shù)調(diào)用指令:crclr addres。

      (c)一條條件跳轉(zhuǎn)指令:bl。

      ② 函數(shù)聲明節(jié)點(diǎn)funcDecl

      對(duì)于C源程序的抽象語(yǔ)法樹的函數(shù)聲明節(jié)點(diǎn)funcDecl,生成的匯編語(yǔ)言指令序列規(guī)則為

      (1)函數(shù)體入口指令序列:stwu、stw、mr。

      (2)識(shí)別C語(yǔ)言函數(shù)體中語(yǔ)句序列對(duì)應(yīng)的抽象語(yǔ)法樹,遍歷該抽象語(yǔ)法樹的各個(gè)節(jié)點(diǎn)類型,生成相應(yīng)的匯編語(yǔ)言指令序列。

      (3)函數(shù)體出口指令序列:lwz、mr、blr。

      2) 控制語(yǔ)句相關(guān)節(jié)點(diǎn)

      ① if控制節(jié)點(diǎn)

      對(duì)于C源程序的抽象語(yǔ)法樹的if節(jié)點(diǎn),生成的匯編語(yǔ)言指令序列規(guī)則為

      (1)根據(jù)if語(yǔ)句的判斷條件語(yǔ)句函數(shù)塊信息生成對(duì)應(yīng)的匯編指令序列:

      (a)如果第1個(gè)子樹是constant或者id節(jié)點(diǎn):不添加匯編指令。

      (b)如果第1個(gè)子樹是binaryOp,且binaryOp的兩個(gè)子樹均為constant節(jié)點(diǎn):不添加匯編指令。

      (c)其他情況:遍歷該抽象語(yǔ)法樹,根據(jù)各個(gè)節(jié)點(diǎn)類型,生成相應(yīng)的匯編語(yǔ)言指令序列。

      (2)生成1條比較指令:

      (a)如果第1個(gè)子樹是constant或者id節(jié)點(diǎn):不添加匯編指令。

      (b)如果第1個(gè)子樹是binaryOp且binaryOp的兩個(gè)子樹均為constant節(jié)點(diǎn):不添加匯編指令。

      (c)如果第1個(gè)子樹是binaryOp,且binaryOp的判斷條件是“||”,binaryOp的兩個(gè)子樹存在一個(gè)constant節(jié)點(diǎn):不添加匯編指令。

      (d)如果第1個(gè)子樹binaryOp的兩個(gè)子樹節(jié)點(diǎn)均為id:cmpw。

      (e)如果第1個(gè)子樹binaryOp的兩個(gè)子樹有且只有一個(gè)constant節(jié)點(diǎn):cmpwi。

      (3)生成1條條件跳轉(zhuǎn)指令:

      (a)若第1個(gè)子樹是id:beq。

      (b)若第1個(gè)子樹binaryOp的比較符號(hào)為“==”:若變量為浮點(diǎn)型:ble;其他情況:bne。

      (c)若第1個(gè)子樹binaryOp的比較符號(hào)為“!=”:若變量為浮點(diǎn)型:bgt;其他情況:beq。

      (d)若第1個(gè)子樹binaryOp的比較符號(hào)為“>=”:若均為變量且變量均為浮點(diǎn)型:ble;若均為變量:blt;若存在一個(gè)常量(即其他情況):ble。

      (e)若第1個(gè)子樹binaryOp的比較符號(hào)為“>”:ble。

      (f)若第1個(gè)子樹binaryOp的比較符號(hào)為“<=”:若變量為浮點(diǎn)型:ble;其他情況:bgt。

      (g)若第1個(gè)子樹binaryOp的比較符號(hào)為“<”:若均為變量且變量均為浮點(diǎn)型:ble;若均為變量:bge;若存在一個(gè)常量(即其他情況):bgt。

      (4)根據(jù)if語(yǔ)句條件為true情況下函數(shù)塊信息生成對(duì)應(yīng)的匯編指令序列:遍歷該抽象語(yǔ)法樹,根據(jù)各個(gè)節(jié)點(diǎn)類型,生成相應(yīng)的匯編語(yǔ)言指令序列。

      (5)若存在第3個(gè)子樹else函塊,則生成1條無(wú)條件跳轉(zhuǎn)指令:b。

      (6)根據(jù)if語(yǔ)句條件為false情況下函數(shù)塊信息生成對(duì)應(yīng)的匯編指令:遍歷該抽象語(yǔ)法樹,根據(jù)各個(gè)節(jié)點(diǎn)類型,生成相應(yīng)的匯編語(yǔ)言指令序列。

      圖1給出了if節(jié)點(diǎn)翻譯為匯編指令序列排列的邏輯原理。

      圖1 if節(jié)點(diǎn)映射規(guī)則圖Fig.1 Diagram of correspondece of if node to rule

      ② for循環(huán)節(jié)點(diǎn)

      對(duì)于C源程序的抽象語(yǔ)法樹的for節(jié)點(diǎn),簡(jiǎn)式標(biāo)記為“for(A;B;C){D}”,生成的匯編語(yǔ)言指令序列規(guī)則為

      (1)根據(jù)代碼塊A信息生成對(duì)應(yīng)的匯編指令序列:

      (a)A為變量:lwz。

      (b)A為其他數(shù)據(jù)類型:根據(jù)A節(jié)點(diǎn)類型對(duì)應(yīng)的規(guī)則生成程序塊A對(duì)應(yīng)的匯編指令序列。

      (2)一條跳轉(zhuǎn)指令:b。

      (3)若存在代碼塊D:根據(jù)D節(jié)點(diǎn)類型對(duì)應(yīng)的規(guī)則生成程序塊D對(duì)應(yīng)的匯編指令序列;否則不產(chǎn)生匯編指令。

      (4)若存在代碼塊C:根據(jù)C節(jié)點(diǎn)類型對(duì)應(yīng)的規(guī)則生成代碼塊C對(duì)應(yīng)的匯編指令序列。

      (5)若存在代碼塊B:根據(jù)B節(jié)點(diǎn)類型對(duì)應(yīng)的規(guī)則生成代碼塊B對(duì)應(yīng)的匯編指令序列。

      3) 跳轉(zhuǎn)類節(jié)點(diǎn)

      ① 返回節(jié)點(diǎn)return

      對(duì)于C源程序的抽象語(yǔ)法樹的return節(jié)點(diǎn),生成的匯編語(yǔ)言指令序列規(guī)則為

      根據(jù)函數(shù)體返回類型信息生成對(duì)應(yīng)的匯編語(yǔ)言指令序列:

      (1)若函數(shù)體返回類型為void:

      (a)若返回值為空:li、stw。

      (b)若返回值不為空:不添加匯編指令。

      (2)若函數(shù)體返回類型為整型:

      (a)若返回值為常量:li。

      (b)返回值為變量:lwz。

      (3)若函數(shù)體返回類型為字符型:lbz,clrlwi。

      (4)若函數(shù)體返回類型為浮點(diǎn)型:lwz,mtctr。

      ② 循環(huán)終止節(jié)點(diǎn)break

      對(duì)于C源程序的抽象語(yǔ)法樹的break節(jié)點(diǎn),規(guī)則為生成一條b指令,表示無(wú)條件跳轉(zhuǎn)。

      4) 運(yùn)算類節(jié)點(diǎn)

      ① 二元運(yùn)算符binaryOp

      對(duì)于C源程序的抽象語(yǔ)法樹的binaryOp節(jié)點(diǎn),簡(jiǎn)式為:“A?B”。其中“?”代表“>”“ < ”“ ==”“!=”“ +”“ -”“ *”“/”等運(yùn)算符號(hào)。生成的匯編語(yǔ)言指令序列步驟為:

      步驟1識(shí)別binaryOp節(jié)點(diǎn)中存儲(chǔ)的運(yùn)算符,如果是“>”“ <”“ ==”“ !=”則跳轉(zhuǎn)至步驟2,執(zhí)行步驟2~步驟4;如果為“+”“ -”“ *”“/”則跳轉(zhuǎn)至步驟5~步驟7。

      步驟2識(shí)別程序中B對(duì)應(yīng)的抽象語(yǔ)法樹,遍歷該抽象語(yǔ)法樹的各個(gè)節(jié)點(diǎn)類型,生成相應(yīng)的匯編語(yǔ)言指令序列。

      步驟3識(shí)別程序中A對(duì)應(yīng)的抽象語(yǔ)法樹,遍歷該抽象語(yǔ)法樹的各個(gè)節(jié)點(diǎn)類型,生成相應(yīng)的匯編語(yǔ)言指令序列。

      步驟4一條比較指令cmpw。

      步驟5識(shí)別程序中A對(duì)應(yīng)的抽象語(yǔ)法樹,遍歷該抽象語(yǔ)法樹的各個(gè)節(jié)點(diǎn)類型,生成相應(yīng)的匯編語(yǔ)言指令序列。

      步驟6識(shí)別程序中B對(duì)應(yīng)的抽象語(yǔ)法樹,遍歷該抽象語(yǔ)法樹的各個(gè)節(jié)點(diǎn)類型,生成相應(yīng)的匯編語(yǔ)言指令序列。

      步驟7識(shí)別binaryOp節(jié)點(diǎn)中存儲(chǔ)的運(yùn)算符,如果是“+”則添加一條add指令;如果是“-”則添加一條subf指令;如果是“*”則添加一條mullw指令;如果是“/”則添加一條divw指令。

      ② 單目運(yùn)算節(jié)點(diǎn)unaryOp

      C源程序中單目運(yùn)算符生成匯編語(yǔ)言指令集合的規(guī)則。對(duì)于C源程序的抽象語(yǔ)法樹的unaryOp節(jié)點(diǎn),簡(jiǎn)式為:“a++”“ --a”“ &a”“ -a”“ !a”“ ~a”“ *a”,生成的匯編語(yǔ)言指令序列應(yīng)為:

      步驟1識(shí)別unaryOp節(jié)點(diǎn)中存儲(chǔ)的運(yùn)算符,若為“*”或“&”,直接跳轉(zhuǎn)至步驟4。

      步驟2一條lwz指令,用于將a加載進(jìn)寄存器。

      步驟3識(shí)別unaryOp節(jié)點(diǎn)中存儲(chǔ)的運(yùn)算符,如果為“++”“--”則添加一條add指令,它是“addi”和“add”的統(tǒng)一表示,用于進(jìn)行自增自減運(yùn)算;如果為“-”,增添一條neg指令;若為“~”,增添一條not指令;若為“!”,不處理。

      步驟4一條st指令,用于將寄存器中的結(jié)果加載到棧中。

      2.4.2 建立PowerPC P2020機(jī)器碼程序函數(shù)體語(yǔ)句序列與C源程序函數(shù)體語(yǔ)句之間的追溯關(guān)系

      基于2.4.1節(jié)中 C程序語(yǔ)法結(jié)構(gòu)到PowerPC P2020匯編語(yǔ)言指令序列映射規(guī)則的定義,建立函數(shù)體之間的追溯關(guān)系分以下3個(gè)步驟。

      1) 針對(duì)于C源程序,利用pycpaser開源庫(kù)生成其抽象語(yǔ)法樹ast(偽代碼第50行)。偽代碼95~102行通過(guò)遍歷ast的抽象語(yǔ)法樹節(jié)點(diǎn),并結(jié)合2.4.1節(jié)中構(gòu)建的規(guī)則庫(kù)生成期望匯編指令序列,并以函數(shù)體為單位將生成的期望指令序列存儲(chǔ)在sourceFuncAssemSet數(shù)組中。期望匯編指令序列中子項(xiàng)的節(jié)點(diǎn)格式為[cmd, coord],其中cmd存儲(chǔ)期望匯編語(yǔ)言指令序列助記符,coord中存儲(chǔ)對(duì)應(yīng)C源程序中的代碼行號(hào)信息。

      2) 針對(duì)PowerPC P2020機(jī)器碼程序,偽代碼第50行利用“powerpc-linux-gnu-objdump-d-lfilename”命令解析機(jī)器碼程序文件,提取出函數(shù)名、匯編語(yǔ)言指令序列以及對(duì)應(yīng)C源程序中的代碼行號(hào)信息。偽代碼第70~94行以函數(shù)體為單位,將編譯器生成的相應(yīng)函數(shù)的匯編語(yǔ)言指令序列存儲(chǔ)在targetFuncAssemSet數(shù)組中。

      3)建立PowerPC P2020機(jī)器碼程序函數(shù)體語(yǔ)句序列與C源程序函數(shù)體語(yǔ)句之間的追溯關(guān)系:

      ① 為方便計(jì)算其匹配率,算法將每一個(gè)匯編指令用唯一的ASCII碼值替換,并保存匯編指令與ASCII碼轉(zhuǎn)換的映射字符表(偽代碼第103行)。

      ② 對(duì)比實(shí)際匯編指令序列以及期望匯編指令序列對(duì)應(yīng)的字符串,若完全匹配,則匹配率為100%;若存在不匹配的字符,則匹配率為匹配的字符個(gè)數(shù)/字符總個(gè)數(shù)。

      ③ 根據(jù)映射字符表,回溯對(duì)應(yīng)的匯編指令。字符串中互相匹配的字符即為實(shí)際匯編指令序列與期望的匯編指令序列中互相匹配的匯編指令。

      2.5 庫(kù)函數(shù)的溯源

      1) 動(dòng)態(tài)鏈接庫(kù)函數(shù)的溯源。對(duì)于動(dòng)態(tài)鏈接的庫(kù)函數(shù),首先需要存放常用動(dòng)態(tài)鏈接庫(kù)的源碼,當(dāng)ELF文件頭中表明所依賴動(dòng)態(tài)鏈接庫(kù)時(shí),需要根據(jù)對(duì)應(yīng)動(dòng)態(tài)鏈接庫(kù)的源碼,按照2.4節(jié)機(jī)器碼文件函數(shù)體代碼與源文件函數(shù)體代碼的映射方法進(jìn)行匹配即可,以驗(yàn)證該動(dòng)態(tài)鏈接庫(kù)是否存在問(wèn)題。

      2) 靜態(tài)鏈接庫(kù)函數(shù)的溯源。當(dāng)機(jī)器碼文件函數(shù)體內(nèi)部存在連續(xù)的匯編代碼行不能與期望匯編指令序列匹配時(shí),需要驗(yàn)證該段代碼是否為直接展開的庫(kù)函數(shù)。對(duì)于直接展開的庫(kù)函數(shù),需要預(yù)先加載當(dāng)前C源程序引用的函數(shù)庫(kù)。匹配方法與2.4節(jié)函數(shù)體匹配相似,但不需要建立C程序語(yǔ)法結(jié)構(gòu)到PowerPC P2020匯編語(yǔ)言指令序列映射規(guī)則,只需要對(duì)展開前函數(shù)庫(kù)的二進(jìn)制代碼進(jìn)行反匯編作為期望匯編指令序列,然后與機(jī)器碼文件中未能匹配的連續(xù)匯編代碼行(即內(nèi)嵌的庫(kù)函數(shù))進(jìn)行匹配即可,以驗(yàn)證編譯器是否在靜態(tài)鏈接時(shí)對(duì)匯編指令進(jìn)行修改。

      3 實(shí)驗(yàn)驗(yàn)證

      3.1 實(shí)驗(yàn)環(huán)境搭建

      本文采用ubuntu20.04和python3.8,根據(jù)圖2的實(shí)驗(yàn)流程,編程實(shí)現(xiàn)用于實(shí)驗(yàn)驗(yàn)證的實(shí)驗(yàn)環(huán)境(命名為:NwpuSrcTrace)。NwpuSrcTrace以C源程序文件和PowerPC P2020機(jī)器碼文件作為輸入,通過(guò)可視化界面輸出機(jī)器碼和C源程序在文件、函數(shù)聲明和函數(shù)體代碼的追溯結(jié)果。

      圖2 實(shí)驗(yàn)驗(yàn)證流程Fig.2 Experimental verification process

      3.2 測(cè)試用例

      1) 文件主名溯源測(cè)試用例

      為驗(yàn)證文件溯源方法的有效性,論文設(shè)計(jì)了245個(gè)C源程序文件和與345個(gè)PowerPC P2020機(jī)器碼文件,其中100個(gè)機(jī)器碼文件設(shè)計(jì)為無(wú)法匹配到C語(yǔ)言源文件。

      2) 函數(shù)名溯源測(cè)試用例

      為驗(yàn)證函數(shù)聲明溯源方法的有效性,論文設(shè)計(jì)了1 111個(gè)C語(yǔ)言函數(shù)聲明與1 273個(gè)PowerPC P2020機(jī)器碼函數(shù)聲明,其中162個(gè)機(jī)器碼函數(shù)聲明無(wú)法找到對(duì)應(yīng)的C語(yǔ)言源文件中的函數(shù)聲明。

      3) 函數(shù)體溯源測(cè)試用例

      為驗(yàn)證函數(shù)體代碼溯源的有效性,論文覆蓋C語(yǔ)言程序的23類抽象語(yǔ)法樹節(jié)點(diǎn),分別設(shè)計(jì)了20個(gè)C源程序文件和相應(yīng)的20個(gè)PowerPC P2020機(jī)器碼程序文件,共計(jì)460個(gè)測(cè)試用例進(jìn)行函數(shù)體代碼溯源實(shí)驗(yàn)。表1列舉了函數(shù)聲明decl、if、for和while等部分抽象語(yǔ)法樹節(jié)點(diǎn)對(duì)應(yīng)的C源程序測(cè)試用例。為便于讀者查看完整的測(cè)試用例,詳見https:∥gitee.com/angelavor/cto。

      表1 部分節(jié)點(diǎn)C源程序?qū)嶒?yàn)對(duì)象

      3.3 實(shí)驗(yàn)步驟

      1) 導(dǎo)入源文件和機(jī)器碼文件

      將C源程序文件存儲(chǔ)在指定文件夾中,利用風(fēng)河Workbench嵌入式開發(fā)平臺(tái)GCC編譯器(航空領(lǐng)域應(yīng)用常用編譯器)對(duì)C源程序文件進(jìn)行編譯,得到對(duì)應(yīng)的PowerPC P2020機(jī)器碼程序文件,并存儲(chǔ)在相應(yīng)工程文件夾中。運(yùn)行實(shí)驗(yàn)環(huán)境NwpuSrcTrace中的home.py程序,啟動(dòng)可視化界面,導(dǎo)入C源程序文件與PowerPC P2020機(jī)器碼程序文件。

      2) 機(jī)器碼文件溯源

      點(diǎn)擊溯源菜單, “文件主名溯源”“函數(shù)名溯源”和“函數(shù)體溯源”功能可以分別輸出文件名(如圖3所示)、函數(shù)名(如圖4所示)和函數(shù)體代碼(如圖5所示)的追溯清單。

      文件主名溯源界面(圖3)中,上方為源文件列表與機(jī)器碼文件列表。下方的文件主名溯源結(jié)果顯示匹配信息與文件主名。

      圖3 文件溯源結(jié)果輸出界面Fig.3 File traceability output interface

      函數(shù)名溯源界面(圖4)中,右側(cè)上方顯示為機(jī)器碼函數(shù)的匯編指令列表。下方的函數(shù)名溯源結(jié)果顯示匹配信息、函數(shù)名以及函數(shù)所在文件主名。

      圖4 函數(shù)聲明溯源結(jié)果輸出界面Fig.4 Output interface of function definition tracing results

      函數(shù)體溯源界面(圖5)中,右側(cè)上方為機(jī)器碼函數(shù)對(duì)應(yīng)的匯編指令列表。界面下方的函數(shù)體溯源結(jié)果顯示以函數(shù)體為單位的匹配率。

      圖5 函數(shù)體溯源結(jié)果輸出界面Fig.5 Output interface of function body tracing results

      3.4 實(shí)驗(yàn)結(jié)果分析

      1) 文件溯源結(jié)果

      圖6為系統(tǒng)導(dǎo)出的共590個(gè)文件溯源結(jié)果的部分截圖,其中包括匹配成功/失敗信息、C源程序文件主名信息和PowerPC P2020程序文件主名信息。目前文件主名溯源方法已達(dá)到100%準(zhǔn)確率。

      圖6 文件溯源測(cè)試結(jié)果展示Fig.6 Display of file traceability test results

      2) 函數(shù)聲明溯源結(jié)果

      圖7為系統(tǒng)導(dǎo)出的共2 384個(gè)函數(shù)名溯源方法的部分測(cè)試結(jié)果,其中包括匹配成功/失敗信息、該函數(shù)名所在C源程序文件主名或該函數(shù)名所在PowerPC P2020程序文件主名信息。目前函數(shù)聲明溯源已達(dá)到100%的準(zhǔn)確率。

      圖7 函數(shù)名溯源測(cè)試結(jié)果展示Fig.7 Display of function name traceability test results

      3) 函數(shù)體代碼行溯源結(jié)果

      表2給出了覆蓋23類抽象語(yǔ)法樹節(jié)點(diǎn)的C程序溯源測(cè)試結(jié)果:第1列為抽象語(yǔ)法樹節(jié)點(diǎn),第2列為節(jié)點(diǎn)含義的描述,第3列為測(cè)試用例介紹,第4列為C語(yǔ)言函數(shù)體與機(jī)器碼函數(shù)體部分代碼示例,第5列為函數(shù)體代碼溯源的匹配率。實(shí)驗(yàn)結(jié)果表明,除少數(shù)節(jié)點(diǎn)類型匹配率較低外,其余節(jié)點(diǎn)的匹配率較高,函數(shù)體代碼的平均成功匹配率為97.22%。匹配率低的節(jié)點(diǎn)涉及到復(fù)雜數(shù)據(jù)類型,如長(zhǎng)整型long、浮點(diǎn)型float和雙精度浮點(diǎn)型double。編譯器對(duì)浮點(diǎn)和雙精度數(shù)據(jù)類型的處理是動(dòng)態(tài)的并依賴于計(jì)算機(jī)的硬件環(huán)境,同時(shí)編譯器會(huì)對(duì)部分運(yùn)算進(jìn)行合并優(yōu)化操作。例如:針對(duì)“b=a*2”語(yǔ)句,根據(jù)抽象語(yǔ)法樹節(jié)點(diǎn)對(duì)應(yīng)規(guī)則,BinaryOp節(jié)點(diǎn)的運(yùn)算符號(hào)為“*”,對(duì)應(yīng)的匯編語(yǔ)言指令為“mullw”,但是在實(shí)際編譯過(guò)程中,編譯器會(huì)將其編譯為加法運(yùn)算,即“+”對(duì)應(yīng)的“addi”指令。這些情況會(huì)導(dǎo)致匹配度無(wú)法到達(dá)預(yù)期的情況,仍需要人工對(duì)溯源結(jié)果進(jìn)行審核。

      表2 函數(shù)體代碼行的溯源測(cè)試結(jié)果Table 2 Traceability test results for function body code

      實(shí)驗(yàn)環(huán)境NwpuSrcTrace可以實(shí)現(xiàn)自動(dòng)化溯源文件、函數(shù)聲明和函數(shù)體代碼,能較好地實(shí)現(xiàn)C源碼和編譯后PowerPC P2020機(jī)器碼的可追溯性,詳細(xì)展示機(jī)器碼和源碼的匹配情況,縮減人工追溯C源碼和編譯后的PowerPC P2020機(jī)器碼關(guān)系的時(shí)間與經(jīng)濟(jì)成本。

      4 結(jié)論和展望

      本文提出了一種由PowerPC P2020處理器平臺(tái)的機(jī)器碼工程文件到C語(yǔ)言源代碼工程文件的追溯性分析方法,用戶可以從文件映射、函數(shù)聲明映射、函數(shù)體模塊映射3個(gè)方面獲取PowerPC P2020機(jī)器碼工程文件到C源代碼工程文件的追溯關(guān)系,函數(shù)體代碼的平均追溯匹配率達(dá)97.22%,文件和函數(shù)聲明溯源的追溯匹配率達(dá)100%。

      續(xù)表7

      續(xù)表7

      本文研究目標(biāo)是驗(yàn)證編譯器在編譯過(guò)程中是否插入異常代碼,在工程實(shí)踐過(guò)程中,可以將得到機(jī)器碼程序的過(guò)程分為編譯過(guò)程、驗(yàn)證過(guò)程、裁剪過(guò)程等3個(gè)過(guò)程。在編譯過(guò)程中,通過(guò)參數(shù)控制編譯器生成帶符號(hào)表的ELF文件,即本文中的.o文件。在驗(yàn)證過(guò)程中,使用本文所述方法驗(yàn)證生成程序的正確性。在裁剪過(guò)程中,使用裁剪工具對(duì)驗(yàn)證后的程序進(jìn)行裁剪。因?yàn)椴眉暨^(guò)程是在追溯機(jī)器碼程序的正確性后再進(jìn)行,因此在資源受限的嵌入式領(lǐng)域,生成的二進(jìn)制文件即使經(jīng)過(guò)裁剪,以及溯源所用的符號(hào)表可能會(huì)被刪除,也不會(huì)影響到本文的驗(yàn)證方法。所以本文方法在實(shí)踐中是可行的。

      在現(xiàn)有成果的基礎(chǔ)上,未來(lái)可以從以下4個(gè)方面繼續(xù)進(jìn)行深入研究:

      1) 針對(duì)浮點(diǎn)數(shù)和雙精度帶來(lái)的部分節(jié)點(diǎn)匹配率低問(wèn)題,未來(lái)將通過(guò)分析源碼、存儲(chǔ)符號(hào)及類型的辦法解決。

      2) 目前實(shí)驗(yàn)結(jié)果是覆蓋23類抽象語(yǔ)法樹節(jié)點(diǎn)的C程序單元測(cè)試的溯源,未來(lái)工作采用嵌入式航空領(lǐng)域包含C語(yǔ)言復(fù)雜嵌套數(shù)據(jù)結(jié)構(gòu)的常用函數(shù)庫(kù)和相關(guān)開源軟件作為集成測(cè)試集,對(duì)提出的方法進(jìn)行集成測(cè)試,進(jìn)一步驗(yàn)證方法的有效性。

      3) 在C程序語(yǔ)義分析的基礎(chǔ)上進(jìn)一步探索不同編譯優(yōu)化選項(xiàng)影響下的代碼溯源問(wèn)題。目前編譯器的優(yōu)化選項(xiàng)有O0、O1、O2、O3、Os 這5種,編譯器默認(rèn)使用的是O2優(yōu)化選項(xiàng),本文的實(shí)驗(yàn)結(jié)論也是基于O2優(yōu)化選項(xiàng)。如果修改優(yōu)化選項(xiàng),會(huì)對(duì)論文目前的實(shí)驗(yàn)結(jié)果產(chǎn)生一定的影響,對(duì)于修改優(yōu)化選項(xiàng)后未能溯源的代碼,需要通過(guò)人工方式進(jìn)行溯源分析。本文方法仍能輔助人工完成大部分機(jī)器碼溯源任務(wù),降低全部機(jī)器碼溯源所花費(fèi)的時(shí)間,滿足機(jī)載軟件適航要求。

      4) C/C++是目前機(jī)載軟件開發(fā)的主要語(yǔ)言選擇項(xiàng),后續(xù)將針對(duì)C/C++中更復(fù)雜的嵌套數(shù)據(jù)結(jié)構(gòu)和函數(shù),開展進(jìn)一步研究,并根據(jù)實(shí)驗(yàn)環(huán)境已留出的選擇不同處理器及編程語(yǔ)言的開放接口,使提出的溯源方法推廣適配到其他平臺(tái)處理器以及C++編程語(yǔ)言。

      猜你喜歡
      代碼指令語(yǔ)法
      聽我指令:大催眠術(shù)
      跟蹤導(dǎo)練(二)4
      KEYS
      ARINC661顯控指令快速驗(yàn)證方法
      LED照明產(chǎn)品歐盟ErP指令要求解讀
      創(chuàng)世代碼
      創(chuàng)世代碼
      創(chuàng)世代碼
      創(chuàng)世代碼
      Keys
      大姚县| 六安市| 湖北省| 黔西县| 黄平县| 丰顺县| 庆云县| 临湘市| 鞍山市| 合作市| 蚌埠市| 读书| 平舆县| 恭城| 顺昌县| 图木舒克市| 靖远县| 益阳市| 建湖县| 乐都县| 长泰县| 靖边县| 莱西市| 斗六市| 驻马店市| 南召县| 南溪县| 轮台县| 河津市| 九江市| 汉川市| 临夏市| 望谟县| 邯郸县| 拜泉县| 诸暨市| 铅山县| 桐乡市| 公主岭市| 泽州县| 吉木乃县|