本技術(shù)涉及代碼檢測(cè)領(lǐng)域,并且更具體的,涉及一種了代碼檢測(cè)分析的方法和計(jì)算設(shè)備。
背景技術(shù):
1、開(kāi)放源代碼(open?source?code)也稱為源代碼公開(kāi),指的是一種軟件發(fā)布模式,通常簡(jiǎn)稱為“開(kāi)源代碼”,通常只有軟件的作者或著作權(quán)所有者等擁有程序的原始碼。有些軟件的作者會(huì)將原始碼公開(kāi),此稱之為“源代碼公開(kāi)”,但這并不一定符合“開(kāi)放源代碼”的定義及條件,因?yàn)樽髡呖赡軙?huì)設(shè)定公開(kāi)原始碼的條件限制。例如,如果用戶在自己的代碼中使用了gnu通用公共許可證(general?public?license,gpl)協(xié)議的代碼,則用戶自己開(kāi)發(fā)的代碼也需要進(jìn)行“源代碼公開(kāi)”,如果用戶不想開(kāi)源,就不能使用gpl協(xié)議的代碼。因此,用戶需要對(duì)自己開(kāi)發(fā)的代碼進(jìn)行引用檢測(cè)分析,查看自己開(kāi)發(fā)的代碼是否引用了gpl協(xié)議中的代碼。
2、代碼克隆檢測(cè)(code?clone?detection)是一種用于識(shí)別源代碼中相似部分的技術(shù),它在軟件工程領(lǐng)域中具有重要作用,可以幫助開(kāi)發(fā)人員識(shí)別重復(fù)、冗余或可能引發(fā)維護(hù)問(wèn)題的代碼片段,如果發(fā)現(xiàn)自己開(kāi)發(fā)的代碼有若干行與開(kāi)源代碼相似,就被認(rèn)為存在片段引用。這種方法可以比較高效地找到疑似的開(kāi)源片段引用,但是也可能存在一些誤判的情況。例如,通常情況下,代碼開(kāi)頭的注釋如果是許可證信息,由于許可證的文本基本是一樣的,該方法會(huì)將許可證信息也判定為片段引用;又例如,對(duì)于一些通用的較短的函數(shù)如“get”、“set”等會(huì)出現(xiàn)多行代碼相同,該方法也會(huì)將其判斷定為片段引用。由此可見(jiàn),現(xiàn)有的開(kāi)源代碼檢測(cè)方案的準(zhǔn)確性不高。
3、因此,需要一種代碼檢測(cè)分析的方法,提高代碼檢測(cè)的準(zhǔn)確性。
技術(shù)實(shí)現(xiàn)思路
1、本技術(shù)提供一種代碼檢測(cè)分析的方法,可以提高代碼檢測(cè)的準(zhǔn)確性和代碼開(kāi)發(fā)的效率。
2、第一方面,提供一種代碼檢測(cè)分析的方法,在一種可能的實(shí)現(xiàn)方式中,該方法可以應(yīng)用在云服務(wù)系統(tǒng),該方法可以由云管理平臺(tái)(或者,云管理平臺(tái)中的通信設(shè)備)執(zhí)行,或者,也可以由云管理平臺(tái)(或者,云管理平臺(tái)中的通信設(shè)備)的組成部件(例如芯片或者電路)執(zhí)行。在另一種可能的實(shí)現(xiàn)方式中,該方法可以由計(jì)算設(shè)備(例如,電腦)執(zhí)行,或者,也可以由計(jì)算設(shè)備的組成部件(例如芯片或者電路)執(zhí)行。
3、該方法包括:獲取第一代碼片段,第一代碼片段屬于用戶代碼文件中與開(kāi)源代碼倉(cāng)庫(kù)中包括的開(kāi)源代碼相似的代碼片段,第一代碼片段包括的代碼行數(shù)為n,n為大于或者等于2的整數(shù);若公共代碼數(shù)據(jù)庫(kù)中包括第一代碼片段,則確定用戶代碼文件中的第一代碼片段為公共代碼片段,其中,公共代碼數(shù)據(jù)庫(kù)中包括多個(gè)第二代碼片段,多個(gè)第二代碼片段中的每個(gè)第二代碼片段屬于至少兩個(gè)不同的開(kāi)源代碼文件,至少兩個(gè)不同的開(kāi)源代碼文件中的每個(gè)開(kāi)源代碼文件屬于至少兩個(gè)不同的開(kāi)源代碼倉(cāng)庫(kù),每個(gè)第二代碼片段包括的代碼行數(shù)為n。
4、本技術(shù)中“代碼片段”可以理解為是連續(xù)的多行代碼。
5、本技術(shù)中,“用戶代碼文件中與開(kāi)源代碼倉(cāng)庫(kù)中包括的開(kāi)源代碼相似的代碼片段”中的“相似”可以理解為,例如,用戶代碼文件中連續(xù)的多行代碼片段與開(kāi)源代碼倉(cāng)庫(kù)中包括的某個(gè)開(kāi)源文件中連續(xù)的多行相似或者相同。
6、本技術(shù)中的“第二代碼片段”可以來(lái)自于開(kāi)源代碼中。或者,也可以理解為,開(kāi)源代碼中的代碼片段都有可能成為本技術(shù)中的“第二代碼片段”,只要開(kāi)源代碼中的某個(gè)代碼片段屬于至少兩個(gè)不同開(kāi)源代碼文件,并且該至少兩個(gè)開(kāi)源代碼文件中的每個(gè)開(kāi)源代碼文件屬于至少兩個(gè)不同的開(kāi)源代碼倉(cāng)庫(kù),便可以成為“第二代碼片段”。
7、也可以理解為,本技術(shù)中,多個(gè)不同的開(kāi)源代碼文件和多個(gè)不同的開(kāi)源代碼倉(cāng)庫(kù)中都包括第二代碼片段。例如,代碼片段#1既屬于開(kāi)源代碼文件#1,也屬于開(kāi)源代碼文件#2、開(kāi)源代碼文件#3,而開(kāi)源代碼文件#1既屬于開(kāi)源代碼倉(cāng)庫(kù)#a,也屬于開(kāi)源代碼倉(cāng)庫(kù)#b和開(kāi)源代碼倉(cāng)庫(kù)#c;開(kāi)源代碼文件#2既屬于開(kāi)源代碼倉(cāng)庫(kù)#a,也屬于開(kāi)源代碼倉(cāng)庫(kù)#d;開(kāi)源代碼文件#3既屬于開(kāi)源代碼倉(cāng)庫(kù)#b,也屬于開(kāi)源代碼倉(cāng)庫(kù)#c。
8、本技術(shù)中,在一種可能的實(shí)現(xiàn)方式中,每個(gè)開(kāi)源代碼文件對(duì)應(yīng)至少兩個(gè)不同的文件名稱。例如,開(kāi)源代碼文件#1在開(kāi)源代碼倉(cāng)庫(kù)#a中的文件名稱為file_name#1,開(kāi)源代碼文件#1在開(kāi)源代碼倉(cāng)庫(kù)#b中的文件名稱為file_name#2,開(kāi)源代碼文件#1在開(kāi)源代碼倉(cāng)庫(kù)#c中的文件名稱為file_name#3。
9、本技術(shù)中,在一種可能的實(shí)現(xiàn)方式中,每個(gè)開(kāi)源代碼文件對(duì)應(yīng)至少兩個(gè)不同類型的文件許可證。例如,開(kāi)源代碼文件#1在開(kāi)源代碼倉(cāng)庫(kù)#a中的文件許可證的類型為license#1,開(kāi)源代碼文件#1在開(kāi)源代碼倉(cāng)庫(kù)#b中的文件名稱為license#2,開(kāi)源代碼文件#1在開(kāi)源代碼倉(cāng)庫(kù)#c中的文件名稱為license#3。
10、基于上述技術(shù)方案,本技術(shù)提提出公共代碼數(shù)據(jù)庫(kù)中包括的每個(gè)第二代碼片段屬于至少兩個(gè)不同的開(kāi)源代碼文件,并且每個(gè)開(kāi)源代碼文件屬于至少兩個(gè)開(kāi)源代碼倉(cāng)庫(kù)中的代碼片段,如果公共代碼數(shù)據(jù)庫(kù)中的代碼片段包括用戶代碼文件中的代碼片段,則確定用戶的代碼片段是公共代碼片段。由于本技術(shù)中的公共代碼數(shù)據(jù)庫(kù)中的代碼收集了來(lái)自不同文件和不同倉(cāng)庫(kù)的公共代碼片段,因此當(dāng)用戶檢測(cè)自己的開(kāi)源代碼文件中的代碼片段是否屬于某個(gè)協(xié)議的開(kāi)源代碼時(shí),可以降低誤報(bào)率,實(shí)現(xiàn)代碼檢測(cè)的準(zhǔn)確性和以及代碼開(kāi)發(fā)的效率。
11、在一種可能的實(shí)現(xiàn)方式中,在一種可能的實(shí)現(xiàn)方式中,每個(gè)開(kāi)源代碼文件對(duì)應(yīng)至少兩個(gè)不同的文件名稱,和/或,每個(gè)開(kāi)源代碼文件對(duì)應(yīng)至少兩個(gè)不同類型的文件許可證。
12、基于上述技術(shù)方案,本技術(shù)中,在不同的開(kāi)源代碼倉(cāng)庫(kù)中,相同的開(kāi)源代碼文件可能有不同的文件名稱和/或不同類型的文件許可證。這些特征進(jìn)一步說(shuō)明了,該代碼片段為公共代碼。
13、在一種可能的實(shí)現(xiàn)方式中,該方法還包括:根據(jù)用戶代碼文件和開(kāi)源代碼倉(cāng)庫(kù),確定用戶代碼文件中與開(kāi)源代碼倉(cāng)庫(kù)中包括的開(kāi)源代碼相似的代碼片段。
14、在一種可能的實(shí)現(xiàn)方式中,該方法還包括:在開(kāi)源代碼倉(cāng)庫(kù)中,確定第二代碼片段;根據(jù)多個(gè)第二代碼片段,生成公共代碼數(shù)據(jù)庫(kù)。
15、基于上述技術(shù)方案,本技術(shù)中,可以先在開(kāi)源代碼中挖掘公共代碼片段,從而生成公共代碼數(shù)據(jù)庫(kù),從而便于后續(xù)比對(duì)用戶代碼文件中的代碼片段是否為公共代碼。
16、在一種可能的實(shí)現(xiàn)方式中,每個(gè)開(kāi)源代碼文件包括至少一個(gè)第三代碼片段,第三代碼片段包括的代碼行數(shù)為n,確定第二代碼片段,包括:根據(jù)每個(gè)代碼文中包括的至少一個(gè)第三代碼片段確定每個(gè)開(kāi)源代碼文件各自對(duì)應(yīng)的文件哈希值;根據(jù)每個(gè)開(kāi)源代碼文件中的每個(gè)第三代碼片段和每個(gè)開(kāi)源代碼文件各自對(duì)應(yīng)的文件哈希值,確定第一映射關(guān)系,第一映射關(guān)系為第三代碼片段與文件哈希值之間的映射關(guān)系,其中,文件哈希值為第三代碼片段屬于的開(kāi)源代碼文件對(duì)應(yīng)的文件哈希值;根據(jù)每個(gè)第三代碼片段包括的n行代碼確定每個(gè)第三代碼片段各自對(duì)應(yīng)的片段哈希值;根據(jù)第一映射關(guān)系以及每個(gè)第三代碼片段各自對(duì)應(yīng)的片段哈希值,確定第二映射關(guān)系,第二映射關(guān)系為每個(gè)第三代碼片段各自對(duì)應(yīng)的片段哈希值與文件哈希值之間的映射關(guān)系;根據(jù)第二映射關(guān)系,確定相同的片段哈希值對(duì)應(yīng)的不同的文件哈希值的數(shù)量為第一數(shù)量;確定第三映射關(guān)系,第三映射關(guān)系為開(kāi)源代碼文件與所屬的開(kāi)源代碼倉(cāng)庫(kù)之間的映射關(guān)系;根據(jù)第三映射關(guān)系,確定第一數(shù)量中的不同的文件哈希值中的每個(gè)文件哈希值對(duì)應(yīng)的開(kāi)源代碼文件所屬的不同開(kāi)源代碼倉(cāng)庫(kù)的數(shù)量為第二數(shù)量;在第一數(shù)量大于或者等于第一閾值,和/或,第二數(shù)量大于或者等于第二閾值的情況下,將相同的片段哈希值對(duì)應(yīng)的第三代碼片段確定為第二代碼片段,其中,第一閾值和第二閾值均為大于或者等于2的整數(shù)。
17、基于上述技術(shù)方案,本技術(shù)中通過(guò)計(jì)算開(kāi)源代碼文件對(duì)應(yīng)的文件哈希值以及代碼片段對(duì)應(yīng)的片段哈希值的方式,可以確定出相同的代碼片段出現(xiàn)在多個(gè)開(kāi)源代碼文件中,并且基于開(kāi)源代碼文件和所屬的開(kāi)源代碼倉(cāng)庫(kù)之間映射關(guān)系確定出該開(kāi)源代碼文件出現(xiàn)在多個(gè)開(kāi)源代碼倉(cāng)庫(kù)中,從而可以快速的確定出開(kāi)源代碼中的某個(gè)代碼片段是否為公共代碼。
18、在一種可能的實(shí)現(xiàn)方式中,該方法還包括:根據(jù)文件哈希值和第一信息,確定第四映射關(guān)系,第四映射關(guān)系為文件哈希值與所述第一信息之間的映射關(guān)系,其中,第一信息包括開(kāi)源代碼文件的文件名稱和/或開(kāi)源代碼文件的文件許可證的類型;根據(jù)第四映射關(guān)系,確定第一數(shù)量中的不同的文件哈希值中的每個(gè)文件哈希值對(duì)應(yīng)的開(kāi)源代碼文件的不同文件名稱的數(shù)量為第三數(shù)量,和/或,根據(jù)第四映射關(guān)系,確定第一數(shù)量中的不同的文件哈希值中的每個(gè)文件哈希值對(duì)應(yīng)的開(kāi)源代碼文件的不同類型的文件許可證的數(shù)量為第四數(shù)量;在第一數(shù)量大于或者等于第一閾值,和/或,第二數(shù)量大于或者等于第二閾值的情況下,將相同的片段哈希值對(duì)應(yīng)的第三代碼片段確定為所述第二代碼片段,包括:在第一數(shù)量大于或者等于第一閾值,并且,第二數(shù)量大于或者等于第二閾值,以及第三數(shù)量大于或者等于第三閾值,和/或,第四數(shù)量大于或者等于第四閾值的情況下,將相同的片段哈希值對(duì)應(yīng)的第三代碼片段確定為第二代碼片段,其中,第三閾值和第四閾值均為大于或者等于2的整數(shù)。
19、基于上述技術(shù)方案,本技術(shù)中還可以進(jìn)一步通過(guò)判斷開(kāi)源代碼文件在不同開(kāi)源代碼倉(cāng)庫(kù)中的文件名稱的數(shù)量以及文件許可證類型的數(shù)量,從而使得最終篩選的公共代碼更為準(zhǔn)確。
20、在一種可能的實(shí)現(xiàn)方式中,該方法還包括:根據(jù)第一代碼片段中包括的n行代碼,確定第一代碼片段對(duì)應(yīng)的片段哈希值;若公共代碼數(shù)據(jù)庫(kù)中包括第一代碼片段,則確定用戶代碼文件中的第一代碼片段為公共代碼片段,包括:若公共代碼數(shù)據(jù)庫(kù)中包括的多個(gè)第二代碼片段各自對(duì)應(yīng)的片段哈希值包括第一代碼片段對(duì)應(yīng)的片段哈希值,則確定第一代碼片段為公共代碼片段。
21、第二方面,本技術(shù)提出了一種計(jì)算設(shè)備,該計(jì)算設(shè)備用于執(zhí)行上述第一方面方法。具體地,該設(shè)備可以包括用于執(zhí)行本技術(shù)提出一種代碼檢測(cè)分析方法的單元和/或模塊,如收發(fā)單元和/或處理單元。例如,本技術(shù)中,該計(jì)算設(shè)備可以應(yīng)用于云管理平臺(tái)。或者,例如,該計(jì)算設(shè)備為云管理平臺(tái)。
22、第三方面,本技術(shù)提供了一種計(jì)算設(shè)備,該設(shè)備包括:至少一個(gè)處理器,用于執(zhí)行存儲(chǔ)器存儲(chǔ)的計(jì)算機(jī)程序或指令,以執(zhí)行上述第一方面的方法。可選地,該設(shè)備還包括存儲(chǔ)器,用于存儲(chǔ)的計(jì)算機(jī)程序或指令。可選地,該設(shè)備還包括通信接口,處理器通過(guò)通信接口讀取存儲(chǔ)器存儲(chǔ)的計(jì)算機(jī)程序或指令。
23、在一種可能的實(shí)現(xiàn)方式中,該計(jì)算設(shè)備為用于芯片中實(shí)現(xiàn)上述第一方面的方法的功能的計(jì)算設(shè)備。
24、在另一種可能實(shí)現(xiàn)方式中,該計(jì)算設(shè)備為用于芯片中實(shí)現(xiàn)上述第一方面的方案的芯片、芯片系統(tǒng)或電路。
25、在一種實(shí)現(xiàn)方式中,該設(shè)備為用于芯片中實(shí)現(xiàn)上述第一方面方法功能的應(yīng)用于云管理平臺(tái)中的通信設(shè)備。或者,該設(shè)備為云管理平臺(tái)。
26、在另一種實(shí)現(xiàn)方式中,該設(shè)備為用于芯片中實(shí)現(xiàn)上述第一方面方面功能的應(yīng)用于云管理平臺(tái)中的芯片、芯片系統(tǒng)或電路。
27、第四方面,本技術(shù)提供一種處理器,包括:輸入電路、輸出電路和處理電路。所述處理電路用于通過(guò)所述輸入電路接收信號(hào),并通過(guò)所述輸出電路發(fā)射信號(hào),使得所述處理器執(zhí)行上述第一方面的方法。
28、在具體實(shí)現(xiàn)過(guò)程中,上述處理器可以為一個(gè)或多個(gè)芯片,輸入電路可以為輸入管腳,輸出電路可以為輸出管腳,處理電路可以為晶體管、門電路、觸發(fā)器和各種邏輯電路等。輸入電路所接收的輸入的信號(hào)可以是由例如但不限于收發(fā)器接收并輸入的,輸出電路所輸出的信號(hào)可以是例如但不限于輸出給發(fā)射器并由發(fā)射器發(fā)射的,且輸入電路和輸出電路可以是同一電路,該電路在不同的時(shí)刻分別用作輸入電路和輸出電路。本技術(shù)實(shí)施例對(duì)處理器及各種電路的具體實(shí)現(xiàn)方式不做限定。
29、對(duì)于處理器所涉及的發(fā)送和獲取/接收等操作,如果沒(méi)有特殊說(shuō)明,或者,如果未與其在相關(guān)描述中的實(shí)際作用或者內(nèi)在邏輯相抵觸,則可以理解為處理器輸出和接收、輸入等操作,也可以理解為由射頻電路和天線所進(jìn)行的發(fā)送和接收操作,本技術(shù)對(duì)此不做限定。
30、第五方面,提供了一種處理設(shè)備,包括處理器和存儲(chǔ)器。該處理器用于讀取存儲(chǔ)器中存儲(chǔ)的指令,并可通過(guò)收發(fā)器接收信號(hào),通過(guò)發(fā)射器發(fā)射信號(hào),以執(zhí)行上述第一方面的方法。
31、可選地,所述處理器為一個(gè)或多個(gè),所述存儲(chǔ)器為一個(gè)或多個(gè)。
32、可選地,所述存儲(chǔ)器可以與所述處理器集成在一起,或者所述存儲(chǔ)器與處理器分離設(shè)置。
33、在具體實(shí)現(xiàn)過(guò)程中,存儲(chǔ)器可以為非瞬時(shí)性(non-transitory)存儲(chǔ)器,例如只讀存儲(chǔ)器(read?only?memory,rom),其可以與處理器集成在同一塊芯片上,也可以分別設(shè)置在不同的芯片上,本技術(shù)實(shí)施例對(duì)存儲(chǔ)器的類型以及存儲(chǔ)器與處理器的設(shè)置方式不做限定。
34、應(yīng)理解,相關(guān)的數(shù)據(jù)交互過(guò)程例如發(fā)送指示信息可以為從處理器輸出指示信息的過(guò)程,接收能力信息可以為處理器接收輸入能力信息的過(guò)程。具體地,處理器輸出的數(shù)據(jù)可以輸出給發(fā)射器,處理器接收的輸入數(shù)據(jù)可以來(lái)自收發(fā)器。其中,發(fā)射器和收發(fā)器可以統(tǒng)稱為收發(fā)器。
35、上述第五方面中的處理設(shè)備可以是一個(gè)或多個(gè)芯片。該處理設(shè)備中的處理器可以通過(guò)硬件來(lái)實(shí)現(xiàn)也可以通過(guò)軟件來(lái)實(shí)現(xiàn)。當(dāng)通過(guò)硬件實(shí)現(xiàn)時(shí),該處理器可以是邏輯電路、集成電路等;當(dāng)通過(guò)軟件來(lái)實(shí)現(xiàn)時(shí),該處理器可以是一個(gè)通用處理器,通過(guò)讀取存儲(chǔ)器中存儲(chǔ)的軟件代碼來(lái)實(shí)現(xiàn),該存儲(chǔ)器可以集成在處理器中,可以位于該處理器之外,獨(dú)立存在。
36、第六方面,提供了一種計(jì)算集群,包括至少一個(gè)計(jì)算設(shè)備,每個(gè)計(jì)算設(shè)備包括處理器和存儲(chǔ)器;所述至少一個(gè)計(jì)算設(shè)備的處理器用于執(zhí)行所述至少一個(gè)計(jì)算設(shè)備的存儲(chǔ)器中存儲(chǔ)的指令,以使得所述計(jì)算設(shè)備集群執(zhí)行第一方面中任意一種可能的實(shí)現(xiàn)方式中所述的方法。
37、可選地,該處理器可以是通用處理器,可以通過(guò)硬件來(lái)實(shí)現(xiàn)也可以通過(guò)軟件來(lái)實(shí)現(xiàn)。當(dāng)通過(guò)硬件實(shí)現(xiàn)時(shí),該處理器可以是邏輯電路、集成電路等;當(dāng)通過(guò)軟件來(lái)實(shí)現(xiàn)時(shí),該處理器可以是一個(gè)通用處理器,通過(guò)讀取存儲(chǔ)器中存儲(chǔ)的軟件代碼來(lái)實(shí)現(xiàn),該存儲(chǔ)器可以集成在處理器中,可以位于該處理器之外,獨(dú)立存在。
38、第七方面,提供一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),該計(jì)算機(jī)可讀介質(zhì)存儲(chǔ)用于設(shè)備執(zhí)行的程序代碼,該程序代碼包括用于執(zhí)行上述第一方面的方法。
39、第八方面,提供一種包含指令的計(jì)算機(jī)程序產(chǎn)品,當(dāng)該計(jì)算機(jī)程序產(chǎn)品在計(jì)算機(jī)上運(yùn)行時(shí),使得計(jì)算機(jī)執(zhí)行上述第一方面的方法。
40、第九方面,提供一種芯片系統(tǒng),包括處理器,用于從存儲(chǔ)器中調(diào)用并運(yùn)行計(jì)算機(jī)程序,使得安裝有該芯片系統(tǒng)的設(shè)備執(zhí)行上述第一方面的方法。
41、第十方面,提供一種云服務(wù)系統(tǒng),該云服務(wù)系統(tǒng)中包括云管理平臺(tái),其中,該云管理平臺(tái)用于執(zhí)行上述第一方面中任一種可能的實(shí)現(xiàn)方式中的方法。