• 
    

    
    

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

      C程序變量錯(cuò)誤檢測(cè)技術(shù)的設(shè)計(jì)與實(shí)現(xiàn)

      2016-12-15 02:47:16杜世奇
      軟件 2016年11期
      關(guān)鍵詞:插樁詞法源代碼

      杭 歡,杜世奇

      (1. 北京郵電大學(xué)網(wǎng)絡(luò)技術(shù)研究院,北京市 100876;2. 安徽師范大學(xué)數(shù)學(xué)計(jì)算機(jī)科學(xué)學(xué)院,安徽省蕪湖市 241002)

      C程序變量錯(cuò)誤檢測(cè)技術(shù)的設(shè)計(jì)與實(shí)現(xiàn)

      杭 歡1,杜世奇2

      (1. 北京郵電大學(xué)網(wǎng)絡(luò)技術(shù)研究院,北京市 100876;2. 安徽師范大學(xué)數(shù)學(xué)計(jì)算機(jī)科學(xué)學(xué)院,安徽省蕪湖市 241002)

      C語(yǔ)言自其出現(xiàn)以來(lái)便以其優(yōu)秀的特性被廣泛應(yīng)用于程序開發(fā)中,如今C語(yǔ)言程序在各大領(lǐng)域依然發(fā)揮著重要的作用,尤其在一些重要的部門領(lǐng)域如航空航天、醫(yī)療、銀行等部門提供著系統(tǒng)支持,相應(yīng)的在軟件安全和系統(tǒng)穩(wěn)定上有更高的要求。本文主要針對(duì)C語(yǔ)言程序中常見的變量異常檢測(cè)進(jìn)行研究,以現(xiàn)有開源軟件位基礎(chǔ)實(shí)現(xiàn)編譯器前端對(duì)C語(yǔ)言源程序進(jìn)行詞法語(yǔ)法解析,并實(shí)現(xiàn)基于C語(yǔ)言源代碼插樁檢測(cè)程序變量使用異常的實(shí)驗(yàn),對(duì)“變量使用前未賦初值”、“變量值溢出”等變量使用錯(cuò)誤錯(cuò)誤實(shí)現(xiàn)檢測(cè)和反饋。

      C語(yǔ)言;變量異常;代碼插樁;編譯器

      本文著錄格式:杭?xì)g,杜世奇. C程序變量錯(cuò)誤檢測(cè)技術(shù)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 軟件,2016,37(11):84-87

      0 引言

      C語(yǔ)言誕生于1972年,以簡(jiǎn)潔和功能強(qiáng)大而著稱于世,直到數(shù)十年后的今天仍被廣泛使用,具有十分重要的地位。目前C語(yǔ)言的應(yīng)用領(lǐng)域仍十分廣闊,當(dāng)對(duì)性能有較高要求時(shí),常常會(huì)選擇使用C語(yǔ)言實(shí)現(xiàn),如Linux操作系統(tǒng)、Nginx服務(wù)器、GCC編譯器等等。

      1 課題研究的意義和需求

      C語(yǔ)言的普及決定了其安全性和穩(wěn)定性對(duì)社會(huì)生產(chǎn)至關(guān)重要,但是與Java等更加高級(jí)的編程語(yǔ)言相比,C語(yǔ)言提供的異常處理等機(jī)制比較簡(jiǎn)單,絕大部分情況下,程序員需要自己保證代碼的正確性,而錯(cuò)誤的代價(jià)常常是軟件或系統(tǒng)崩潰。因此,C程序員們需要付出更多努力去編寫C程序,而本文提供的技術(shù)可以幫助C語(yǔ)言使用者發(fā)現(xiàn)程序變量的使用錯(cuò)誤,提高軟件的安全性和穩(wěn)定性。

      2 相關(guān)概念和技術(shù)

      2.1 代碼插樁

      插樁即是在被測(cè)程序中人為的插入一些探測(cè)性程序段,執(zhí)行時(shí)獲取程序的控制流和數(shù)據(jù)流信息。設(shè)計(jì)插樁方案時(shí)需要考慮到插樁位置、插樁策略和插樁時(shí)間等因素[1]。

      以插樁時(shí)間為維度常見有基于源代碼的插樁和機(jī)遇目標(biāo)代碼的插樁之分。

      源代碼插樁技術(shù)是在對(duì)程序源代碼進(jìn)行詞法和

      語(yǔ)法的分析后在需要檢測(cè)的位置插入探針結(jié)構(gòu),之后隨同編譯過(guò)程中的源碼一起構(gòu)建克執(zhí)行程序塊并在測(cè)試期間執(zhí)行檢測(cè),因此源代碼插樁的準(zhǔn)確度較高。然而由于編程語(yǔ)言種類繁多,進(jìn)行源代碼插樁對(duì)不同的語(yǔ)言要實(shí)現(xiàn)相對(duì)應(yīng)的版本,工作量較大。

      目標(biāo)代碼插樁是在目標(biāo)代碼生成之后再插入探針,探針程序的實(shí)現(xiàn)上只與系統(tǒng)底層或硬件相關(guān)而無(wú)需考慮源代碼是何種語(yǔ)言實(shí)現(xiàn)的,解決了源代碼插樁的弊端,但目標(biāo)代碼插樁也有其自身的弊端,因目標(biāo)代碼相對(duì)于源代碼較難理解,不易處理,對(duì)目標(biāo)代碼的分析和插樁實(shí)現(xiàn)較為困難,準(zhǔn)確度較低[2]。

      2.2 Flex和Bison

      Flex是一個(gè)詞法分析器生成工具,通過(guò)讀入一個(gè)有特定格式的輸入文件來(lái)生成相應(yīng)的分析器。該輸入文件包含描述模式的正則表達(dá)式和對(duì)該模式進(jìn)行處理的C代碼,F(xiàn)lex對(duì)其解析之后生成解析函數(shù),并輸出到一個(gè)具有特定文件名的C代碼源文件中,可包含或調(diào)用其中的代碼以使用此分析器。

      Bison是自由軟件基金會(huì)GNU項(xiàng)目開發(fā)的一個(gè)語(yǔ)法分析器生成器,主要作用是將LALR(1)上下文無(wú)關(guān)文法的描述轉(zhuǎn)化成分析該文法的C程序,兼容Yacc,并在其基礎(chǔ)上做了一些改進(jìn)。Bison經(jīng)常和Flex一起使用,同樣需要讀入特定的輸入文件來(lái)生成相應(yīng)的語(yǔ)法分析器。

      3 詞法語(yǔ)法分析器的實(shí)現(xiàn)

      對(duì)C語(yǔ)言程序變量的插裝處理過(guò)程首先需要構(gòu)建編譯器前端,在對(duì)源代碼進(jìn)行完整的詞法、語(yǔ)法分析的基礎(chǔ)上,構(gòu)造出程序的符號(hào)表和語(yǔ)法樹等源碼結(jié)構(gòu)化數(shù)據(jù),用于之后的探針代碼的插入分析和處理。詞法和語(yǔ)法分析器通過(guò)開源軟件構(gòu)造,下圖展示了相關(guān)過(guò)程和工具:

      圖1 步驟及工具

      我們分別以Flex和Bison工具為基礎(chǔ)生成的相應(yīng)的詞法和語(yǔ)法分析邏輯對(duì)C語(yǔ)言程序驚醒此法和語(yǔ)法上的分析并產(chǎn)生對(duì)應(yīng)的語(yǔ)法樹結(jié)構(gòu)數(shù)據(jù),獲取源代碼的結(jié)構(gòu)化語(yǔ)義信息,針對(duì)變量使用節(jié)點(diǎn)上進(jìn)行節(jié)點(diǎn)插裝來(lái)實(shí)現(xiàn)運(yùn)行期變量檢測(cè)。

      3.1 文法語(yǔ)法分析器的生成

      語(yǔ)法定義完成后,需要將輸入文件轉(zhuǎn)換為內(nèi)部標(biāo)記類型的Token并存儲(chǔ)在內(nèi)存中以備使用,使用Flex完成。

      文法分析器使用Bison生成。

      語(yǔ)句包括聲明、表達(dá)式、選擇、循環(huán)、復(fù)合語(yǔ)句和空語(yǔ)句,作為Bison輸入文件實(shí)現(xiàn)產(chǎn)生類C語(yǔ)言文法的語(yǔ)法分析器的[3]。

      3.2 設(shè)計(jì)AST(抽象語(yǔ)法樹)

      抽象語(yǔ)法樹是程序的一種結(jié)構(gòu)化形式,用樹形結(jié)構(gòu)來(lái)保存源代碼的語(yǔ)法結(jié)構(gòu)信息。

      抽象語(yǔ)法樹描述了源程序結(jié)構(gòu)信息在內(nèi)存中的表現(xiàn)形式,首先需要設(shè)計(jì)好語(yǔ)法樹節(jié)點(diǎn)作為語(yǔ)法分析中的數(shù)據(jù)結(jié)構(gòu),為每個(gè)語(yǔ)義單元?jiǎng)?chuàng)建結(jié)構(gòu)。函數(shù)的聲明、調(diào)用,變量的聲明、引用,這些都構(gòu)成了抽象語(yǔ)法樹的節(jié)點(diǎn)[4]。

      抽象語(yǔ)法樹節(jié)點(diǎn)設(shè)計(jì)如下圖,如圖2所示。

      3.3 符號(hào)表結(jié)構(gòu)設(shè)計(jì)

      符號(hào)表是在編譯前期有編譯器前段對(duì)源代碼進(jìn)行分析的過(guò)程中保存的一種數(shù)據(jù)結(jié)構(gòu),用來(lái)存儲(chǔ)源代碼信息的表格的統(tǒng)稱,包含常數(shù)表、變量名表、函數(shù)名表、標(biāo)號(hào)表等[5]。源程序中的每個(gè)標(biāo)識(shí)符都會(huì)在符號(hào)表中建立一個(gè)條目,并記錄這個(gè)標(biāo)識(shí)符的相應(yīng)信息,如類型、內(nèi)存地址和作用域等。

      C語(yǔ)言是一種靜態(tài)類型語(yǔ)言,即在使用標(biāo)識(shí)符前,都需事先定義或聲明。符號(hào)表中保存了當(dāng)前狀態(tài)下已存在的標(biāo)識(shí)符,可以用來(lái)判斷某個(gè)標(biāo)識(shí)符是否未經(jīng)定義或聲明就使用。

      4 C語(yǔ)言程序檢測(cè)技術(shù)的實(shí)現(xiàn)

      4.1 總體流程

      對(duì)研究和設(shè)計(jì)部分的結(jié)果進(jìn)行組裝和細(xì)化,我們得到了下面流程設(shè)計(jì)圖:

      主要分為分析和檢測(cè)兩大部分,通過(guò)詞法語(yǔ)法分析得到源代碼的分析結(jié)果后對(duì)其中的變量使用情況進(jìn)行檢測(cè)。

      4.2 檢測(cè)流程

      源代碼經(jīng)過(guò)詞法和語(yǔ)法分析后就可以獲得相應(yīng)的抽象語(yǔ)義樹,基于語(yǔ)義樹信息對(duì)源程序進(jìn)行分析和插樁操作。

      具體過(guò)程是,遍歷抽象語(yǔ)義樹,獲取樹中的每個(gè)節(jié)點(diǎn)保存的語(yǔ)義信息,對(duì)于變量聲明、變量引用和變量初始化或賦值等不同信息,采用不同的操作,

      如新增變量信息、判斷變量是否已聲明、檢測(cè)變量是否已初始化等,并輸出相應(yīng)結(jié)果。

      流程如圖4。

      圖2 節(jié)點(diǎn)結(jié)構(gòu)定義

      圖3 分析流程圖

      4.3 檢測(cè)實(shí)現(xiàn)

      4.3.1 詞法語(yǔ)法分析實(shí)現(xiàn)

      在對(duì)源代碼進(jìn)行實(shí)際的分析和插裝處理之前,需要對(duì)源程序進(jìn)行一定的預(yù)處理,刪除冗余的注釋信息和用于代碼格式化的字符,避免后期處理冗余處理這些無(wú)用自負(fù)字符,然后將處理后的程序代碼轉(zhuǎn)存到另一個(gè)文件。

      預(yù)處理后的源程序經(jīng)過(guò)詞法分析,生成描述Token的Token列表文件,Token信息一方面用來(lái)進(jìn)行下一步的語(yǔ)法分析,另一方面保存變量的相關(guān)信息,為后續(xù)的變量檢測(cè)作準(zhǔn)備;再經(jīng)過(guò)語(yǔ)法分析,生成源程序?qū)?yīng)的抽象語(yǔ)法樹信息文件。自動(dòng)地進(jìn)行分析和插裝處理插入探針程序用以以檢測(cè)變量的使用情況,但是過(guò)多的探針程序會(huì)嚴(yán)重影響程序的性能,因此需要謹(jǐn)慎地設(shè)計(jì)探針程序的數(shù)量和插入位置[6]。

      4.3.2 變量使用異常檢測(cè)實(shí)現(xiàn)

      完成了對(duì)源代碼的分析之后,得到了對(duì)應(yīng)于源代碼的語(yǔ)法樹,基于這棵語(yǔ)法樹對(duì)程序中的變量聲明、賦值和引用等進(jìn)行檢測(cè)。

      變量未聲明檢測(cè):C語(yǔ)言中變量和函數(shù)在使用前必須已定義或聲明,根據(jù)符號(hào)表中標(biāo)識(shí)符信息檢測(cè)當(dāng)前變量或函數(shù)名是否可用。

      變量未初始化或未賦值檢測(cè):若變量已聲明,則此變量可用,但未初始化和賦值的變量其值是隨機(jī)的,訪問(wèn)此類變量可能造成系統(tǒng)崩潰,C語(yǔ)言本身對(duì)此沒(méi)有強(qiáng)制規(guī)定,由程序員保證安全性。本文實(shí)現(xiàn)的技術(shù)對(duì)此類情況提供了檢測(cè)。

      變量值溢出檢測(cè):C語(yǔ)言的變量是有類型的,如int、float等,變量類型對(duì)應(yīng)存儲(chǔ)方式,如編碼和長(zhǎng)度,計(jì)算機(jī)在分配內(nèi)存時(shí)嚴(yán)格按照變量聲明的類型分配固定字節(jié)數(shù)的內(nèi)存,因而變量的表示范圍是有限的。若在不同類型的變量之間進(jìn)行賦值,可能會(huì)出現(xiàn)溢出,即所賦值的變量大小超過(guò)被賦值變量所能表示的范圍時(shí),原始數(shù)據(jù)會(huì)被截?cái)?,被賦值變

      量只能取得部分?jǐn)?shù)據(jù)。此時(shí),所取得的數(shù)據(jù)可能是無(wú)意義的,在某些情況下會(huì)導(dǎo)致嚴(yán)重后果。本文實(shí)現(xiàn)的技術(shù)能夠?qū)x值進(jìn)行檢測(cè),當(dāng)所賦的值超過(guò)被賦值變量所能表示的范圍時(shí),進(jìn)行相應(yīng)的提示。

      下圖是對(duì)源代碼運(yùn)行本文實(shí)現(xiàn)的檢測(cè)程序后的結(jié)果:

      圖4 檢測(cè)流程圖

      圖5 變量檢測(cè)運(yùn)行結(jié)果

      程序?qū)υ创a進(jìn)行詞法語(yǔ)法分析后檢測(cè)變量的使用,結(jié)果可以如預(yù)期對(duì)變量使用前未聲明、變量未初始化錯(cuò)誤和變量值溢出等情況進(jìn)行提示,可以有效避免因變量使用錯(cuò)誤產(chǎn)生的不必要的錯(cuò)誤。

      5 總結(jié)

      本文基于開源軟件設(shè)計(jì)并實(shí)現(xiàn)了C語(yǔ)言變量檢測(cè)技術(shù),能夠?qū)υ创a中的變量使用異常進(jìn)行檢測(cè)并輸出,提高了程序的健壯性,基本完成了預(yù)定設(shè)計(jì)需求,達(dá)到了預(yù)計(jì)設(shè)計(jì)目標(biāo);但由于時(shí)間和技術(shù)水平的不足,仍存在一定的缺陷。下一步工作是繼續(xù)研究和完善相關(guān)技術(shù),提供更豐富的檢測(cè)功能,進(jìn)一步提高其實(shí)用價(jià)值。

      [1] 郭銳. 用于覆蓋測(cè)試的代碼插樁程序設(shè)計(jì)與實(shí)現(xiàn)[J]. 科學(xué)技術(shù)與工程, 2013, 13(30): 9072-9077.

      [2] 蔡建平. 覆蓋測(cè)試中高效代碼插樁技術(shù)的研究[J]. 微計(jì)算機(jī)信息(嵌入式與SOC), 26(9-2): 86-88.

      [3] 晏華. 代碼自動(dòng)插裝技術(shù)的研究與實(shí)現(xiàn)[J]. 電子科技大學(xué)學(xué)報(bào), 2002, 31(1): 62-66.

      [4] 何群, 陳英. 面向?qū)ο笳Z(yǔ)言編譯器的自動(dòng)測(cè)試平臺(tái)[J]. 計(jì)算機(jī)工程, 2005, 31(14): 99-101.

      [5] [美]弗雷澤著, 王挺等譯. 可變目標(biāo)C編譯器: 設(shè)計(jì)與實(shí)現(xiàn)[M]. 電子工業(yè)出版社, 2005, 1.

      [6] 劉慧梅. 軟件測(cè)試中代碼分析與插裝技術(shù)研究[J]. 陜西國(guó)防工業(yè)職業(yè)技術(shù)學(xué)院學(xué)報(bào), 2005, 24(2): 7-11.

      Detection Technology about C Program Variable

      HANG Huan1, DU Shi-qi2
      (1. Institute of Network and Technology, Beijing University of Posts and Telecommunications, Beijing 100876, China; 2. Mathematics and Computer Science School, Anhui Normal University, Beijing 241002, China)

      Since its inception, C has been widely used in the development of programs with its excellent features. Today, the C language program still plays an important role in various fields, especially in some important sectors such as aerospace, medical, banking, etc. Departments to provide system support. Therefore, higher security and stability are required in systems and softwares developed by C language. In this paper, we study the detection technology about mistakes in using C program variable. We implement a compiler front-end based on opensource software to do lexical and grammar analysis for C program variable. Then we experiment with it on instrumentation to monitor errors for noninitialized variables and variable overflow.

      C programming language; Variable anomaly detection; Instrumentation; Compiler

      TP312

      A

      10.3969/j.issn.1003-6970.2016.11.018

      杭?xì)g(1991-),男,碩士研究生,SDN 杜世奇(1992-),男,本科,編譯原理。

      猜你喜歡
      插樁詞法源代碼
      詞法 名詞、代詞和冠詞
      砂土中樁靴插樁對(duì)臨近筒型基礎(chǔ)的影響研究
      人工智能下復(fù)雜軟件源代碼缺陷精準(zhǔn)校正
      基于TXL的源代碼插樁技術(shù)研究
      基于性能分析的自適應(yīng)插樁框架
      軟件源代碼非公知性司法鑒定方法探析
      應(yīng)用于詞法分析器的算法分析優(yōu)化
      談對(duì)外漢語(yǔ)“詞法詞”教學(xué)
      揭秘龍湖產(chǎn)品“源代碼”
      基于順序塊的嵌入式白盒測(cè)試插樁技術(shù)研究
      富顺县| 赤峰市| 八宿县| 大连市| 庆云县| 平湖市| 磐安县| 湘乡市| 化州市| 赤水市| 乃东县| 获嘉县| 鄂州市| 冕宁县| 天等县| 宜章县| 中山市| 区。| 安仁县| 潞城市| 台东市| 思南县| 周口市| 武城县| 庆阳市| 南和县| 错那县| 十堰市| 东辽县| 夏河县| 三都| 沙河市| 旺苍县| 正镶白旗| 明溪县| 双桥区| 乳源| 永宁县| 宁津县| 嘉鱼县| 尼玛县|