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