摘要:它在實踐中被成功地用于檢測學生程序提交中的剽竊行為。這項措施應該反映原始程序中由比賽覆蓋的部分代幣。這個程序集根本不包含任何剽竊行為,因此將其命名為。在節目集中有個抄襲對。
摘要:JPlag是一個Web服務,可以在給定的集合中找到類似的程序對的程序。它在實踐中被成功地用于檢測學生Java程序提交中的剽竊行為。能支持的語言除了java之外,還有C、C++和Scheme。我們描述Jpalg架構和jplag的比較算法,這個算法是基于名為“Greedy String Tiling”的已知算法。那么,這篇論文的貢獻主要有三個方面:首先,對JPlag在幾個不同的集合上的表現進行評估的Java程序,證明抄襲很難通過JPlag的檢查。再一次測試中,在我們的各種基準程序集中,77個剽竊者中有90%以上被可靠檢測到,其他人中的大多數都會引起懷疑。運行時間僅為幾百秒,用于提交每個100個程序的100個程序。其次,參數研究表明,該方法在配置參數方面相當穩健。第三,我們研究了用于偽裝抄襲的種類,頻率和成功的種類。
關鍵詞:剽竊,相似性,搜索,令牌,字符串拼貼
類別:GT算法,GT性能,F.2.2。 模式匹配,H.3.3,H.5.2。,
I.5.4。 文本處理,K.3.m.,K.5.1
檢測類似的程序
1.所有要比較的程序都被解析(或根據輸入進行掃描)
語言)并轉換為令牌字符串。
2.將這些標記字符串成對比較以確定相似性
每一對。
將程序轉換為令牌字符串的前端過程是JPlag中唯一依賴于語言的過程。 目前存在三種前端實現:Java和Scheme的實現都是實現完整的解析器。 C ++(或C)的第三個前端只包含一個掃描器。
作為一項規則,應該選擇令牌,以便表征程序結構的本質(剽竊者難以改變),而不是表面方面。 JPlag忽略空白,注釋和標識符的名稱。 此外,JPlag在可能的情況下將語義信息放入令牌中,以減少純粹偶然發生的虛假子串匹配。 例如,在Java中,我們使用Begin Method標記而不是僅僅一個Open Brace標記。 基于解析器的前端在這方面更勝一籌。 有關Java示例,請參見表1。 請參閱第4節以了解標記化方法的基本原理。
我們在第3.4節中的評估表明,JPlag對令牌集的更改非常有效
Greedy-String-Tiling(String A, String B) { tiles = {}; do { maxmatch = M; matches = {}; Forall unmarked tokens Aa in A { Forall unmarked tokens Bb in B { j = 0; while (Aa+j == Bb+j && unmarked(Aa+j) && unmarked(Bb+j)) j + +; if (j == maxmatch) matches = matches ⊕ match(a, b, j); else if (j > maxmatch) { matches = {match(a, b, j)}; maxmatch = j; } } } Forall match(a, b, maxmatch) ∈ matches { For j = 0 ...(maxmatch ? 1) { mark(Aa+j); mark(Bb+j ); } tiles = tiles ∪ match(a, b, maxmatch); } } while (maxmatch > M); return tiles; }
表2:“貪婪字符串拼貼”算法[Wise,1993]。 第12行中的⊕運算符在匹配集合中添加匹配項,當且僅當它與集合中已有的匹配項之一不重疊時。 三重匹配(a,b,l)表示A和B的相同子串之間的關聯,分別從位置Aa和Bb開始,長度為1。
用于比較兩個標記字符串的算法本質上是“貪婪字符串拼貼”[Wise,1993]。 比較兩個字符串A和B時,目標是找到一組具有以下屬性的連續子字符串:每個子字符串都出現在A和B中,盡可能長并且不涵蓋已由其他某個其他字符覆蓋的標記子。 為了避免虛假匹配,強制執行最小匹配長度M.
最小匹配長度M被強制執行?!柏澙纷址促N”是一種啟發式算法,因為保證找到的一組子字符串的最大值會使搜索過于昂貴。 這里是粗略的草圖(參見表2的偽代碼)。 該算法重復以下兩個步驟:
步驟1(第5-18行):搜索兩個字符串以查找最大的連續匹配。 從概念上講,這是通過3個嵌套循環完成的:第一個循環遍歷A中的所有標記,第二個將當前標記與B中的每個標記進行比較。如果它們相同,則最內部循環搜索Prechelt L.,Malpohl G.,Philippsen M .: Finding Plagiarisms ... 1021比賽結束。 這些嵌套循環收集所有最長的公共子串集合
步驟2(第19-25行):標記步驟1中發現的所有最大長度的非重疊匹配。這意味著它們的所有標記都被標記,因此可能不會用于后續迭代步驟1中的進一步匹配。 在Wise的術語中,通過標記所有的標記,匹配成為一個貼圖。
重復這兩個步驟直到找不到進一步的匹配。 由于在每一步中標記了更多的標記,所以算法總是終止。 它返回我們需要計算相似性度量的瓦片列表。 這項措施應該反映原始程序中由比賽覆蓋的部分代幣。 我們將其定義為sim(A,B)= 2·coverage(tiles)/(| A | + | B |)其中coverage(tiles)=? 匹配(a,b,長度)∈tiles長度。
這種啟發式算法的運行時復雜度仍然相當高。 在最壞的情況下,所有三個嵌套循環都會執行到最大限度。 盡管在后面的迭代中匹配長度遞減,但如果在每次迭代中只標記一個最短的可設想的匹配,則這可能導致與Θ((| A | + | B |)3)一樣大的步驟, 最后涵蓋了字符串[Wise,1993; Prechelt等,2000]。 在最好的情況下,根本不存在來自A的單個令牌,并且搜索需要Θ((| A | + | B |)2)個步驟。
2.2.3 Wise和JPlag的運行時間優化盡管最壞情況下的復雜度不能降低,但通過應用Karp-Rabin模式匹配算法[Karp and Rabin,1987]的想法,實際情況下的平均復雜度可以提高到幾乎Θ(| A | + | B |。
通過使用哈希函數來處理更長的字符串(“文本”T)。 為此,所有長度為| P |的子串的哈希值 在T中計算。 這可以通過使用能夠根據h(Tt-1Tt ... Tt + | P | -1)的值計算h(TtTt + 1..Tt + | P | -1)的值的散列函數h以線性時間完成。 -2),Tt-1和Tt + | P | -1。 然后將所有散列值與P的值進行比較。如果兩個值相同,則進行字符對比以驗證T中P的出現已被找到。 這種算法在實踐中的復雜性幾乎是線性的。
我們修改Wise的貪婪字符串拼貼以下列方式應用Karp-Rabin匹配的基本思想:
1.對于時間Θ(| A | + | B |)中的所有長度為s的子串計算散列值。 JPlag使用s = M,Wise的算法如下所述調整s。
2.然后將來自A的每個散列值與來自B的每個散列值進行比較。如果兩個值相同,則通過用令牌比較子串標記來驗證匹配。 然后該算法試圖將匹配盡可能地擴展到散列函數覆蓋的范圍之外。
3.使用散列表來定位來自B的具有與來自A的給定子字符串相同的散列值的子字符串。
這個算法的最壞情況下的復雜度仍然是Θ((| A | + | B |)3),因為所有的子字符串都可能必須通過令牌比較令牌,但實際上復雜度遠低于Θ((| A | + | B |)2)通常被觀察到。
JPlag預先執行所有散列計算(兩個字符串的散列值加上字符串B的散列表),即在平鋪過程之前僅進行一次散列計算。 當找到匹配并且標記了一個貼圖時,靜態哈希表中的相應條目不再適用于后續迭代。 由于JPlag離開表中的受影響條目,所以驗證子步驟(上面的編號2)變得稍微復雜一些。
相比之下,Wise會在每次迭代中重新計算所有散列值和散列表,以便找到的任何匹配都是有效的。
在這兩種方法中,我們發現靜態預計算加上稍微更昂貴的有效性檢查對于JPlag的默認參數和典型的標記字符串來說更快。
在本節中,我們將研究JPlag的歧視性能及其對程序結構的敏感性,剽竊頻率以及JPlag算法的自由參數。 我們提出一個基于多套真實學生課程加上一些明確制作的剽竊的實證研究。
3.1設置我們的研究本節介紹了一組程序,用于量化結果的標準以及評估中考慮的自由參數集。
3.1.1使用的原始程序集:簡單,堅硬,干凈,大我們在研究中使用了四種不同的程序作為基準。 其中三門是來自第二學期信息學課程的編程練習,第四門是從一門研究生高級程序設計課程,向有經驗的學生介紹Java和AWT。 有關概述,請參閱表3,現在忽略最右邊的兩列
“簡單”:最大化流量。 用于計算通過具有容量加權邊的有向圖的最大流量的算法。 該程序基于一個不包含在此處調查的源中的可重用GraphSearch類。 該程序集在程序長度和結構上顯示出相當大的變化性。 平均長度為236個非空的非注釋行代碼(LOC)。 它包括2個剽竊他人的程序(即4個程序構成2個抄襲對)。 我們通過對所有程序進行仔細的手動比較來確定這個程序集和其他程序集內的抄襲對,即我們應用了人類審查人員可以做的最好的檢查。 由于這些程序存在相當大的結構變化,我們認為這個程序為JPlag設置了一個相對簡單的任務,因此該程序的名稱為Simple。
“硬”:乘法排列。 將兩個置換表示為置換矩陣,由整數數組實現,指示每行的1的位置。 這是一個非常短的程序(平均長度43 LOC),具有相當固定的結構。 我們可能期望即使是獨立編寫的程序看起來也非常相似。 因此,這個程序集對于JPlag來說是一個非常嚴格的測試,因此將被命名為Hard。 在節目集中有12個節目形成6個抄襲對。
e命名為Hard。 在節目集中有12個節目形成6個抄襲對。 “清潔”:k-均值。 一維k均值聚類程序,使用絕對距離作為距離函數,并在數據范圍內以等距方式進行初始化。 平均節目長度是118 LOC。 這個程序集根本不包含任何剽竊行為,因此將其命名為Clean。
“大”:跳箱。 一個簡單的圖形游戲,玩家必須將鼠標移動到屏幕上跳轉的方塊。 這套節目平均時間最長,也是節目設計中最大的節目; 平均節目長度是263 LOC。 在節目集中有4個抄襲對。 它還包含另外兩個具有很多相似性的對,但我們不認為它們是實際的剽竊。 其中之一,這兩個程序員顯然在早期階段一起工作,但后來獨立完成了他們的程序。 另一方面,這兩個程序共享一個共同的分數作為基礎,并從早期的AWT編程練習中獲得。
3.1.2人工程序集:Hard.P,Large.P等為了更仔細地調查JPlag的行為,我們的程序集中的實際剽竊數量不足。 因此,我們通過在網站上公開發布“尋求剽竊”并通過電子郵件收集意見書來收集進一步的剽竊。 回答我們的電話的學生和其他程序員從我們的網頁下載了一個源程序,對其進行了修改并將其發回。 他們被告知要像一個剽竊并試圖欺騙剽竊檢測計劃的學生行事,特別是不要花費過多的時間。 中間80%的剽竊者最終使用了7到40分鐘的自我報告時間。
對于發布的12個原始程序(從硬件程序集6和大型程序集6中隨機選擇)中的每一個,我們因此收集了14個剽竊版本,導致多達105個額外的抄襲對?;谶@些額外的剽竊,我們為JPlag的評估形成了額外的程序集(請參閱表3):
Hard.all基于Hard和其他一系列剽竊行為的結合
收集它。
Hard.P基于Hard.all,但僅包含所有這些程序
也存在抄襲(原創或收集)。在這個程序集中,一個很大的
所有節目對中的一小部分是抄襲對。
Large.all和Large.P是基于Large和
為此收集了更多的剽竊品。
請注意,為了簡潔,Hard.all和Large.all將在3.2和3.3節中分別討論,但包含在3.4和3.5節中,其中我們還使用了Hard.all中的兩個較高抄襲內容的較小子集和另外兩個來自Large.all
3.1.3評估標準,定義JPlag可以被視為一個具有固定查詢的信息檢索系統:給定一組程序對,檢索所有那些是剽竊的對,但沒有其他的。 對于這樣的操作模式,我們只需要通過應用截止閾值將每對產生的相似度值轉化為是/否決策:具有高于閾值的相似度的所有對將被認為是抄襲對。
為了表征JPlag輸出的正確性,我們可以使用通用信息檢索質量度量“精度”(P)和“回憶”(R)。 這些措施的定義如下。 假設我們有一組n個節目,其中p = n·(n-1)/ 2對,這些對中的g是抄襲對,即一個節目從另一個抄襲或者兩個抄襲都是(直接或間接)抄襲 一些共同的祖先也是程序集的一部分。
現在假設JPlag返回f個標記為剽竊對的程序對。 如果這些對中的t是真正的抄襲對,而其他的f - t不是,那么我們將精確度和回憶定義為P:= 100·t / f和R:= 100·t / g,即精度是 實際抄襲對和召回標記對的百分比是實際標記的所有抄襲對的百分比。
此外,我們將100·g / p定義為剽竊內容,即所有抄襲對的分數(見表3的“%”欄)。
3.1.4其他參數在研究中有所不同如第2.2節所述,JPlag算法中有兩個自由參數:最小匹配長度M和使用的令牌集。 這兩種情況在我們的研究中也有所不同。
默認標記集“normal”包含描述主要程序結構(變量聲明,類/方法的開始/結束等)和控制流(返回,中斷,繼續,拋出,if,while,等等的開始/結束)的標記。 ),加上2個令牌(分配)和方法調用(應用)。 它忽略了表達式(操作符,操作數)內的所有結構以及方法的標識等。除了默認的標記集,我們還使用了一個相當小的標記集(稱為“struc”),其中只包含與控制流和程序塊結構相關的標記 但不包括變量聲明)。 此外,我們使用了包含所有可能令牌的最大令牌集(稱為“滿”)。
我們使用了最小匹配長度3,4,5,7,9,11,14,17,20,25,30和40. 9是默認值。
為簡要總結JPlag的性能,我們將首先報告使用標準參數(最小匹配長度9,正常標記集)和50%截止閾值時我們每個數據集的精度和召回率的值。 摘要顯示在表3最右邊的兩列中。
正如我們所看到的,JPlag的性能對于簡單,清潔和大型來說是完美的; 對于我們四個真實世界的數據集中有三個我們不但無一例外地獲得所有的抄襲對,而且輸出也完全沒有非抄襲對
對于困難的數據集Hard,我們錯過了6個抄襲對中的2個(R = 0.67),并錯誤地檢索了7個非抄襲對以及4個正確的抄襲對。 不完全召回當然可以通過降低截止門限來改善,但這也會導致更多不正確的輸出。 這個折衷將在3.3節中分析。
具有高剽竊密度的人造數據集的結果也非常好:JPlag檢測到兩種病例(Large.P和Large.all)中所有剽竊對的92%,另外兩種(Hard.P 和Hard.all),除一個案例(Hard.all)外,結果完全沒有虛假輸出。
鑒于我們在第4節中介紹的程序設計者嘗試的各種偽裝嘗試,這些結果相當令人印象深刻。
3.3相似度值的分布; 精確/回憶權衡理想情況下,JPlag會報告任何非抄襲對的0%和任何抄襲對的100%的相似度。 但實際上,這種區別幾乎沒有那么清楚。 因此,為了判斷先前顯示的結果的穩健性,我們現在回顧JPlag為抄襲對產生的相似性值的分布,并將其與非抄襲對的分布進行比較。 如果兩個分布重疊,則一個或多個節目對將被錯誤地判斷
簡單:“最大化流量”程序。 我們的第一個例子是程序集Simple。 結果顯示在圖2中。該程序集導致總共378個程序對,其中只有2個是實際的抄襲對。 圖的上半部分顯示了376個非抄襲對的相似度值分布,即2個抄襲對的底部。
JPlag在相當廣泛的截止門檻范圍內將剽竊與其他節目完美區分開來。 圖3的左側部分顯示了當我們逐漸增加截止閾值時回想如何改變:只有在相當高的截止閾值時,我們才會錯過任何剽竊行為。 精確度和召回率之間的折中結果顯示在圖的右側。 我們總是至少有完美的精確度或完美的召回率,對于適當選擇的截止閾值,我們甚至可以同時得到兩者,即曲線到達曲線的右上角(100/100,理想點)。
總結起來,JPlag的行為對于這個程序集是完美的。
硬:“多重排列”計劃。 請記住,該算法的簡單性表明了一個有點規范的程序結構。 因此我們可以期望這個程序對JPlag來說是一個非常困難的測試。
硬:“多重排列”計劃。請記住,該算法的簡單性表明了一個有點規范的程序結構。因此我們可以期望這個程序對JPlag來說是一個非常困難的測試。圖4確實表明Hard程序集的行為不太理想:相似性值分布有相當多的重疊。讓我們首先考慮一下,注意在絕對數量中,剽竊對的分布幾乎可以忽略不計,因為剽竊的內容只有0.3%。盡管存在困難,但非剽竊的相似度值的分布幾乎與Simple相同。另一方面,除了一個例外,Hard中的6個抄襲對僅表現出中等相似度,即使對于人類觀察者也是如此??纯丛闯绦颍覀兊玫搅诉@樣的印象,即學生們大部分都在一起工作,但無論如何都可能獨立完成他們的程序。但是,鑒于節目規模較小,無法確定。所以人們可以說,這些根本不是剽竊。但是為了得到一種最壞的情況分析,讓我們假設這6對確實都是真正的剽竊。然后,精度/回憶權衡是遠遠不理想的(參見圖5底部),但中等截斷閾值仍然導致合理的妥協,如前所述回收67例。
3.4令牌集合和最小匹配長度的影響
到目前為止所有的數據都使用了JPlag的默認參數:“正?!睒擞浖蜆藴首钚∑ヅ溟L度為9.但是,我們也感興趣的是JPlag如何抵抗這些參數的變化以及這些變化如何與 程序集進行分析。 因此,下面介紹性能測量,我們將研究JPlag的性能如何針對不同的最小匹配長度,截止閾值,令牌集和程序集進行更改。
我們通過精確度和召回率的加權和來衡量JPlag的總抄襲鑒別性能。 我們選擇3的回憶(相對于精確度)的相對權重,因為懲罰假陰性(非檢測到的抄襲)遠遠大于誤報,這僅僅為人類用戶的最終判斷提供了更多的工作。 因此,績效指標變為P + 3R。 確切的值3并不重要,重量為2或4的結果將是相似的。
我們將在這里省略分析的大量細節,僅提供結果; 更多的細節可以在[Prechelt et al。,2000]中找到。 當分析使用“正?!睒擞浖虾徒刂归撝?0時最小匹配長度M與P + 3R量度之間的相關性時,我們做出以下觀察:
我們得出這樣的結論:JPlag對M的適度非最佳選擇是強有力的。
使用小型“struc”標記集的相同分析發現,由于標記字符串較短,較大??的M值不太可取。否則,結果與默認令牌集的結果非常相似。
最后,對于最大可能的令牌集,稱為“完整”,我們發現由于較長的令牌字符串,更大的M可能更容易被容忍,但適度的值仍然傾向于優越。否則,結果再次與缺省和縮減的標記集相似。
我們得出這樣的結論:JPlag對于不同的令牌集合的選擇是高度可靠的。這很有用,因為它表明JPlag對于許多其他編程語言也可以類似地工作,如果它們允許類似結構的標記集合。
此外,我們得出結論:默認的標記集合和默認的最小匹配長度9是JPlag針對各種程序集的合理和可靠的參數選擇。
3.5截止標準的影響通常,我們會看JPlag找到的最相似的一對節目,并分別為每一對節目決定它是否是抄襲對。 人們將以這種方式朝著較低的相似度值前進,直到人們確信發現了所有的剽竊行為。
然而,在某些情況下,基于相似性閾值的全自動決策是優選的:具有該相似性或更高相似性的對將被視為剽竊,而具有較低相似性的對將被視為獨立。 我們稱這樣一個標準為截止標準。 截止標準接收相似值的向量s作為輸入,并且如上所述計算截止閾值T.
為了在全自動模式下評估JPlag,我們使用了許多不同的截止標準。 它們中的大多數適應于正在調查的程序集的相似性分布。 從上面的討論中我們已經知道在30到60范圍內的截止閾值通常會產生最好的結果。 但是,目前還不清楚是否存在幾乎總是最佳的固定閾值。 考慮當前相似度分布的適應性標準可能會更成功。 這些是我們探索的截止標準:
脫粒。 截斷標準的threshT系列使用最簡單的方法:它根本不查看輸入矢量,而是應用固定的截止門限來做出決定。 我們已經使用了從30%到95%的各種閾值T,從而導致閾值thresh30到thresh95。
mplus。 mplusD家族的截止標準有點適應于系統中較高或較低的s相似度值。 它返回向量中相似值的中值(50%分位數,q50)加上距中值到100的距離的D百分比:T = q50(s)+ D / 100 *(100-q50(s))。 與固定閾值相比,這些標準可以適應不同的“基本相似性”; 他們認為中位數相似度代表了一個典型的非抄襲對,因為遠遠不到所有配對的一半都是抄襲對。 我們使用了mplus25,mplus50和mplus75。
qplus。 qplusD家族相當于mplusD家族,除了偏移量的起點是第三個四分位數:T = q75(s)+ D / 100 *(100-q75(s))。 這個想法是q75可能代表一個更大的意外相似的情況,所以即使是小的D值也不應該導致誤報。 我們使用了qplus25,qplus50和qplus75。
K均值。 kmeans截止標準使用一維k-均值聚類將矢量分成兩類。 具有較高相似性值的類將被視為抄襲對。
avginf。 avginf家族的截斷標準考慮具有大致相同的相似度值的對的信息內容。這里的想法是,剽竊行為應該是罕見的,因此表明剽竊行為的相似性值的范圍必須具有很高的信息含量(在信息理論意義上)。因此,我們選擇閾值T作為具有此相似度或更高相似度的對的平均信息內容Cv≥T至少比整體平均值C高百分之P的最小閾值。為此,avginf標準將相似度值組合成重疊寬度為5%的類:給定所有對的相似度值的向量s,令Sv為s的值為v ... v + 5的相似度集合。然后,每個這樣的對的信息內容為Cv:= - log2(| Sv | / | s |)和空類被定義為沒有信息內容,即,如果Sv = C,則Cv:= 0?;谶@些值Cv,可以確定閾值。我們使用了avginf050,avginf100,avginf200和avginf400。
圖9比較了截止標準的性能分布,基于性能測量P + 3R。 對于原始程序集,最好的標準是thresh50,thresh60,qplus50和mplus50。 他們對于P + 3R的中位數都是400(即至少有一半的結果是完美的),平均值約為330,第一個四分位數約為280.對于人工程序集,沒有一個標準能夠達到。 最好的是thresh40,qplus25和mplus25。 這是一個好消息:出于實際目的(剽竊數量通常很?。?,像閾值這樣簡單的規則似乎會產生最好的結果。
3.6 JPlag和MOSS的比較我們還通過MOSS [Aiken,1998]運行我們的基準程序集,對結果進行后處理,使用與JPlag相同的相似性度量,然后計算各種截止閾值的精度和召回率。 結果如表4所示。
表中的左邊部分假設了理想化的截止標準,在每種情況下都選擇最佳閾值。 請注意,MOSS通常會返回比JPlag相當低的相似值。 正如我們所看到的,就簡單,清潔和大型(或其變體)而言,MOSS的性能與JPlag基本相同。 唯一的區別是MOSS必須比JPlag更強烈地依賴于截斷閾值的可變性。
然而,對于Hard程序集的變體,JPlag顯然是優越的:對于Hard.P和Hard.all,JPlag以更好的精度實現相同的召回。 請注意,對于Hard.all,當t = 30時,JPlag達到P = 46,R = 88,但是這具有較低的P + 3R。 而且,對于原始程序集Hard,MOSS無法找到三分之一以上的抄襲對,即使使用最低截止閾值10時也是如此。
如果我們為每個系統選擇一個固定的閾值,就會出現類似的情況,如表格的右半部分所示:我們將JPlag的相似度降低了50%,MOSS降低了30%。 這些閾值是合理的,往往會平衡精確度和回憶。 結果表明,JPlag的精確度或召回率比MOSS差,但是其中很多情況下,MOSS明顯比JPlag更差 - 特別是對于hard程序集。 如前所述,沒有關于MOSS算法的書面描述。 因此,我們無法解釋結果.
如果我們為每個系統選擇一個固定的閾值,就會出現類似的情況,如表格的右半部分所示:我們將JPlag的相似度降低了50%,MOSS降低了30%。 這些閾值是合理的,往往會平衡精確度和回憶。 結果表明,JPlag的精確度或召回率比MOSS差,但是其中很多情況下,MOSS明顯比JPlag更差 - 特別是對于硬件程序集。 如前所述,沒有關于MOSS算法的書面描述。 因此,我們無法解釋結果
3.7運行時效率JPlag的運行時間隨著程序集中程序數量的增加而呈二次曲線增長,并且與程序的大小略微超線性。
但是,由此產生的運行時間通常很小。 我們最大的節目集Large.all包含99個節目,平均約250個LOC。 JPlag用于閱讀和解析這些程序以及執行所有配對比較的總運行時間是Pentium III上的掛鐘時間大約6秒
4成功和不成功的剽竊攻擊本節分析偽裝技術和我們在用于評估的計劃中看到的攻擊類型。 任何單一的攻擊事件最多都會導致我們稱之為JPlag的局部混亂。 考慮應用偽裝技術所需的最短代碼段。 如果JPlag沒有確定原始代碼段和攻擊結果之間的任何相似性,我們說JPlag在本地是混亂的。 局部混淆關鍵取決于所使用的令牌集和最小匹配長度。
例如,如果將單行代碼(或單個令牌)插入到最小匹配長度的代碼段中,可能會導致本地混淆。 插入后,JPlag通常不會再找到具有足夠的令牌來匹配的相應代碼段。 再舉一個例子,如果最小匹配長度的代碼段被分成兩部分然后交換,JPlag也被欺騙了。
除非程序非常短,否則在剽竊逃避檢測之前需要進行一些局部混淆(取決于截止標準)。 完美的攻擊將需要在原始代碼的每個片段中以最小匹配長度來實現局部混淆。 JPlag將會成功,除非剽竊者既富有創造性,足以發現足夠的偽裝技術,可以在整個給定的程序中應用(大多數技術只適用于某些情況),然后渴望足夠頻繁地應用它們。
4.1無效攻擊本節討論的攻擊根本不起作用,因為它們不會對JPlag生成并考慮的令牌列表進行任何修改。 幾乎每個剽竊者都至少使用過這些徒勞的偽裝技術之一。
通過改變換行符,空格和TAB來修改代碼格式[48 times3]
插入,修改或刪除評論[30次]
程序輸出或其格式的修改[33次,2次成功]在2個程序中,修改后的輸出格式導致額外的方法調用。
更改變量,方法或類的名稱[44次]
分割或合并變量聲明列表[6次]
修改器,如私人,最終等[6次]
常數值的修改[3次]
有些學生根本沒有試圖偽裝他們的作弊,并提交了相同的副本。 如果提交次數過大,無法手動比較所有數據并且沒有自動系統,則可能會發生這種“攻擊”。[4次]
正如我們從這個列表中看到的,JPlag對格式化,評論,文字和名稱的完全無知是其成功的關鍵。 為默認令牌集選擇的粗粒度(例如,忽略修飾符)也是有用的。
4.2對粒度敏感的攻擊粗略地說,Java類由方法和變量的聲明組成。 聲明的排序是無關緊要的。 因此,一個有前途的攻擊行是重新排序實現中的聲明。 但是,如果重新排序的代碼段長于最小匹配長度,則JPlag信號將阻止移動,而不是在本地混淆。 因此,這種攻擊的成功與否關鍵取決于其應用的粒度。
剽竊者經常使用這種類型的重新排序[55次]。 但是,他們中只有大約15%實際上混淆了JPlag。
在變量聲明塊內重新排序[25次,6次成功]
變量和方法聲明的全局重新排序[30次,3次成功]
4.3局部混淆攻擊以下類型的攻擊通常在本地成功,至少使用默認的令牌集。 在134次這些襲擊中,只有12次不成功。 然而,只有極少數的剽竊者在一個特定的程序中實現了如此之多的局部混淆以逃避被發現。
修改控制結構[35次,全部成功]
?用while循環代替for循環,反之亦然[8次] ?通過用主迭代變量[3次]表達它們來消除輔助指標變量 ?用無限循環代替常規循環[1次] ?用一系列if語句替換switch-statement [6次] ?為switch語句的每個case添加冗余break-statements [1次]
臨時變量和子表達式[28次,全部成功]
?將子表達式轉換為新的輔助變量[16次] ?反之亦然[7次] ?通過賦值列表替換數組初始值設定項[2次] ?從聲明中移除初始化[2次] ?用默認值[1次]顯式初始化
內聯和重構[20次,16次成功]
?內聯小方法[5次] ?將現有方法的部分重構為新方法[11次]
修改范圍[9次,全部成功]
?將合理性測試或試驗塊的開始/結束移向方法的開始和/或結束[3次] ?將臨時變量移動到周圍的塊中[3次] ?在內部塊中添加臨時變量的冗余聲明[1次] ?如果只有一個實例存在,則用實例變量替換類變量[2次]
重新排序基本塊內的獨立語句[8次,6次成功]
利用數學身份[5次,2次成功]
自愿引入程序缺陷[5次,3次成功] 3名剽竊者刪除代碼或添加其他語句。 兩次不成功的嘗試涉及修改后的常量。
修改數據結構[6次,5次成功]
?用char數組替換字符串[1次] ?用兩個多帶帶的int [1次]替換int [2] ?用數組替換幾個相同類型的變量[3次] ?提升整數[1次,不成功]
冗余[15次,14次成功]
?添加或刪除未使用的代碼[7次]
?使用完全限定的軟件包名稱[2次]
?插入虛擬方法的調用[1次]
?導入額外的軟件包和類[1次]
?將呼叫插入到Thread.yield()[1次]
?在void方法結束時插入return [1次]
?復制右側無副作用的賦值語句[1次]
?訪問實例變量時添加或刪除此事件[1次,不成功]作為對策措施,JPlag的默認令牌集將忽略此設置。
代碼結構重新設計[3次,全部成功]
?將狀態改變方法轉換為多帶帶的新類[2次] ?創建并返回一個新對象,而不是改變現有狀態[1次]
在這個列表中,最后三種類型的攻擊是非常聰明的,即使對于讀者來說也很難檢測:修改數據結構,添加或刪除冗余,或重新設計代碼結構。
5 Summary and conclusions我們使用4套真實Java程序和另外幾套包含額外剽竊的Java程序集對JPlag進行的實證評估可總結如下:
對于清楚剽竊的節目,即完全采用節目并進行修改以隱藏起源的節目,JPlag的結果幾乎完美 - 即使節目長度少于100行也是如此。
即使只有部分剽竊節目,就像我們的硬盤節目集合一樣,JPlag將指出相似之處,并且通常可以很好地區分它們與意外相似之處。
剽竊者從真實程序集中選擇的偽裝(如果有的話)對JPlag完全沒用。
即使是知情剽竊者選擇的攻擊在所有案例中的成功率都不到10%。 這些人知道他們必須欺騙一個程序,并沒有其他目標(除了只用一點時間來完成)。
對JPlag檢測的成功攻擊需要很多工作,或者會產生一個對任何人員檢查員來說都很荒謬的程序結構。
JPlag非常適合對其兩個自由參數,令牌集和最小匹配長度的非最優選擇。
給定JPlag計算的相似度值,一個固定的截止閾值就足以作為一種判別標準,它將剽竊的程序對與非剽竊的程序對分離,并且具有接近最佳的回憶率,但仍具有良好的精確度。
我們并不確切知道這些結果轉移到其他情況的程度。 它們可能適用于C和C ++的較小程度,因為這些語言目前尚未解析,但僅由JPlag掃描。 對于不同結構的(或更大的)程序,如果這些攻擊使某些攻擊更加有效,或者對于不同的攻擊者(如果那些攻擊者仍然使用不同的攻擊)
但是,總體而言,如果JPlag的有效性遠遠低于證明的效果,我們會感到驚訝。 看起來基于標記的字符串相似性方法對尋找剽竊非常有效,至少如果令牌字符串忽略了足夠的細節。 對于用Java,C,C ++和Scheme編寫的程序,JPlag是一種易于使用的實現方法.
原則上,JPlag也可以用于其他目的。 如果一家軟件公司懷疑競爭對手竊取了部分源代碼,那么在法院命令或雙方協議后JPlag可以比較兩個有問題的大型程序系統并指出類似的區域。 JPlag已經成功應用于這種情況下(其各方希望保持匿名).
通過指出不同的區域,而不是那些相似的區域,JPlag可以用作程序差異引擎(如Unix diff)。與基于字符的差異相比,JPlag差異忽略了很多細節,因此產生了更小的(盡管 也不太精確)的差異,這在某些情況下可能有用。
文獻名稱: Lutz Prechelt , Guido Malpohl , Michael Philippsen. Finding Plagiarisms among a Set of Programs with JPlag[J]
前端VUe代碼的github地址
后端地址SSM
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69552.html
摘要:宣布了,從年月份正式發布的開始,將把某些包含敏感內容的頁面標記為不安全。于是我嘗試把中文關鍵字改成全英關鍵字,找到許多相關的文章,再結合我那蹩腳的英文,還有很的總能找到答案。總之,不認識英文的軟件工程師都不會有很大進步吧。 Google宣布了,從2017年1月份正式發布的Chrome 56開始,Google將把某些包含敏感內容的https頁面標記為不安全。 為什么使用Cloudflar...
摘要:比如個推旗下的用戶畫像產品,能夠對用戶線上和線下行為進行大數據分析,幫助開發者和運營者構建全面精準多維的用戶畫像體系。 移動互聯網時代,精細化運營逐漸成為企業發展的重要競爭力,用戶畫像的概念也應運而生。用戶畫像是指,在大數據時代,企業通過對海量數據信息進行清洗、聚類、分析,將數據抽象成標簽,再利用這些標簽將用戶形象具體化的過程。用戶畫像的建立能夠幫助企業更好地為用戶提供針對性的服務。與...
摘要:當開始使用來提供真正的跨平臺應用時,他發現對的緊耦合的依賴性在用開發應用創建映射時呈現的問題。的重點放在高性能的渲染和執行上,你可以很輕松的創建高性能的跨平臺應用,這些應用可以在相同的代碼庫上運行并且隨意使用特點平臺的組件。 showImg(https://segmentfault.com/img/bVJi8d?w=980&h=400); 在開發階段,跨平臺開發App面臨一個很重要的決...
閱讀 1642·2021-09-22 15:21
閱讀 2861·2021-09-09 09:32
閱讀 2681·2021-09-02 09:52
閱讀 3299·2019-08-30 14:02
閱讀 2218·2019-08-26 13:25
閱讀 1447·2019-08-26 13:24
閱讀 1599·2019-08-26 10:31
閱讀 1553·2019-08-26 10:16