亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種基于PRDL規(guī)則描述語(yǔ)言的C程序代碼規(guī)范檢查裝置的制作方法

文檔序號(hào):11690948閱讀:547來源:國(guó)知局
一種基于PRDL規(guī)則描述語(yǔ)言的C程序代碼規(guī)范檢查裝置的制造方法

本發(fā)明涉及到檢查c語(yǔ)言程序代碼規(guī)范的技術(shù),特別涉及到基于prdl語(yǔ)言的結(jié)構(gòu)化查詢以及c程序的多模型融合表征,屬于基于規(guī)則的靜態(tài)分析技術(shù)。



背景技術(shù):

靜態(tài)分析是保證軟件質(zhì)量的重要手段。通過掃描分析應(yīng)用程序的源代碼,可以在軟件開發(fā)的早期階段就發(fā)現(xiàn)一些潛在的缺陷。代碼規(guī)范檢查裝置屬于基于規(guī)則的靜態(tài)分析工具。這類工具通過將源代碼或是源代碼經(jīng)過分析得到的產(chǎn)物與描述缺陷的規(guī)則進(jìn)行詞法或語(yǔ)法上的匹配,發(fā)現(xiàn)違反規(guī)則的情形。常見的工具有checkstyle,pmd,c++test等,下面對(duì)這些軟件進(jìn)行簡(jiǎn)介:

checkstyle:一款幫助開發(fā)者寫出遵循某些規(guī)范java代碼的靜態(tài)檢測(cè)工具。checkstyle內(nèi)嵌了對(duì)suncodeconventions和googlejavastyle這兩種代碼規(guī)范的支持,用戶可以通過自定義配置來實(shí)現(xiàn)對(duì)其他代碼規(guī)范的支持。然而,自定義checkstyle的檢查規(guī)則并不是一件簡(jiǎn)單的事,用戶需要做的不是描述一條規(guī)則,而是用代碼實(shí)現(xiàn)對(duì)這條規(guī)則的檢查,包括檢查器、過濾器、監(jiān)測(cè)器這三個(gè)組件。檢查器是用來實(shí)現(xiàn)規(guī)則檢查這一主要功能的,用戶需要做遍歷語(yǔ)法樹等比較底層的事情,然后還要細(xì)化一系列檢查器屬性,把檢查器作為插件整合進(jìn)checkstyle主體程序中。過濾器的功能是決定哪些事件可以通過檢查器被報(bào)告給監(jiān)測(cè)器,用戶一般需要實(shí)現(xiàn)其中的accept(auditevent)方法。監(jiān)測(cè)器監(jiān)聽檢查器在檢查代碼過程中的行為,包括開始檢查一個(gè)文件,發(fā)現(xiàn)了違反規(guī)則的情況等,然后做出適當(dāng)?shù)捻憫?yīng),比如輸出錯(cuò)誤信息等。當(dāng)然過濾器和監(jiān)聽器要也與checkstyle主體程序進(jìn)行相應(yīng)整合,只有完成所有這些步驟,才算是成功添加了一條規(guī)則。

pmd:面向java語(yǔ)言的靜態(tài)檢測(cè)工具,可以檢查出一些潛在的缺陷,比如死代碼,未經(jīng)優(yōu)化的代碼,過于復(fù)雜的表達(dá)式,重復(fù)代碼等。pmd支持兩種自定義規(guī)則的形式,一種是調(diào)用api寫java代碼,過程和checkstyle類似;另一種是使用xpath查詢語(yǔ)言寫規(guī)則,當(dāng)xpath查詢找到了匹配結(jié)果,就將它作為違反規(guī)則的情形加入報(bào)告中。之所以能這么做,是因?yàn)閖ava源代碼可以被解析成抽象語(yǔ)法樹(ast)這一樹形結(jié)構(gòu)。ast可以被視作結(jié)構(gòu)化文檔,正如xml一樣,因而可以通過xpath查詢以尋找特定模式。在pmd中使用xpath寫查詢可以分為以下幾步:1.在工具中寫出想要查找的java代碼;2.掌握代碼對(duì)應(yīng)的抽象語(yǔ)法樹結(jié)構(gòu);3.寫出匹配查詢模式的xpath表達(dá)式;4.不斷修改代碼并返回第2、3步完善xpath表達(dá)式。舉例來說,如果用戶希望找到局部變量,可以使用表達(dá)式“//localvariabledeclaration”,可以看出以這種方式定義規(guī)則比較簡(jiǎn)潔清晰。

c++test:一款商業(yè)化軟件測(cè)試工具。c++test能夠做包括代碼規(guī)范檢查在內(nèi)的代碼靜態(tài)檢測(cè),還具有數(shù)據(jù)流分析和單元測(cè)試生成等許多功能。除了使用c++test規(guī)則庫(kù)中的gjb5369-2005,jsf,misra-c等代碼規(guī)范,用戶還可以通過c++test提供的規(guī)則編輯工具rulewizard在圖形化界面中自定義規(guī)則。用戶使用rulewizard的各種組件將規(guī)則描述為一種代碼模式,該模式如果出現(xiàn)在代碼中就將被規(guī)范檢查引擎檢測(cè)到并報(bào)告。由于集合、觸發(fā)器等概念的存在,使得c++test盡管采用了圖形化的規(guī)則描述方式,但是規(guī)則的語(yǔ)義依然不清晰。使用rulewizard來編寫規(guī)則學(xué)習(xí)門檻高,且在編輯完成新的規(guī)則后很難判斷規(guī)則描述是否與需求相符。

以上介紹的三種工具各有優(yōu)劣。checkstyle有成型規(guī)則庫(kù),但是在擴(kuò)展時(shí)需要用戶自己寫代碼調(diào)用api實(shí)現(xiàn)規(guī)則檢查,工作量比較大;pmd工具除了可以用寫代碼的形式定義規(guī)則外,還支持使用xpath語(yǔ)言定義基于抽象語(yǔ)法樹遍歷的規(guī)則,但沒有標(biāo)準(zhǔn)化的規(guī)則庫(kù)。此外,轉(zhuǎn)化成xml文檔之后的源代碼將多占用10倍的存儲(chǔ)空間;c++test支持c/c++語(yǔ)言,自帶的規(guī)則庫(kù)比較全面,但使用圖形界面rulewizard定義的規(guī)則理解起來不方便,而且只能獨(dú)立使用,沒有整合入開發(fā)環(huán)境中,易用性有待提升。



技術(shù)實(shí)現(xiàn)要素:

有鑒于此,本發(fā)明提供了一種基于prdl規(guī)則描述語(yǔ)言的c程序代碼規(guī)范檢查裝置及其檢查方法。在查詢語(yǔ)言方面,該檢查裝置支持以結(jié)構(gòu)化查詢語(yǔ)言prdl自定義規(guī)則,能有效解析prdl規(guī)則的語(yǔ)義并做合理優(yōu)化。在查詢對(duì)象方面,該檢查裝置根據(jù)輸入的c程序,分析程序的文本特征與結(jié)構(gòu)特征,從而獲得程序的多特征融合表征模型。在程序模型上通過路徑查找操作和謂詞過濾操作執(zhí)行規(guī)則檢查之后,它可以將違反規(guī)則的缺陷代碼報(bào)告給用戶進(jìn)行評(píng)估審核。

一種基于prdl規(guī)則描述語(yǔ)言的c程序代碼規(guī)范檢查裝置,其特征在于:所述代碼規(guī)范檢查裝置包括五個(gè)功能模塊:

規(guī)則解析器,由下述兩個(gè)子功能模塊組成:語(yǔ)義解析器、查詢優(yōu)化器,首先語(yǔ)義解析器解析prdl規(guī)則語(yǔ)義,生成初始邏輯查詢計(jì)劃,查詢優(yōu)化器再對(duì)該計(jì)劃進(jìn)行重寫優(yōu)化,生成優(yōu)化邏輯查詢計(jì)劃,并將其送入規(guī)則檢查引擎;

程序解析器,由代碼行解析器、標(biāo)記(token)流解析器、語(yǔ)法樹解析器三個(gè)子功能模塊所組成,負(fù)責(zé)對(duì)源代碼進(jìn)行文本特征抽取和結(jié)構(gòu)特征抽取,將抽取得到的代碼行、標(biāo)記、語(yǔ)法樹三個(gè)層次的模型融合成c程序模型送入規(guī)則檢查引擎;

規(guī)則檢查引擎,負(fù)責(zé)接收規(guī)則解析器送入的優(yōu)化邏輯查詢計(jì)劃和程序解析器送入的c程序模型,按照優(yōu)化邏輯查詢計(jì)劃執(zhí)行規(guī)則檢查,將檢查結(jié)果發(fā)送給缺陷報(bào)告器;

缺陷報(bào)告器,負(fù)責(zé)根據(jù)規(guī)則檢查引擎的檢查結(jié)果以及相應(yīng)規(guī)則的信息,將可能的代碼缺陷整合并匯報(bào)給用戶交互接口;

用戶交互接口,由分別完成各自功能的四個(gè)子功能模塊:規(guī)則庫(kù)管理、測(cè)試集管理、規(guī)則檢查界面及結(jié)果顯示模塊所組成,負(fù)責(zé)根據(jù)用戶需求定制檢查的上下文,并將缺陷報(bào)告器整合完畢的結(jié)果向用戶進(jìn)行反饋。

進(jìn)一步地,所述規(guī)則解析器中兩個(gè)子模塊的功能是:

語(yǔ)義解析器對(duì)prdl規(guī)則文本進(jìn)行解析,產(chǎn)生查詢上下文和初始邏輯查詢計(jì)劃,并向查詢優(yōu)化器提供接口,以便查詢優(yōu)化器讀取這些信息;

查詢優(yōu)化器對(duì)初始邏輯查詢計(jì)劃應(yīng)用重寫優(yōu)化策略,產(chǎn)生優(yōu)化邏輯查詢計(jì)劃,并向規(guī)則檢查引擎提供接口,供其讀取信息。

進(jìn)一步,所述程序解析器中三個(gè)子模塊的功能是:

代碼行解析器以源代碼作為輸入,為每一行代碼生成一個(gè)數(shù)據(jù)封裝對(duì)象,提供程序行層次的文本信息;

標(biāo)記流解析器以源代碼作為輸入,對(duì)代碼中的每個(gè)標(biāo)記進(jìn)行封裝與連接,提供單詞層次的文本信息;

語(yǔ)法樹解析器,提供程序的結(jié)構(gòu)信息,包括程序的語(yǔ)法組成元素以及它們之間的關(guān)系;

三個(gè)子模塊之間互相提供接口,以實(shí)現(xiàn)對(duì)象間相互轉(zhuǎn)化,三個(gè)子模塊都向規(guī)則檢查引擎提供接口,供其讀取程序行、單詞層次的文本信息以及結(jié)構(gòu)信息。

進(jìn)一步,所述prdl規(guī)則描述語(yǔ)言的基本結(jié)構(gòu)包括內(nèi)部變量定義、內(nèi)部函數(shù)定義、外部函數(shù)定義、規(guī)則主體;規(guī)則有兩個(gè)來源,一是內(nèi)嵌的規(guī)則庫(kù),現(xiàn)包括gjb5369-2005航天型號(hào)軟件c語(yǔ)言安全子集中的138條規(guī)則和msira-c汽車制造業(yè)嵌入式c編碼標(biāo)準(zhǔn)中的117條規(guī)則;二是用戶自定義規(guī)則,允許用戶添加按照prdl規(guī)則描述語(yǔ)言語(yǔ)法寫成的規(guī)則。

本發(fā)明還提供一種基于prdl規(guī)則描述語(yǔ)言的c語(yǔ)言代碼規(guī)范檢查方法,其特征在于:包括以下操作步驟:

(1)將用戶選擇的源代碼文件和規(guī)則集輸入代碼規(guī)范檢查裝置;

(2)根據(jù)用戶指定的規(guī)則集,讀取相應(yīng)的prdl規(guī)則,對(duì)每一條規(guī)則進(jìn)行語(yǔ)義解析,生成相應(yīng)的初始邏輯查詢計(jì)劃,依據(jù)重寫優(yōu)化策略對(duì)初始邏輯查詢計(jì)劃進(jìn)行重寫,產(chǎn)生待執(zhí)行的優(yōu)化邏輯查詢計(jì)劃;

(3)對(duì)待檢查的源代碼進(jìn)行解析,構(gòu)造程序模型,經(jīng)過詞法解析產(chǎn)生代碼行信息和標(biāo)記信息,經(jīng)過語(yǔ)法解析等處理后獲得查詢使用的語(yǔ)法樹信息,通過計(jì)算代碼行信息、標(biāo)記信息在代碼中的偏移量可以把它們與得到的查詢使用的語(yǔ)法樹節(jié)點(diǎn)映射起來,形成程序模型;

(4)根據(jù)查詢計(jì)劃,在程序模型上執(zhí)行檢查,使用深度優(yōu)先搜索算法進(jìn)行路徑查找以明確結(jié)構(gòu)關(guān)系,并按照約束條件在程序模型上進(jìn)行過濾;

(5)規(guī)則檢查結(jié)束后,對(duì)檢查結(jié)果進(jìn)行多種形式的展示,包括對(duì)違反規(guī)則的代碼片段高亮,生成報(bào)告等,供用戶審閱。

進(jìn)一步,重寫優(yōu)化策略必須遵循的框架是:應(yīng)用重寫優(yōu)化策略產(chǎn)生的優(yōu)化邏輯查詢計(jì)劃送出的c程序模型上的查詢結(jié)果與初始邏輯查詢計(jì)劃查詢的結(jié)果完全一致,并且優(yōu)化后的邏輯查詢計(jì)劃執(zhí)行耗時(shí)更短。

進(jìn)一步,重寫優(yōu)化策略包括以下三種:

約束位置重置策略,查詢計(jì)劃中存在一個(gè)查詢的搜索空間包含有另一個(gè)查詢的搜索空間,但兩個(gè)查詢獨(dú)立從全局空間進(jìn)行搜索的情況,對(duì)應(yīng)的優(yōu)化策略是重置查詢的執(zhí)行順序,讓兩者嵌套執(zhí)行,并使前者查詢優(yōu)先于后者查詢執(zhí)行,以保證后者查詢?cè)诟〉乃阉骺臻g中進(jìn)行搜索,更快得到查詢結(jié)果;

重用子查詢策略,查詢計(jì)劃中存在一個(gè)查詢可能是多個(gè)查詢的子查詢,即多個(gè)查詢需要使用該查詢的查詢結(jié)果的情況,對(duì)應(yīng)的優(yōu)化策略是將前者查詢的查詢結(jié)果提前計(jì)算并緩存,等其他查詢需要用到前者查詢的查詢結(jié)果時(shí),將緩存的查詢結(jié)果取出使用即可,避免重復(fù)查詢;

最優(yōu)查詢路徑起點(diǎn)策略,查詢計(jì)劃本身可以轉(zhuǎn)化為查詢樹,選擇不同的查詢作為查詢起點(diǎn),會(huì)產(chǎn)生不同層次的查詢樹,使得查詢執(zhí)行的時(shí)間不同,為了提高執(zhí)行效率,根據(jù)統(tǒng)計(jì),選擇出現(xiàn)頻率最小的節(jié)點(diǎn)為查詢起點(diǎn),對(duì)查詢計(jì)劃進(jìn)行變形,即可提高查詢效率。

進(jìn)一步,所述步驟(2)的prdl規(guī)則的結(jié)構(gòu),包括內(nèi)部變量定義、內(nèi)部函數(shù)定義、外部函數(shù)定義、規(guī)則主體;對(duì)prdl規(guī)則結(jié)構(gòu)中四個(gè)部分進(jìn)行分別處理,具體包括:

1)從內(nèi)部定義中抽取變量定義和函數(shù)定義,將內(nèi)部變量表和內(nèi)部函數(shù)表一起存入查詢的上下文中待訪問;

2)從外部定義中抽取外部函數(shù)信息,構(gòu)建外部函數(shù)表,存入查詢的上下文中待訪問;

3)對(duì)定義和主體中的查詢表達(dá)式,則經(jīng)過轉(zhuǎn)化和重寫得到邏輯查詢計(jì)劃,存入查詢的上下文待執(zhí)行。

進(jìn)一步,所述步驟(3)中,其中得到查詢使用的語(yǔ)法樹的具體步驟如下:

1)首先對(duì)源代碼進(jìn)行預(yù)處理,得到抽象語(yǔ)法樹;

2)接著對(duì)抽象語(yǔ)法樹中的節(jié)點(diǎn)進(jìn)行遞歸標(biāo)注,使其節(jié)點(diǎn)與查詢使用的語(yǔ)法樹節(jié)點(diǎn)對(duì)應(yīng)起來,此時(shí)查詢使用的語(yǔ)法樹節(jié)點(diǎn)還是孤立的;

3)按照c語(yǔ)言語(yǔ)法特征以及結(jié)構(gòu)查詢需求,對(duì)查詢使用的語(yǔ)法樹節(jié)點(diǎn)進(jìn)行結(jié)構(gòu)改造,完成后形成最終的樹形結(jié)構(gòu)。

相比于目前其他相關(guān)技術(shù),本發(fā)明主要的技術(shù)創(chuàng)新點(diǎn)有:

1、可擴(kuò)展規(guī)則庫(kù):代碼規(guī)則使用prdl查詢語(yǔ)言描述,此方法表達(dá)能力比在檢查框架嵌入代碼或者重寫組件的方式強(qiáng),易用性好,寫成的語(yǔ)言可讀性高,用戶可方便地編寫prdl查詢語(yǔ)言,提供了生成語(yǔ)言outline、語(yǔ)法檢查和實(shí)時(shí)檢查源代碼等一系列輔助工具,幫助用戶高效編寫,規(guī)則庫(kù)具有良好的可擴(kuò)展性。;

2、多特征融合模型:源程序代碼經(jīng)過代碼行解析、標(biāo)記流解析、語(yǔ)法樹解析,將程序的文本信息和結(jié)構(gòu)信息抽取存儲(chǔ)為多特征,通過對(duì)特征屬性的計(jì)算和調(diào)用關(guān)系分析方法,產(chǎn)生融合多特征模型,并基于此創(chuàng)新的多特征融合模型進(jìn)行代碼分析查詢檢查;

3、基于查詢重寫的優(yōu)化技術(shù):在解析prdl規(guī)則之后,對(duì)基本的查詢計(jì)劃應(yīng)用約束位置重置、重用子查詢、選擇最優(yōu)查詢路徑起點(diǎn)共三種策略進(jìn)行重寫,有效提升查詢效率。

附圖說明

圖1為本發(fā)明代碼規(guī)范檢查裝置的組成結(jié)構(gòu)方框圖。

圖2為本發(fā)明代碼規(guī)范檢查裝置的內(nèi)部數(shù)據(jù)流圖。

圖3為本發(fā)明代碼規(guī)范檢查裝置的檢查方法的工作流程圖。

圖4為本發(fā)明代碼規(guī)范檢查裝置檢查方法中規(guī)則解析流程圖。

圖5為本發(fā)明代碼規(guī)范檢查裝置檢查方法中獲取抽象語(yǔ)法樹的流程圖。

圖6為使用本發(fā)明的實(shí)施例流程圖

具體實(shí)施方式

為了使本發(fā)明的技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面結(jié)合附圖對(duì)本發(fā)明做進(jìn)一步的詳細(xì)描述。

參見圖1和圖2,介紹本發(fā)明基于prdl規(guī)則描述語(yǔ)言的c程序代碼規(guī)范檢查裝置的結(jié)構(gòu)組成及數(shù)據(jù)流,主要包括下述五個(gè)功能模塊:

1、規(guī)則解析器,負(fù)責(zé)解析prdl規(guī)則語(yǔ)義,生成初始邏輯查詢計(jì)劃,再對(duì)該計(jì)劃進(jìn)行重寫優(yōu)化,之后送入規(guī)則檢查引擎;由下述兩個(gè)子功能模塊組成:語(yǔ)義解析器、查詢優(yōu)化器;下面分別介紹這兩個(gè)子功能模塊:

語(yǔ)義解析器對(duì)prdl規(guī)則文本進(jìn)行解析,產(chǎn)生查詢上下文和初始邏輯查詢計(jì)劃,并向查詢優(yōu)化器提供接口,以便查詢優(yōu)化器讀取這些信息;

查詢優(yōu)化器對(duì)初始邏輯查詢計(jì)劃應(yīng)用重寫優(yōu)化策略,產(chǎn)生優(yōu)化邏輯查詢計(jì)劃,并向規(guī)則檢查引擎提供接口,供其讀取信息。

重寫優(yōu)化策略必須遵循的框架是:應(yīng)用重寫優(yōu)化策略產(chǎn)生的優(yōu)化邏輯查詢計(jì)劃在程序解析器送出的c程序模型上的查詢結(jié)果與初始邏輯查詢計(jì)劃查詢的結(jié)果完全一致,并且優(yōu)化后的邏輯查詢計(jì)劃執(zhí)行耗時(shí)更短。

重寫優(yōu)化策略包括以下三種:

約束位置重置策略,查詢計(jì)劃中存在一個(gè)查詢的搜索空間包含有另一個(gè)查詢的搜索空間,但兩個(gè)查詢獨(dú)立從全局空間進(jìn)行搜索的情況,對(duì)應(yīng)的優(yōu)化策略是重置查詢的執(zhí)行順序,讓兩者嵌套執(zhí)行,并使前者查詢優(yōu)先于后者查詢執(zhí)行,以保證后者查詢?cè)诟〉乃阉骺臻g中進(jìn)行搜索,更快得到查詢結(jié)果。

重用子查詢策略,查詢計(jì)劃中存在一個(gè)查詢可能是多個(gè)查詢的子查詢,即多個(gè)查詢需要使用該查詢的查詢結(jié)果的情況,對(duì)應(yīng)的優(yōu)化策略是將前者查詢的查詢結(jié)果提前計(jì)算并緩存,等其他查詢需要用到前者查詢的查詢結(jié)果時(shí),將緩存的查詢結(jié)果取出使用即可,避免重復(fù)查詢。

最優(yōu)查詢路徑起點(diǎn)策略,查詢計(jì)劃本身可以轉(zhuǎn)化為查詢樹,選擇不同的查詢作為查詢起點(diǎn),會(huì)產(chǎn)生不同層次的查詢樹,使得查詢執(zhí)行的時(shí)間不同,為了提高執(zhí)行效率,根據(jù)統(tǒng)計(jì),選擇出現(xiàn)頻率最小的節(jié)點(diǎn)為查詢起點(diǎn),對(duì)查詢計(jì)劃進(jìn)行變形,即可提高查詢效率。

2、程序解析器,負(fù)責(zé)對(duì)源代碼進(jìn)行文本特征抽取和結(jié)構(gòu)特征抽取,將抽取得到的代碼行、標(biāo)記、語(yǔ)法樹三個(gè)層次的模型融合成c程序模型,再送入規(guī)則檢查引擎;由下述三個(gè)子功能模塊所組成:代碼行解析器、標(biāo)記流解析器、語(yǔ)法樹解析器;三個(gè)子模塊之間互相提供接口,以實(shí)現(xiàn)對(duì)象間相互轉(zhuǎn)化;三個(gè)子模塊都向規(guī)則檢查引擎提供接口,以針對(duì)這些程序模型和數(shù)據(jù)對(duì)象進(jìn)行檢查;下面分別介紹這三個(gè)子功能模塊:

代碼行解析器以源代碼作為輸入,為每一行代碼生成一個(gè)數(shù)據(jù)封裝對(duì)象,提供程序行層次的文本信息;

標(biāo)記流解析器以源代碼作為輸入,對(duì)代碼中的每個(gè)標(biāo)記進(jìn)行封裝與連接,提供單詞層次的文本信息;

語(yǔ)法樹解析器,提供程序的結(jié)構(gòu)信息,包括程序的語(yǔ)法組成元素以及它們之間的關(guān)系。

模型融合的方式具體如下:

對(duì)程序的解析包括兩部分,一部分是文本特征解析,通過逐行讀取源代碼,將每一行切分,包括空白行,得到源代碼的行信息;對(duì)源代碼進(jìn)行詞法分析,得到標(biāo)記流,對(duì)標(biāo)記流進(jìn)行封裝和屬性計(jì)算,得到標(biāo)記信息。另一部分是樹形結(jié)構(gòu)解析,抽取源代碼的抽象語(yǔ)法樹及改造成適合查詢的語(yǔ)法樹的具體步驟如下:

(1)首先對(duì)源代碼進(jìn)行預(yù)處理,得到抽象語(yǔ)法樹;

(2)接著對(duì)抽象語(yǔ)法樹中的節(jié)點(diǎn)進(jìn)行遞歸標(biāo)注,使其節(jié)點(diǎn)與查詢使用的語(yǔ)法樹節(jié)點(diǎn)對(duì)應(yīng)起來,此時(shí)查詢使用的語(yǔ)法樹節(jié)點(diǎn)還是孤立的;

(3)按照c語(yǔ)言語(yǔ)法特征以及結(jié)構(gòu)查詢需求,對(duì)查詢使用的語(yǔ)法樹節(jié)點(diǎn)進(jìn)行結(jié)構(gòu)構(gòu)造,完成后形成最終的樹形結(jié)構(gòu)。

通過計(jì)算源代碼行信息、標(biāo)記信息在代碼中的偏移量可以把它們與上述步驟得到的查詢使用的語(yǔ)法樹節(jié)點(diǎn)映射起來,形成程序模型。此為融合過程。

3、規(guī)則檢查引擎,負(fù)責(zé)按照邏輯查詢計(jì)劃在c程序模型上執(zhí)行規(guī)則檢查,并通過缺陷報(bào)告器將發(fā)現(xiàn)的違反規(guī)則情形發(fā)送給用戶交互接口;

4、缺陷報(bào)告器,負(fù)責(zé)根據(jù)規(guī)則檢查引擎的結(jié)果以及相應(yīng)規(guī)則的信息,將可能的代碼缺陷匯報(bào)給用戶交互接口;

5、用戶交互接口,由分別完成各自功能的四個(gè)子功能模塊:規(guī)則庫(kù)管理、測(cè)試集管理、規(guī)則檢查界面及結(jié)果顯示模塊所組成,負(fù)責(zé)根據(jù)用戶需求定制檢查的上下文,并將檢查結(jié)果向用戶進(jìn)行反饋。

本發(fā)明c程序代碼規(guī)范檢查裝置的關(guān)鍵是規(guī)則解析和程序解析。規(guī)則解析對(duì)prdl規(guī)則的內(nèi)部變量定義、內(nèi)部函數(shù)定義、外部函數(shù)定義、規(guī)則主體四個(gè)部分分別進(jìn)行處理,主要包括把定義部分存入查詢上下文,把查詢表達(dá)式部分解析成邏輯查詢計(jì)劃,并對(duì)查詢計(jì)劃進(jìn)行重寫優(yōu)化。程序解析重點(diǎn)在于生成方便查詢的語(yǔ)法樹模型,并將其與代碼行模型、標(biāo)記流模型通過屬性調(diào)用聯(lián)系起來。這兩者完成之后,查詢執(zhí)行變得簡(jiǎn)單而明確,使用深度優(yōu)先搜索算法完成路徑查找,根據(jù)約束謂詞對(duì)結(jié)果做分步過濾,從找出符合規(guī)則描述的代碼。

參見圖3,介紹規(guī)則檢查方法的主要處理步驟:

(1)將用戶選擇的源代碼文件和規(guī)則集輸入代碼規(guī)范檢查裝置后,該工具開始工作;

(2)根據(jù)用戶指定的規(guī)則集,讀取相應(yīng)的prdl規(guī)則,對(duì)每一條規(guī)則進(jìn)行語(yǔ)義解析,生成相應(yīng)的初始邏輯查詢計(jì)劃,依據(jù)約束位置重置策略、重用子查詢策略、選取最優(yōu)查詢路徑起點(diǎn)策略對(duì)查詢計(jì)劃進(jìn)行改寫,產(chǎn)生待執(zhí)行的查詢計(jì)劃;該步驟可詳細(xì)分為下述具體操作內(nèi)容(如圖4所示):

(21)從內(nèi)部定義中抽取函數(shù)定義和變量定義,將內(nèi)部函數(shù)表和變量表一起存入查詢的上下文中待訪問;

(22)從外部定義中抽取外部函數(shù)信息,構(gòu)建外部函數(shù)表;

(23)對(duì)定義和主體中的查詢表達(dá)式,則經(jīng)過轉(zhuǎn)化和重寫得到查詢計(jì)劃,存入查詢的上下文待執(zhí)行。

(3)對(duì)待檢查的源代碼進(jìn)行解析,構(gòu)造程序模型,經(jīng)過詞法解析產(chǎn)生代碼行流和標(biāo)記流,經(jīng)過語(yǔ)法解析后產(chǎn)生抽象語(yǔ)法樹,經(jīng)過偏移量計(jì)算可以把各類數(shù)據(jù)對(duì)象對(duì)應(yīng)起來;該步驟中的抽象語(yǔ)法樹生成操作可細(xì)分為下述具體操作內(nèi)容(如圖5所示):

(31)使用eclipsecdt工具對(duì)源代碼進(jìn)行預(yù)處理,得到抽象語(yǔ)法樹;

(32)按照程序類型樹設(shè)計(jì),對(duì)抽象語(yǔ)法樹中的節(jié)點(diǎn)進(jìn)行遞歸標(biāo)注,使抽象語(yǔ)法樹節(jié)點(diǎn)與查詢使用的語(yǔ)法樹節(jié)點(diǎn)對(duì)應(yīng)起來,此時(shí)查詢使用的語(yǔ)法樹節(jié)點(diǎn)還是孤立的;

(33)按照c語(yǔ)言語(yǔ)法特征以及結(jié)構(gòu)查詢需求,對(duì)查詢使用的語(yǔ)法樹節(jié)點(diǎn)進(jìn)行結(jié)構(gòu)構(gòu)造,完成后形成最終的樹形結(jié)構(gòu)。

(4)根據(jù)查詢計(jì)劃,在程序模型上執(zhí)行檢查,使用深度優(yōu)先搜索算法進(jìn)行路徑查找以明確結(jié)構(gòu)關(guān)系,并按照約束條件對(duì)中間結(jié)果進(jìn)行過濾;

(5)規(guī)則檢查結(jié)束后,對(duì)檢查結(jié)果進(jìn)行多方位的展示,供用戶審閱。

本發(fā)明已經(jīng)進(jìn)行了軟件開發(fā)方面的實(shí)施試驗(yàn),開發(fā)者可以在開發(fā)過程中使用本發(fā)明對(duì)源代碼進(jìn)行代碼規(guī)范檢查,從中找出違反規(guī)則的代碼并改進(jìn),達(dá)到在軟件生命周期的早期階段減少缺陷的目的。這樣進(jìn)行軟件開發(fā)的流程如圖6所示,使用者可以一邊開發(fā),一邊進(jìn)行檢查,然后針對(duì)檢查結(jié)果進(jìn)行評(píng)估審核,對(duì)可能的缺陷進(jìn)行修改。

當(dāng)前第1頁(yè)1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1