
本發(fā)明涉及逆向工程技術(shù)領(lǐng)域,特別是涉及一種基于逆向工程自動(dòng)生成軟件文檔的方法及裝置。
背景技術(shù):逆向工程來自于硬件領(lǐng)域,是指通過檢查樣品開發(fā)復(fù)雜硬件系統(tǒng)歸約的過程,主要指研究他人的系統(tǒng),發(fā)現(xiàn)其工作原理,以達(dá)到復(fù)制硬件系統(tǒng)的目的。隨著軟件業(yè)的發(fā)展,逆向工程這一術(shù)語被引入軟件工程領(lǐng)域,逆向工程用于從源程序代碼的低級(jí)的抽象層次轉(zhuǎn)換為更高抽象層次的表示,如控制流圖、數(shù)據(jù)流圖、類關(guān)系圖等。逆向工程是一個(gè)設(shè)計(jì)恢復(fù)過程,逆向工程工具從現(xiàn)在的程序中抽取數(shù)據(jù)、體系結(jié)構(gòu)和過程的設(shè)計(jì)信息分析程序,以在比源代碼更高的抽象層次上創(chuàng)建程序的某種表示的過程。程序理解是一個(gè)從計(jì)算機(jī)程序中獲得知識(shí)信息的過程。這些知識(shí)信息可以用于程序排錯(cuò)、增強(qiáng)程序、重用程序以及整理文檔等方面的工作上。程序理解是軟件工程領(lǐng)域的一個(gè)重要部分。軟件工程最為關(guān)心的是如何提高軟件開發(fā)過程的生產(chǎn)效率和軟件產(chǎn)品質(zhì)量,但是,就目前實(shí)際情況來看不容樂觀。大多數(shù)軟件開發(fā)精力花費(fèi)在維護(hù)老系統(tǒng)上,而不是在開發(fā)新系統(tǒng)上,用戶維護(hù)方面的資源和時(shí)間占了很大比例。逆向工程技術(shù)中涉及的自然語言識(shí)別是指:采用人工智能(ArtificialIntelligence,AI)的理論和技術(shù)將設(shè)定的自然語言機(jī)理用計(jì)算機(jī)程序表達(dá)出來,從而構(gòu)造出能夠理解和識(shí)別自然語言的人工智能系統(tǒng)。自然語言識(shí)別作為人工智能的一個(gè)重要分支,同時(shí)也是語言信息處理的一個(gè)重要組成部分。自然語言的識(shí)別是對(duì)語言多種表達(dá)方式的識(shí)別和處理。自然語言識(shí)別要求進(jìn)算計(jì)通過對(duì)一些常用進(jìn)行識(shí)別和處理,使得計(jì)算機(jī)能夠懂得該語言的含義,并通過一定的方式進(jìn)行展現(xiàn)。具體來說,這一過程即是計(jì)算機(jī)對(duì)字、詞、句進(jìn)行輸入、輸出、識(shí)別、分析、理解和生成等一系列的操作和加工,從而建立起以重任與機(jī)器之間的密切而友好的關(guān)系,加快了人類的信息傳遞和認(rèn)知活動(dòng)?,F(xiàn)有的逆向工程和程序理解的系統(tǒng)也比較多,如Rigi,Javadoc,Doxygen,JBPAS-C++等等。這些工具都能夠根據(jù)源代碼生成一些視圖、文檔等來描述軟件系統(tǒng)的信息。但是這些系統(tǒng)使用起來有很多限制,且比較復(fù)雜,難以理解。例如Javadoc只能用于Java語言,它是Sun公司在其NetBeanIDE中內(nèi)嵌的文檔自動(dòng)生成工具,是Java開發(fā)平臺(tái)的一部分。Javadoc使用Java編譯器掃描Java源文件集,從源代碼中的doc注釋生成類似于javaapidocument的HTML格式的API文檔。因此其對(duì)注釋的格式要求很高,只有按照其要求進(jìn)行書寫的注釋,才能進(jìn)行提取。Doxygen是一種開源的、跨平臺(tái)的文檔生成系統(tǒng)。由荷蘭人DimitrivanHeesch開發(fā),在GNU公共許可正(GPL)下發(fā)布,目前已經(jīng)成為各主要的Linux發(fā)行版的附帶組件。Doxygen支持的語言有C++、C、Java、Objeetive-C、Python、和IDL,并在一定程度上支持PHP、C#和D。Doxygen生成的文檔格式有:HTML,Latex,RTF(MS-Word),Postscript,PDF,壓縮HTML和UNIXmall。并且支持類層次圖、類繼承圖、依賴圖、調(diào)用圖和合作圖的生成,此外生成的文檔可用三十多種語言顯示。Doxygen的文檔注釋方法分為詳細(xì)和簡(jiǎn)約兩種,Doxygen可以根據(jù)注釋生成文檔,如果文檔中沒有注釋,Doxygen生成其他類型的文檔。該系統(tǒng)使用起來配置比較復(fù)雜,并且有很多種情況會(huì)處理錯(cuò)誤。如voidf(int);f會(huì)被認(rèn)為是一個(gè)沒有返回值的函數(shù)聲明。而constint(a);這句話a也會(huì)被認(rèn)為是名字為a的函數(shù)聲明。這樣的基本錯(cuò)誤,顯然會(huì)導(dǎo)致提取出的文檔不準(zhǔn)確。Risils,ol:一個(gè)支持逆向工程的程序理解工具,它的工作由兩部分組成:1.剖析階段。2.發(fā)掘階段。剖析階段主要的工作是:剖析源程序,用自帶的圖像編輯器生成一個(gè)能夠操作和瀏覽的資源流平面圖。隨后的發(fā)掘階段是一個(gè)半自動(dòng)化的階段,涉及了一些模式識(shí)別技巧和領(lǐng)域知識(shí)。此階段中逆向工程人員通過剖析階段建立的平面圖,確定源程序中含有的子系統(tǒng),構(gòu)造出有意義的高層抽象模型。這些子系統(tǒng)能夠遞歸地收斂和打開,形成一個(gè)層次結(jié)構(gòu)。Rigi能夠通過根據(jù)用戶關(guān)心的類型過濾掉不需要的信息,方便用戶的瀏覽。Rigi主要的工作放在揭示系統(tǒng)的抽象和子系統(tǒng)層次的生成。這些層次結(jié)構(gòu)為在工具中從容地瀏覽起到了重要的作用,這些信息在軟件維護(hù)過程中能夠作為并發(fā)程序理解的文檔,以供參考。不過,Rigi不支持直接地搜索源代碼文本。JBPAS-C++是青鳥Ⅱ型系統(tǒng)的逆向工程組成部分,JBPAS-C++支持C/C++語言和Windows平臺(tái),能夠生成OOD(Object-OrientedDesign)文檔和Rose文檔。但是該系統(tǒng)生成的文檔在理解性上仍然難以理解,存在著不足。綜上,本發(fā)明提出了一種新的應(yīng)用于逆向工程中的自動(dòng)生成軟件文檔的方法及裝置。
技術(shù)實(shí)現(xiàn)要素:本發(fā)明所要解決的技術(shù)問題是提供一種基于逆向工程自動(dòng)生成軟件文檔的方法及裝置,用于解決現(xiàn)有技術(shù)中存在的逆向工程中生成軟件文檔方法的不足。本發(fā)明解決上述技術(shù)問題的技術(shù)方案如下:一種基于逆向工程自動(dòng)生成軟件文檔的方法,包括:步驟1,對(duì)源程序進(jìn)行掃描分析,獲得函數(shù)注釋、函數(shù)詳細(xì)信息、函數(shù)間相互調(diào)用關(guān)系和函數(shù)間相互包含關(guān)系;步驟2,對(duì)函數(shù)注釋和函數(shù)詳細(xì)信息進(jìn)行自然語言識(shí)別,提取出函數(shù)功能信息;步驟3,基于函數(shù)詳細(xì)信息,并結(jié)合函數(shù)間相互調(diào)用關(guān)系和函數(shù)間相互包含關(guān)系,分別生成全局函數(shù)調(diào)用關(guān)系圖和全局函數(shù)包含關(guān)系圖;步驟4,基于函數(shù)功能信息、函數(shù)詳細(xì)信息和全局函數(shù)調(diào)用關(guān)系圖生成自動(dòng)生成軟件設(shè)計(jì)說明文檔;步驟5,基于函數(shù)功能信息和全局函數(shù)包含關(guān)系圖,生成系統(tǒng)功能圖;步驟6,基于系統(tǒng)功能圖自動(dòng)生成軟件需求規(guī)格說明文檔。在上述技術(shù)方案的基礎(chǔ)上,本發(fā)明還可以做如下改進(jìn)。進(jìn)一步,所述函數(shù)詳細(xì)信息包括函數(shù)名、起始位置、函數(shù)所在類、返回值、參數(shù)列表、接口和內(nèi)部實(shí)現(xiàn)邏輯。進(jìn)一步,所述步驟3中采用面向函數(shù)級(jí)節(jié)點(diǎn)的全局路徑分析方法生成全局函數(shù)調(diào)用關(guān)系圖。進(jìn)一步,所述基于逆向工程自動(dòng)生成軟件文檔的方法還包括:若源程序是面向?qū)ο蟮某绦?,則還通過對(duì)源程序進(jìn)行掃描分析獲得類信息,并基于類信息和類注釋生成類圖和類調(diào)用關(guān)系圖。對(duì)應(yīng)上述的基于逆向工程自動(dòng)生成軟件文檔的方法,本發(fā)明的技術(shù)方案還包括一種基于逆向工程自動(dòng)生成軟件文檔的裝置,該裝置包括源代碼靜態(tài)分析掃描器、函數(shù)功能信息提取器、全局函數(shù)關(guān)系圖生成器、軟件設(shè)計(jì)說明生成器、系統(tǒng)功能圖生成器和軟件需求規(guī)格說明生成器:所述源代碼靜態(tài)分析掃描器,其用于對(duì)源程序進(jìn)行掃描分析,獲得函數(shù)注釋、函數(shù)詳細(xì)信息、函數(shù)間相互調(diào)用關(guān)系和函數(shù)間相互包含關(guān)系,并將函數(shù)注釋和函數(shù)詳細(xì)信息傳輸給所述函數(shù)功能信息提取器,將函數(shù)詳細(xì)信息、函數(shù)間相互調(diào)用關(guān)系和函數(shù)間相互包含關(guān)系傳輸給所述全局關(guān)系圖生成器;所述函數(shù)功能信息提取器,其用于對(duì)接收的函數(shù)注釋和函數(shù)詳細(xì)信息進(jìn)行自然語言識(shí)別,提取出函數(shù)功能信息,并將函數(shù)功能信息傳輸給所述軟件設(shè)計(jì)說明生成器和所述系統(tǒng)功能圖生成器;所述全局函數(shù)關(guān)系圖生成器,其用于根據(jù)接收的函數(shù)詳細(xì)信息,并結(jié)合接收的函數(shù)間相互調(diào)用關(guān)系和函數(shù)間相互包含關(guān)系,分別生成全局函數(shù)調(diào)用關(guān)系圖和全局函數(shù)包含關(guān)系圖,并將生成的全局函數(shù)調(diào)用關(guān)系圖傳輸給所述軟件設(shè)計(jì)說明生成器,將生成的全局函數(shù)包含關(guān)系圖傳輸給所述系統(tǒng)功能圖生成器;所述軟件設(shè)計(jì)說明生成器,其用于根據(jù)接收的函數(shù)功能信息、函數(shù)詳細(xì)信息和全局函數(shù)調(diào)用關(guān)系圖自動(dòng)生成軟件設(shè)計(jì)說明文檔;所述系統(tǒng)功能圖生成器,其用于根據(jù)接收函數(shù)功能信息和全局函數(shù)包含關(guān)系圖,生成系統(tǒng)功能圖,并將生成的系統(tǒng)功能圖傳輸給所述軟件需求規(guī)格說明生成器;所述需求規(guī)格說明生成器,其用于根據(jù)接收的系統(tǒng)功能圖自動(dòng)生成軟件需求規(guī)格說明文檔。進(jìn)一步,所述源代碼靜態(tài)分析掃描器獲得的函數(shù)詳細(xì)信息包括函數(shù)名、起始位置、函數(shù)所在類、返回值、參數(shù)列表、接口和內(nèi)部實(shí)現(xiàn)邏輯。進(jìn)一步,所述全局函數(shù)關(guān)系圖生成器包括有全局路徑分析模塊,該全局路徑分析模塊用于通過面向函數(shù)級(jí)節(jié)點(diǎn)的全局路徑分析方法來生成全局函數(shù)調(diào)用關(guān)系圖。進(jìn)一步,所述基于逆向工程自動(dòng)生成軟件文檔的裝置還包括類關(guān)系生成器,其用于在源程序是面向?qū)ο蟮某绦驎r(shí),基于類信息、類注釋和全局函數(shù)調(diào)用關(guān)系圖生成類圖和類調(diào)用關(guān)系圖。本發(fā)明的有益效果是:本發(fā)明通過對(duì)函數(shù)注釋和函數(shù)詳細(xì)信息等進(jìn)行信息提取,獲得函數(shù)與功能的對(duì)應(yīng)關(guān)系,通過函數(shù)與功能對(duì)應(yīng)關(guān)系和函數(shù)包含關(guān)系獲得系統(tǒng)功能圖,自動(dòng)生成軟件需求規(guī)格說明文檔,從而實(shí)現(xiàn)由代碼到文檔的逆向工程。再通過函數(shù)與功能的對(duì)應(yīng)關(guān)系、函數(shù)調(diào)用關(guān)系及函數(shù)實(shí)現(xiàn)信息,自動(dòng)生成軟件設(shè)計(jì)說明文檔,從而實(shí)現(xiàn)由代碼到文檔的逆向工程。該方法應(yīng)用廣,適用于vista、win7等常用系統(tǒng),對(duì)應(yīng)的裝置配置簡(jiǎn)單,生成軟件文檔的過程簡(jiǎn)單且嚴(yán)謹(jǐn),生成的軟件文檔錯(cuò)誤率低,支持直接搜索源代碼文本,且結(jié)果易于理解。附圖說明圖1為本發(fā)明所述基于逆向工程自動(dòng)生成軟件文檔的方法的流程示意圖;圖2為本發(fā)明所述基于逆向工程自動(dòng)生成軟件文檔的裝置的原理示意圖。具體實(shí)施方式以下結(jié)合附圖對(duì)本發(fā)明的原理和特征進(jìn)行描述,所舉實(shí)例只用于解釋本發(fā)明,并非用于限定本發(fā)明的范圍。如圖1所示,本實(shí)施例給出了一種一種基于逆向工程自動(dòng)生成軟件文檔的方法,包括:步驟1,對(duì)源程序進(jìn)行掃描分析,獲得函數(shù)注釋、函數(shù)詳細(xì)信息、函數(shù)間相互調(diào)用關(guān)系和函數(shù)間相互包含關(guān)系;步驟2,對(duì)函數(shù)注釋和函數(shù)詳細(xì)信息進(jìn)行自然語言識(shí)別,提取出函數(shù)功能信息;步驟3,基于函數(shù)詳細(xì)信息,并結(jié)合函數(shù)間相互調(diào)用關(guān)系和函數(shù)間相互包含關(guān)系,分別生成全局函數(shù)調(diào)用關(guān)系圖和全局函數(shù)包含關(guān)系圖;步驟4,基于函數(shù)功能信息、函數(shù)詳細(xì)信息和全局函數(shù)調(diào)用關(guān)系圖生成自動(dòng)生成軟件設(shè)計(jì)說明文檔;步驟5,基于函數(shù)功能信息和全局函數(shù)包含關(guān)系圖,生成系統(tǒng)功能圖;步驟6,基于系統(tǒng)功能圖自動(dòng)生成軟件需求規(guī)格說明文檔。本實(shí)施例中,所述函數(shù)詳細(xì)信息包括函數(shù)名、起始位置、函數(shù)所在類、返回值、參數(shù)列表、接口和內(nèi)部實(shí)現(xiàn)邏輯;所述步驟3中采用面向函數(shù)級(jí)節(jié)點(diǎn)的全局路徑分析方法生成全局函數(shù)調(diào)用關(guān)系圖;所述基于逆向工程自動(dòng)生成軟件文檔的方法還包括:若源程序是面向?qū)ο蟮某绦?,則還通過對(duì)源程序進(jìn)行掃描分析獲得類信息,并基于類信息和類注釋生成類圖和類調(diào)用關(guān)系圖。如圖2所示,對(duì)應(yīng)上述的基于逆向工程自動(dòng)生成軟件文檔的方法,本實(shí)施例還給出了一種基于逆向工程自動(dòng)生成軟件文檔的裝置,該裝置包括源代碼靜態(tài)分析掃描器、函數(shù)功能信息提取器、全局函數(shù)關(guān)系圖生成器、軟件設(shè)計(jì)說明生成器、系統(tǒng)功能圖生成器和軟件需求規(guī)格說明生成器:所述源代碼靜態(tài)分析掃描器,其用于對(duì)源程序進(jìn)行掃描分析,獲得函數(shù)注釋、函數(shù)詳細(xì)信息、函數(shù)間相互調(diào)用關(guān)系和函數(shù)間相互包含關(guān)系,并將函數(shù)注釋和函數(shù)詳細(xì)信息傳輸給所述函數(shù)功能信息提取器,將函數(shù)詳細(xì)信息、函數(shù)間相互調(diào)用關(guān)系和函數(shù)間相互包含關(guān)系傳輸給所述全局關(guān)系圖生成器;所述函數(shù)功能信息提取器,其用于對(duì)接收的函數(shù)注釋和函數(shù)詳細(xì)信息進(jìn)行自然語言識(shí)別,提取出函數(shù)功能信息,并將函數(shù)功能信息傳輸給所述軟件設(shè)計(jì)說明生成器和所述系統(tǒng)功能圖生成器;所述全局函數(shù)關(guān)系圖生成器,其用于根據(jù)接收的函數(shù)詳細(xì)信息,并結(jié)合接收的函數(shù)間相互調(diào)用關(guān)系和函數(shù)間相互包含關(guān)系,分別生成全局函數(shù)調(diào)用關(guān)系圖和全局函數(shù)包含關(guān)系圖,并將生成的全局函數(shù)調(diào)用關(guān)系圖傳輸給所述軟件設(shè)計(jì)說明生成器,將生成的全局函數(shù)包含關(guān)系圖傳輸給所述系統(tǒng)功能圖生成器;所述軟件設(shè)計(jì)說明生成器,其用于根據(jù)接收的函數(shù)功能信息、函數(shù)詳細(xì)信息和全局函數(shù)調(diào)用關(guān)系圖自動(dòng)生成軟件設(shè)計(jì)說明文檔;所述系統(tǒng)功能圖生成器,其用于根據(jù)接收函數(shù)功能信息和全局函數(shù)包含關(guān)系圖,生成系統(tǒng)功能圖,并將生成的系統(tǒng)功能圖傳輸給所述軟件需求規(guī)格說明生成器;所述需求規(guī)格說明生成器,其用于根據(jù)接收的系統(tǒng)功能圖自動(dòng)生成軟件需求規(guī)格說明文檔。對(duì)應(yīng)于本實(shí)施例的方法步驟,這里所述基于逆向工程自動(dòng)生成軟件文檔的裝置還包括類關(guān)系生成器,其用于在源程序是面向?qū)ο蟮某绦驎r(shí),基于類信息、類注釋和全局函數(shù)調(diào)用關(guān)系圖生成類圖和類調(diào)用關(guān)系圖。參照?qǐng)D2,本實(shí)施例對(duì)系統(tǒng)源代碼進(jìn)行分析和處理,獲得軟件需求規(guī)格說明和軟件詳細(xì)設(shè)計(jì),具體實(shí)現(xiàn)方法如下:步驟A,對(duì)源程序進(jìn)行掃描分析,獲得每個(gè)函數(shù)的局部調(diào)用路徑圖,然后根據(jù)函數(shù)入口連接順序執(zhí)行的函數(shù),得到全局函數(shù)調(diào)用關(guān)系圖,這里的詳細(xì)實(shí)現(xiàn)方案可借鑒(專利系統(tǒng)測(cè)試方法及裝置,查專利號(hào):CN101876939A)。按照面向函數(shù)級(jí)節(jié)點(diǎn)的全局路徑分析方法對(duì)源程序進(jìn)行掃描分析的過程中,可獲得每個(gè)函數(shù)的名稱及其定義的起始位置、函數(shù)的返回值、參數(shù)列表、該函數(shù)附近的注釋等信息,還能獲得函數(shù)之間的相互調(diào)用關(guān)系及相互包含關(guān)系等。如果是面向?qū)ο蟮某绦颍€可以獲得類的信息、實(shí)現(xiàn)的接口及類之間的繼承關(guān)系等。步驟B,根據(jù)獲得每個(gè)函數(shù)的信息以及函數(shù)之間的相互調(diào)用關(guān)系,可以獲得一個(gè)全局函數(shù)調(diào)用關(guān)系圖和全局函數(shù)調(diào)用路徑。如果是面向?qū)ο蟮某绦颍梢垣@得類圖。根據(jù)函數(shù)調(diào)用關(guān)系,可以獲得類之間的相互調(diào)用關(guān)系,得到類調(diào)用關(guān)系圖。步驟C,根據(jù)函數(shù)間的相互包含關(guān)系,可以獲得一個(gè)全局函數(shù)包含關(guān)系圖。步驟D,對(duì)于源代碼中所定義變量名和函數(shù)名等標(biāo)識(shí)符,如果都使用了有意義的名稱,那么則可以使用中英文間的翻譯,獲得變量和函數(shù)所代表的意義。同時(shí),通過自然語言識(shí)別,對(duì)函數(shù)周圍的注釋進(jìn)行處理,抽取相關(guān)的功能信息,與獲得的變量和函數(shù)所代表的意義結(jié)合可獲得每個(gè)函數(shù)所對(duì)應(yīng)的功能。步驟E,結(jié)合獲得的函數(shù)詳細(xì)信息、函數(shù)間調(diào)用關(guān)系和函數(shù)對(duì)應(yīng)的功能,能夠獲得系統(tǒng)的詳細(xì)設(shè)計(jì)信息。根據(jù)GJB438B-2009軍用軟件開發(fā)文檔通用要求,將這些信息填入《軟件詳細(xì)設(shè)計(jì)》文檔的4CSCI體系結(jié)構(gòu)設(shè)計(jì)中,即按照標(biāo)準(zhǔn)自動(dòng)生成軟件詳細(xì)設(shè)計(jì)文檔。同時(shí)能夠獲得系統(tǒng)功能的內(nèi)聚度和系統(tǒng)功能間的耦合度,可作為評(píng)測(cè)系統(tǒng)質(zhì)量的一個(gè)度量。步驟F,根據(jù)獲得的函數(shù)間的包含關(guān)系及函數(shù)對(duì)應(yīng)的功能,可獲得系統(tǒng)功能圖,根據(jù)GJB438B-2009軍用軟件開發(fā)文檔通用要求,將這些信息填入《軟件需求規(guī)格說明》文檔的3.2CSCI能力和3.3CSCI外部接口需求,即按標(biāo)準(zhǔn)生成軟件需求規(guī)格說明文檔。以上所述僅為本發(fā)明的較佳實(shí)施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。