本發(fā)明涉及數(shù)據(jù)處理技術(shù)領(lǐng)域,具體涉及一種文件掃描的方法及裝置。
背景技術(shù):
不基于編譯的靜態(tài)代碼分析工具有著高效、不依賴編譯環(huán)境、輕量化的優(yōu)點?,F(xiàn)有的不基于編譯的靜態(tài)分析工具(如cppcheck)的主要流程為:獲取掃描路徑配置,對每一個源文件進行預(yù)處理、對預(yù)處理后的字符串進行符號化處理、生成符號表、存儲符號表、對生成的符號表進行檢查。
在預(yù)處理、符號化、生成符號表時,機制為線性單文件處理。因此難以處理跨文件場景,導(dǎo)致較多的誤報和漏報。
預(yù)處理不可控,因靜態(tài)代碼分析不依賴編譯,無法獲取編譯器或環(huán)境變量里配置的include路徑,因此需要用戶手動配置依賴文件的目錄。如果用戶沒有配置或配置不全,會使頭文件未包含完整、宏定義找不到,導(dǎo)致宏無法正確展開或無法找到變量定義等一系列問題,從而引起較多的誤報和漏報。
技術(shù)實現(xiàn)要素:
本發(fā)明實施例提供一種文件掃描的方法,可以避免誤報和漏報。本發(fā)明實施例還提供了相應(yīng)的裝置。
本發(fā)明第一方面提供一種文件掃描的方法,包括:
符號化主文件,生成主文件符號表;
根據(jù)全局文件依賴關(guān)系,對所述主文件所依賴的依賴文件進行符號化,生成所述依賴文件的符號表,所述全局文件依賴關(guān)系為根據(jù)所述主文件與所述依賴文件間的依賴語句建立的關(guān)系;
為所述主文件符號表和所述依賴文件的符號表建立鏈接關(guān)系,得到統(tǒng)一符號表;
掃描所述統(tǒng)一符號表,并輸出掃描結(jié)果。
本發(fā)明第二方面提供一種文件掃描的裝置,包括:
第一處理單元,用于符號化主文件,生成主文件符號表;
第二處理單元,用于根據(jù)全局文件依賴關(guān)系,對所述主文件所依賴的依賴文件進行符號化,生成所述依賴文件的符號表,所述全局文件依賴關(guān)系為根據(jù)所述主文件與所述依賴文件間的依賴語句建立的關(guān)系;
鏈接建立單元,用于為所述第一處理單元處理得到的所述主文件符號表和所述第二處理單元處理得到的所述依賴文件的符號表建立鏈接關(guān)系,得到統(tǒng)一符號表;
掃描單元,用于掃描所述鏈接建立單元建立的所述統(tǒng)一符號表;
輸出單元,用于輸出所述掃描單元掃描所述統(tǒng)一符號的掃描結(jié)果。
本發(fā)明實施例采用符號化主文件,生成主文件符號表;根據(jù)全局文件依賴關(guān)系,對所述主文件所依賴的依賴文件進行符號化,生成所述依賴文件的符號表,所述全局文件依賴關(guān)系為根據(jù)所述主文件與所述依賴文件間的依賴語句建立的關(guān)系;為所述主文件符號表和所述依賴文件的符號表建立鏈接關(guān)系,得到統(tǒng)一符號表;掃描所述統(tǒng)一符號表,并輸出掃描結(jié)果。與現(xiàn)有技術(shù)中因跨文件場景的文件掃描時誤報漏報較多相比,本發(fā)明實施例提供的文件掃描的方法,通過文件依賴關(guān)系,掃描文件時可以掃描所有有依賴關(guān)系的文件的統(tǒng)一符號表,從而有效的避免了誤報和漏報。
附圖說明
為了更清楚地說明本發(fā)明實施例中的技術(shù)方案,下面將對實施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1是本發(fā)明實施例中文件掃描的方法的一實施例示意圖;
圖2是本發(fā)明實施例中一示例的一示意圖;
圖3是本發(fā)明實施例中一示例的另一示意圖;
圖4是本發(fā)明實施例中一示例的另一示意圖;
圖5是本發(fā)明實施例中一示例的另一示意圖;
圖6是本發(fā)明實施例中一示例的另一示意圖;
圖7是本發(fā)明實施例中一示例的另一示意圖;
圖8是本發(fā)明實施例中一示例的另一示意圖;
圖9是本發(fā)明實施例中文件掃描的方法的另一實施例示意圖;
圖10是本發(fā)明實施例中文件掃描的裝置的一實施例示意圖;
圖11是本發(fā)明實施例中文件掃描的裝置的另一實施例示意圖;
圖12是本發(fā)明實施例中文件掃描的裝置的另一實施例示意圖;
圖13是本發(fā)明實施例中文件掃描的裝置的另一實施例示意圖;
圖14是本發(fā)明實施例中文件掃描的裝置的另一實施例示意圖;
圖15是本發(fā)明實施例中文件掃描的裝置的另一實施例示意圖。
具體實施方式
本發(fā)明實施例提供一種文件掃描的方法,可以避免誤報和漏報。本發(fā)明實施例還提供了相應(yīng)的裝置。以下分別進行詳細(xì)說明。
下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
參閱圖1,本發(fā)明實施例提供的文件掃描的方法的一實施例包括:
101、符號化主文件,生成主文件符號表。
本發(fā)明實施例中的文件指的源文件,而非其他類型文件
源文件就是用匯編語言或高級語言寫出來的代碼保存為文件后的結(jié)果。
本發(fā)明實施例中,符號化主文件是指對主文件進行符號化處理,生成主文件對應(yīng)的符號表的過程,文件符號化的過程屬于現(xiàn)有技術(shù),本發(fā)明實施例中不做過多贅述。
主文件在本發(fā)明實施例中是相對于依賴文件而言的,如圖2所示,文件file1可以理解為是主文件。file2、file3以及圖2所示的其他文件都可以理解為是file1的依賴文件。
102、根據(jù)全局文件依賴關(guān)系,對所述主文件所依賴的依賴文件進行符號化,生成所述依賴文件的符號表,所述全局文件依賴關(guān)系為根據(jù)所述主文件與 所述依賴文件間的依賴語句建立的關(guān)系。
本發(fā)明實施例中,對所述主文件所依賴的依賴文件進行符號化,生成所述依賴文件的符號表參閱圖2可以理解為是對file2、file3以及圖2所示的其他文件進行符號化。
本發(fā)明實施例中不限定步驟101和步驟102的時序,任一在前執(zhí)行都可以,也可以同時執(zhí)行。
103、為所述主文件符號表和所述依賴文件的符號表建立鏈接關(guān)系,得到統(tǒng)一符號表。
主文件符號表和依賴文件的符號表通過鏈接關(guān)系聯(lián)系到一起,這樣掃描時就可以實現(xiàn)跨文件掃描,而不限于只掃描單獨文件的符號表。
104、掃描所述統(tǒng)一符號表,并輸出掃描結(jié)果。
如圖3所示,A.cpp中調(diào)用了B.cpp的BFunc函數(shù),將常量i值為5作為BFunc函數(shù)的參數(shù)。
BFunc函數(shù)實現(xiàn)用參數(shù)i訪問數(shù)組a,數(shù)組大小為3,此時i超出了數(shù)組的上限,則會造成溢出。
如果cppcheck在單獨掃描B.cpp時,因并不知道傳入的參數(shù)i值為5,所以不會報錯,從而產(chǎn)生漏報。而本發(fā)明實施例中,A.cpp和B.cpp之間建立了鏈接,會依次掃描A.cpp和B.cpp,則避免了漏報,輸出i值為5存在錯誤的掃描結(jié)果。
本發(fā)明實施例采用符號化主文件,生成主文件符號表;根據(jù)全局文件依賴關(guān)系,對所述主文件所依賴的依賴文件進行符號化,生成所述依賴文件的符號表,所述全局文件依賴關(guān)系為根據(jù)所述主文件與所述依賴文件間的依賴語句建立的關(guān)系;為所述主文件符號表和所述依賴文件的符號表建立鏈接關(guān)系,得到統(tǒng)一符號表;掃描所述統(tǒng)一符號表,并輸出掃描結(jié)果。與現(xiàn)有技術(shù)中因跨文件場景的文件掃描時誤報漏報較多相比,本發(fā)明實施例提供的文件掃描的方法,通過文件依賴關(guān)系,掃描文件時可以掃描所有有依賴關(guān)系的文件的統(tǒng)一符號表,從而有效的避免了誤報和漏報。
可選地,在上述圖1對應(yīng)的實施例的基礎(chǔ)上,本發(fā)明實施例提供的文件掃描的方法的第一個可選實施例中,所述根據(jù)全局文件依賴關(guān)系,對所述主文件 所依賴的依賴文件進行符號化之前,所述方法還可以包括:
遍歷全局文件,分析所述全局文件的代碼內(nèi)容中標(biāo)識依賴的語句,建立所述全局文件依賴關(guān)系,所述全局文件包括所述主文件和所述依賴文件。
本發(fā)明實施例中,文件間如果有依賴關(guān)系,例如:有引用關(guān)系,在會在代碼內(nèi)容中做出標(biāo)識的,因此,可以通過標(biāo)識依賴的語句,建立所述全局文件依賴關(guān)系,生成全局依賴表。
可選地,在上述圖1對應(yīng)的第一個可選實施例的基礎(chǔ)上,本發(fā)明實施例提供的文件掃描的方法的第二個可選實施例中,所述遍歷全局文件,分析所述全局文件的代碼內(nèi)容中標(biāo)識依賴的語句,建立所述全局文件依賴關(guān)系,所述全局文件包括所述主文件和所述依賴文件,可以包括:
從所述主文件的頭文件中獲取所述主文件所依賴的依賴文件名;
根據(jù)所述依賴文件名,從已建立的文件名和文件信息的對應(yīng)關(guān)系中查找所述依賴文件名對應(yīng)的依賴文件信息;
當(dāng)查找到所述依賴文件名對應(yīng)的依賴文件信息,則將所述依賴文件名對應(yīng)的依賴文件加入所述主文件的依賴關(guān)系,根據(jù)每個主文件的依賴關(guān)系,建立所述全局文件依賴關(guān)系。
本發(fā)明實施例中,廣度遍歷待掃描工程文件夾下的所有代碼文件,如圖4所示,遍歷圖4中的.h,.c,.cpp及其他源碼文件。
將文件信息記錄到文件基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)中,每個節(jié)點就是一個文件或一個目錄,節(jié)點間通過地址鏈接,形成如圖2所示的樹形結(jié)構(gòu),用以記錄全局的文件目錄結(jié)構(gòu)。
同時保存一份映射map數(shù)據(jù),key為文件唯一標(biāo)識,value為文件信息數(shù)據(jù),查找文件信息時可以通過唯一標(biāo)識快速索引到文件信息。
建立依賴關(guān)系時,可以遍歷文件樹形結(jié)構(gòu)中的每個主文件,打開主文件內(nèi)容,讀取其中的頭信息(#include信息),提取出所述主文件所依賴的文件名。為最大程度還原編譯過程,需嚴(yán)格按照#include的順序獲取文件名。
在map中查找該文件名對應(yīng)的文件信息,因#include寫法多樣且依賴的文件不一定會在待掃描的工程目錄下(如圖5),故采取如下策略進行決策:
若通過文件名找到唯一的文件,則將依賴文件直接加入主文件的依賴關(guān)系列表DependenceFileList,結(jié)束;
若通過文件名同時找到多個文件,且#include帶目錄路徑,則向上層匹配路徑,若路徑匹配到唯一的文件,則將依賴文件直接加入主文件DependenceFileList,結(jié)束;若路徑匹配到多個文件或者通過文件名找到多個文件,而#include不帶目錄路徑,則計算主文件在目錄結(jié)構(gòu)上與多個匹配文件的距離,若得到路徑最小的文件,則將依賴文件直接加入主文件的依賴關(guān)系列表DependenceFileList,結(jié)束;若存在距離相同的多個文件,選取#include順序靠前的文件,加入DependenceFileList,結(jié)束。
以上策略在理論上雖然存在找到錯誤文件依賴的風(fēng)險,但通過很多個項目數(shù)據(jù)驗證,用以上策略尋找文件依賴的準(zhǔn)確率達到90%,再次證明了使用路徑匹配和最短路徑算法來查找依賴文件的可靠性。
可選地,在上述圖1對應(yīng)的實施例、第一個或第二個可選實施例的基礎(chǔ)上,本發(fā)明實施例提供的文件掃描的方法的第三個可選實施例中,所述根據(jù)全局文件依賴關(guān)系,對所述主文件所依賴的依賴文件進行符號化,生成所述依賴文件的符號表,可以包括:
根據(jù)全局文件依賴關(guān)系,確認(rèn)所述主文件所依賴的依賴文件是否已經(jīng)符號化;
當(dāng)所述依賴文件未被符號化,則符號化所述依賴文件,生成所述依賴文件的符號表,并緩存所述依賴文件的符號表;
當(dāng)所述依賴文件已被符號化,則從所述緩存中獲取所述依賴文件的符號表。
本發(fā)明實施例中,因同一個文件可能會被其他多個文件所依賴,如按常規(guī)流程掃描這些文件的時候,會把相同依賴的文件重復(fù)符號化多次,造成不必要的性能和時間損耗。于是采取如下符號化緩存策略,提升效率。根據(jù)依賴關(guān)系表統(tǒng)計每個依賴文件被依賴次數(shù),以依賴文件X為例,如圖6所示:
112、當(dāng)需要符號化依賴文件X時,檢查依賴文件X的依賴計數(shù)器dCnt。
掃描開始,初始化所有依賴文件的依賴計數(shù)器,數(shù)值為-1。
113、dCnt==-1,表示還未符號化過,則進行符號化到內(nèi)存。
114、修改X的依賴計數(shù)器數(shù)值為其被依賴的次數(shù)。
115、dCnt!=-1表示依賴文件X已被符號化過。
116、從緩存中獲取依賴文件X的符號表。
在依賴文件X符號化后,還可以進一步的管理依賴文件X的符號表,可以參閱圖7進行理解:
201、依賴X的主文件掃描完成。
202、X的依賴計數(shù)器次數(shù)減1,也就是dCnt-1。
203、檢查此時X的依賴計數(shù)器數(shù)值dCnt。
204、dCnt==0,表示X不再會被使用,執(zhí)行步驟205。
205、刪除X的符號化緩存數(shù)據(jù)。
206、dCnt>0,表示X還可能會被使用,執(zhí)行步驟207。
207、保留X的符號化數(shù)據(jù)到緩存。
本發(fā)明實施例所提供的方案可以而達到依賴調(diào)用的平衡、完備性和內(nèi)存的有效利用。
本發(fā)明實施例提供的緩存策略,可以避免被重復(fù)包含的頭文件被多次符號化,第一次符號化后進行緩存,后續(xù)再被使用時只需要從緩存中調(diào)用,避免了被重復(fù)符號化,提高了掃描效率。
可選地,在上述圖1對應(yīng)的實施例、第一個或第二個可選實施例的基礎(chǔ)上,本發(fā)明實施例提供的文件掃描的方法的第四個可選實施例中,所述為所述主文件符號表和所述依賴文件的符號表建立鏈接關(guān)系,得到統(tǒng)一符號表,可以包括:
根據(jù)所述主文件符號表和所述依賴文件的符號表中的唯一變量標(biāo)識,建立所述主文件符號表和所述依賴文件的符號表中特征參數(shù)的鏈接關(guān)系,得到統(tǒng)一符號表,所述唯一變量標(biāo)識在所述主文件符號表和所述依賴文件的符號表中用于標(biāo)識同一特征參數(shù)。
本發(fā)明實施例中,建立主文件符號表和所述依賴文件的符號表中特征參數(shù)的鏈接關(guān)系可以通過唯一變量標(biāo)識來建立,如圖8所示,通過唯一變量id建立依賴文件Player.h和主文件Player.cpp之間的依賴關(guān)系。
全局變量TSCDependency::varBase來記錄變量id的起始位置,并隨著變量的增加,varBase不斷遞增,從而保證每個變量的id都是唯一的。比如A.cpp中定義了變量a和b,B.cpp中定義了變量c和d,varbase為0,先符號化A,則a的id為1,b的id為2,varbase遞增為2;接下來符號化B,則c的id為3,d的id為4,varbse遞增為4,以此類推。
成員變量和全局變量鏈接,由于局部變量的聲明和使用都在同一個文件中,是一起進行符號化的,無需在符號化后進行鏈接。而成員變量和全局變量的聲明和使用可能存在于不同文件時,因此需要在符號化后,將主文件中的成員變量和全局變量跟依賴文件中對應(yīng)的聲明鏈接起來。符號化過程中需要額外記錄每個文件中所聲明的類及成員變量信息,這樣在主文件A.cpp中檢查到了成員m時,可以先從其依賴文件A.h的記錄中查找是否存在對應(yīng)的類和成員,如果能夠匹配上,則可以將A.cpp中m的變量id置為A.h中聲明m時的變量id。
可選地,在上述圖1對應(yīng)的實施例、第一個或第二個可選實施例的基礎(chǔ)上,本發(fā)明實施例提供的文件掃描的方法的第五個可選實施例中,符號化所述主文件和所述依賴文件時,所述方法還可以包括:
將所述主文件和所述依賴文件中的函數(shù)聲明都記錄在同一函數(shù)聲明列表中;
所述為所述主文件符號表和所述依賴文件的符號表建立鏈接關(guān)系,得到統(tǒng)一符號表,可以包括:
根據(jù)所述同一函數(shù)聲明列表,建立所述主文件的函數(shù)與所述依賴文件的函數(shù)聲明之間的映射關(guān)系,得到統(tǒng)一符號表。
本發(fā)明實施例中,函數(shù)鏈接的過程可以理解為:符號化過程中將主文件和所有依賴文件中的函數(shù)聲明都記錄在同一列表中。符號化后遍歷主文件,當(dāng)發(fā)現(xiàn)主文件中調(diào)用的函數(shù)fun(a)時,遍歷該主文件對應(yīng)的函數(shù)聲明列表,通過參數(shù)匹配找到其對應(yīng)的函數(shù)聲明,建立函數(shù)調(diào)用與函數(shù)聲明之間的映射關(guān)系。
參閱圖9,本發(fā)明實施例提供的文件掃描的方法的另一實施例包括:
301、自動分析代碼建立全局依賴關(guān)系。
預(yù)先遍歷整個項目工程的代碼,快速分析代碼內(nèi)容中標(biāo)識依賴的語句,建 立全局的依賴關(guān)系,生成全局依賴表。
302、遍歷掃描每個主文件,對每個文件執(zhí)行以下步驟;
303、根據(jù)全局依賴關(guān)系,對主文件依賴的文件遍歷進行符號化,生成依賴文件獨立的符號表,如該文件符號表已經(jīng)被緩存,則直接從緩存中獲取。
304、符號化主文件。
305、分析與依賴文件獨立符號表之間的變量、宏等引用關(guān)系,建立符號鏈接,形成統(tǒng)一符號表。
306、緩存符號表。
根據(jù)緩存策略,緩存若干獨立符號表,供之后的進程使用,同時釋放掉不需要的符號表,降低內(nèi)存占用;
307、對統(tǒng)一符號表執(zhí)行掃描,檢查缺陷。
308、輸出掃描結(jié)果。
步驟301-308的具體過程可以參閱圖1只圖8中的相關(guān)描述進行理解,本處不做過多贅述。
參閱圖10,本發(fā)明實施例提供的文件掃描的裝置40的一實施例包括:
第一處理單元401,用于符號化主文件,生成主文件符號表;
第二處理單元402,用于根據(jù)全局文件依賴關(guān)系,對所述主文件所依賴的依賴文件進行符號化,生成所述依賴文件的符號表,所述全局文件依賴關(guān)系為根據(jù)所述主文件與所述依賴文件間的依賴語句建立的關(guān)系;
鏈接建立單元403,用于為所述第一處理單元401處理得到的所述主文件符號表和所述第二處理單元402處理得到的所述依賴文件的符號表建立鏈接關(guān)系,得到統(tǒng)一符號表;
掃描單元404,用于掃描所述鏈接建立單元403建立的所述統(tǒng)一符號表;
輸出單元405,用于輸出所述掃描單元掃描所述統(tǒng)一符號的掃描結(jié)果。
本發(fā)明實施例中,第一處理單元401符號化主文件,生成主文件符號表;第二處理單元402根據(jù)全局文件依賴關(guān)系,對所述主文件所依賴的依賴文件進行符號化,生成所述依賴文件的符號表,所述全局文件依賴關(guān)系為根據(jù)所述主文件與所述依賴文件間的依賴語句建立的關(guān)系;鏈接建立單元403為所述第一 處理單元401處理得到的所述主文件符號表和所述第二處理單元402處理得到的所述依賴文件的符號表建立鏈接關(guān)系,得到統(tǒng)一符號表;掃描單元404掃描所述鏈接建立單元403建立的所述統(tǒng)一符號表;輸出單元405輸出所述掃描單元掃描所述統(tǒng)一符號的掃描結(jié)果。與現(xiàn)有技術(shù)中因跨文件場景的文件掃描時誤報漏報較多相比,本發(fā)明實施例提供的文件掃描的裝置,通過文件依賴關(guān)系,掃描文件時可以掃描所有有依賴關(guān)系的文件的統(tǒng)一符號表,從而有效的避免了誤報和漏報。
可選地,在上述圖10對應(yīng)的實施例的基礎(chǔ)上,參閱圖11,本發(fā)明實施例提供的文件掃描的裝置40的第一個可選實施例中,所述裝置40還包括:
依賴關(guān)系建立單元406,用于在所述第二處理單元402符號化所述依賴文件之前,遍歷全局文件,分析所述全局文件的代碼內(nèi)容中標(biāo)識依賴的語句,建立所述全局文件依賴關(guān)系,所述全局文件包括所述主文件和所述依賴文件。
可選地,在上述圖11對應(yīng)的實施例的基礎(chǔ)上,參閱圖12,本發(fā)明實施例提供的文件掃描的裝置40的第二個可選實施例中,所述依賴關(guān)系建立單元406包括:
獲取子單元4061,用于從所述主文件的頭文件中獲取所述主文件所依賴的依賴文件名;
查找子單元4062,用于根據(jù)所述獲取子單元4061獲取的所述依賴文件名,從已建立的文件名和文件信息的對應(yīng)關(guān)系中查找所述依賴文件名對應(yīng)的依賴文件信息;
建立子單元4063,用于當(dāng)所述查找子單元4062查找到所述依賴文件名對應(yīng)的依賴文件信息,則將所述依賴文件名對應(yīng)的依賴文件加入所述主文件的依賴關(guān)系,根據(jù)每個主文件的依賴關(guān)系,建立所述全局文件依賴關(guān)系。
可選地,在上述圖10對應(yīng)的實施例的基礎(chǔ)上,參閱圖13,本發(fā)明實施例提供的文件掃描的裝置40的第三個可選實施例中,所述第二處理單元402包括:
確認(rèn)子單元4021,用于根據(jù)全局文件依賴關(guān)系,確認(rèn)所述主文件所依賴的依賴文件是否已經(jīng)符號化;
生成子單元4022,用于當(dāng)所述確認(rèn)子單元4021確認(rèn)到所述依賴文件未被符 號化,則符號化所述依賴文件,生成所述依賴文件的符號表;
緩存子單元4023,用于緩存所述生成子單元4022生成的所述依賴文件的符號表;
獲取子單元4024,用于當(dāng)所述確認(rèn)子單元4021確認(rèn)到所述依賴文件已被符號化,則從所述緩存中獲取所述依賴文件的符號表。
可選地,在上述圖10對應(yīng)的實施例、第一個或第二個可選實施例的基礎(chǔ)上,本發(fā)明實施例提供的文件掃描的裝置40的第四個可選實施例中,
所述鏈接建立單元403,用于根據(jù)所述主文件符號表和所述依賴文件的符號表中的唯一變量標(biāo)識,建立所述主文件符號表和所述依賴文件的符號表中特征參數(shù)的鏈接關(guān)系,得到統(tǒng)一符號表,所述唯一變量標(biāo)識在所述主文件符號表和所述依賴文件的符號表中用于標(biāo)識同一特征參數(shù)。
可選地,在上述圖10對應(yīng)的實施例、第一個或第二個可選實施例的基礎(chǔ)上,參閱圖14,本發(fā)明實施例提供的文件掃描的裝置40的第五個可選實施例中,所述裝置還包括:記錄單元407,
所述記錄單元407,用于將所述主文件和所述依賴文件中的函數(shù)聲明都記錄在同一函數(shù)聲明列表中;
所述鏈接建立單元403,用于根據(jù)所述記錄單元407記錄的所述同一函數(shù)聲明列表,建立所述主文件的函數(shù)與所述依賴文件的函數(shù)聲明之間的映射關(guān)系,得到統(tǒng)一符號表。
本發(fā)明圖10只圖14實施例所提供的文件掃描的裝置40可以參閱圖1至圖9中的相關(guān)描述進行理解,本處不做過多贅述。
圖15是本發(fā)明實施例中文件掃描的裝置40的結(jié)構(gòu)示意圖。文件掃描的裝置40可包括輸入設(shè)備410、輸出設(shè)備440、處理器430和存儲器440。
存儲器440可以包括只讀存儲器和隨機存取存儲器,并向處理器430提供指令和數(shù)據(jù)。存儲器440的一部分還可以包括非易失性隨機存取存儲器(NVRAM)。
存儲器440存儲了如下的元素,可執(zhí)行模塊或者數(shù)據(jù)結(jié)構(gòu),或者它們的子集,或者它們的擴展集:
操作指令:包括各種操作指令,用于實現(xiàn)各種操作。
操作系統(tǒng):包括各種系統(tǒng)程序,用于實現(xiàn)各種基礎(chǔ)業(yè)務(wù)以及處理基于硬件的任務(wù)。
在本發(fā)明實施例中,處理器430通過調(diào)用存儲器440存儲的操作指令(該操作指令可存儲在操作系統(tǒng)中),執(zhí)行如下操作:
符號化主文件,生成主文件符號表;
根據(jù)全局文件依賴關(guān)系,對所述主文件所依賴的依賴文件進行符號化,生成所述依賴文件的符號表,所述全局文件依賴關(guān)系為根據(jù)所述主文件與所述依賴文件間的依賴語句建立的關(guān)系;
為所述主文件符號表和所述依賴文件的符號表建立鏈接關(guān)系,得到統(tǒng)一符號表;
掃描所述統(tǒng)一符號表,并通過輸出設(shè)備420輸出掃描結(jié)果。
與現(xiàn)有技術(shù)中因跨文件場景的文件掃描時誤報漏報較多相比,本發(fā)明實施例提供的文件掃描的裝置,通過文件依賴關(guān)系,掃描文件時可以掃描所有有依賴關(guān)系的文件的統(tǒng)一符號表,從而有效的避免了誤報和漏報。
處理器430控制為文件掃描的裝置40的操作,處理器430還可以稱為CPU(Central Processing Unit,中央處理單元)。存儲器440可以包括只讀存儲器和隨機存取存儲器,并向處理器430提供指令和數(shù)據(jù)。存儲器440的一部分還可以包括非易失性隨機存取存儲器(NVRAM)。具體的應(yīng)用中,為文件掃描的裝置40的各個組件通過總線系統(tǒng)450耦合在一起,其中總線系統(tǒng)450除包括數(shù)據(jù)總線之外,還可以包括電源總線、控制總線和狀態(tài)信號總線等。但是為了清楚說明起見,在圖中將各種總線都標(biāo)為總線系統(tǒng)450。
上述本發(fā)明實施例揭示的方法可以應(yīng)用于處理器430中,或者由處理器430實現(xiàn)。處理器430可能是一種集成電路芯片,具有信號的處理能力。在實現(xiàn)過程中,上述方法的各步驟可以通過處理器430中的硬件的集成邏輯電路或者軟件形式的指令完成。上述的處理器430可以是通用處理器、數(shù)字信號處理器(DSP)、專用集成電路(ASIC)、現(xiàn)成可編程門陣列(FPGA)或者其他可編程邏輯器件、分立門或者晶體管邏輯器件、分立硬件組件??梢詫崿F(xiàn)或者執(zhí)行 本發(fā)明實施例中的公開的各方法、步驟及邏輯框圖。通用處理器可以是微處理器或者該處理器也可以是任何常規(guī)的處理器等。結(jié)合本發(fā)明實施例所公開的方法的步驟可以直接體現(xiàn)為硬件譯碼處理器執(zhí)行完成,或者用譯碼處理器中的硬件及軟件模塊組合執(zhí)行完成。軟件模塊可以位于隨機存儲器,閃存、只讀存儲器,可編程只讀存儲器或者電可擦寫可編程存儲器、寄存器等本領(lǐng)域成熟的存儲介質(zhì)中。該存儲介質(zhì)位于存儲器440,處理器430讀取存儲器440中的信息,結(jié)合其硬件完成上述方法的步驟。
可選地,所述處理器430用于遍歷全局文件,分析所述全局文件的代碼內(nèi)容中標(biāo)識依賴的語句,建立所述全局文件依賴關(guān)系,所述全局文件包括所述主文件和所述依賴文件。
可選地,所述處理器430用于:
從所述主文件的頭文件中獲取所述主文件所依賴的依賴文件名;
根據(jù)所述依賴文件名,從已建立的文件名和文件信息的對應(yīng)關(guān)系中查找所述依賴文件名對應(yīng)的依賴文件信息;
當(dāng)查找到所述依賴文件名對應(yīng)的依賴文件信息,則將所述依賴文件名對應(yīng)的依賴文件加入所述主文件的依賴關(guān)系,根據(jù)每個主文件的依賴關(guān)系,建立所述全局文件依賴關(guān)系。
可選地,所述處理器430用于:
根據(jù)全局文件依賴關(guān)系,確認(rèn)所述主文件所依賴的依賴文件是否已經(jīng)符號化;
當(dāng)所述依賴文件未被符號化,則符號化所述依賴文件,生成所述依賴文件的符號表,并緩存所述依賴文件的符號表;
當(dāng)所述依賴文件已被符號化,則從所述緩存中獲取所述依賴文件的符號表。
可選地,所述處理器430用于根據(jù)所述主文件符號表和所述依賴文件的符號表中的唯一變量標(biāo)識,建立所述主文件符號表和所述依賴文件的符號表中特征參數(shù)的鏈接關(guān)系,得到統(tǒng)一符號表,所述唯一變量標(biāo)識在所述主文件符號表和所述依賴文件的符號表中用于標(biāo)識同一特征參數(shù)。
可選地,所述處理器430用于將所述主文件和所述依賴文件中的函數(shù)聲明都記錄在同一函數(shù)聲明列表中;根據(jù)所述同一函數(shù)聲明列表,建立所述主文件的函數(shù)與所述依賴文件的函數(shù)聲明之間的映射關(guān)系,得到統(tǒng)一符號表。
本發(fā)明實施例所提供的文件掃描的裝置40可以參閱圖1至圖9中的相關(guān)描述進行理解,本處不做過多贅述。
本領(lǐng)域普通技術(shù)人員可以理解上述實施例的各種方法中的全部或部分步驟是可以通過程序來指令相關(guān)的硬件來完成,該程序可以存儲于一計算機可讀存儲介質(zhì)中,存儲介質(zhì)可以包括:ROM、RAM、磁盤或光盤等。
以上對本發(fā)明實施例所提供的文件掃描的方法以及裝置進行了詳細(xì)介紹,本文中應(yīng)用了具體個例對本發(fā)明的原理及實施方式進行了闡述,以上實施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想;同時,對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實施方式及應(yīng)用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對本發(fā)明的限制。