2012-02-10 69 views
3

我試圖對抄襲做一些算法比較。我發現很多TEXT比較剽竊。如何混淆C++變量和函數

但是在算法中它是非常不同的。假設某些算法使用了大量的變量,函數和用戶定義的結構。如果有人從別人那裏複製源代碼,他至少會改變變量和函數名稱。通過簡單的文本比較算法,函數和變量字母之間的這種差異將被視爲「差異」,從而使算法爲抄襲提供「假」。

我想要做的是在C++源代碼中「泛化」(我不知道這是否是正確的詞)所有變量,函數和用戶定義的結構名稱。所以這些變量將被命名爲「a」,「b」,對於函數「... fa(...)」,「... fb(...)」也是如此。 我有PHP中的字符串變量的C++源碼算法進行比較。

我知道應該對許多其他事情進行分析以獲得準確的源代碼比較,但這對我來說就足夠了。

回答

1

這是一個有趣的問題。然而,取決於算法的複雜程度,可能是變量名稱會導致剽竊。例如,您可以真正編碼樹遍歷的方法有多少種?

我認爲幾年前有一篇文章通過他們的風格來識別編碼器 - 查看所有的小東西,比如空白,其中放置了{}等。誰知道,但也許這是要走的路,看看對學生以前的風格進行否定匹配,而不是與已知來源的匹配。這樣說,學生在學習的早期階段不可能已經開發出非常個人化的編碼風格。

想一想 - 用什麼語言寫的例子?它可以編譯?如果編譯C然後對可執行文件進行二進制比較,那麼具有不同局部變量名稱的相同程序是否具有完全相同的二進制文件? (雖然全球變量和函數不會)。

+0

我也想給在換行符一些額外的重要性, 「;」後面的換行符,以及大括號的位置。我知道某些類型的算法很難以某種「不同的方式」製作,例如在一些簡單的初始示例中,「2個值的總和」。 但全文比較也是一個問題。 而且由於它在Web主機上運行,​​我無法編譯代碼。 – IPValverde 2012-02-10 12:01:06

0

我以前用過MOSS:http://theory.stanford.edu/~aiken/moss/來檢測剽竊的代碼。由於它在語義層面上工作,因此它將檢測您在上面顯示的情況。該工具是語言感知的,所以在分析中不考慮註釋,並且在通過簡單的搜索和替換變量和/或函數名稱來檢測已被修改的代碼方面有很長的路要走。

注意:幾年前,當我在研究生院教授計算機科學時,我使用了該工具,它在檢測從互聯網上跳出的代碼時非常有效。這是一個證據充分的考慮類似的應用:http://fie2012.org/sites/fie2012.org/history/fie99/papers/1110.pdf

如果谷歌「測量軟件相似性」,你應該多找幾個有用的結果:http://www.ics.heacademy.ac.uk/resources/assessment/plagiarism/detectiontools_sourcecode.html