ฉันไม่ได้พูดถึงเครื่องมือต่าง ๆ ฉันต้องการตรวจสอบว่าโครงการมีรหัสที่อาจได้รับ "refactored" จากโครงการอื่นหรือไม่ อาจเป็นไปได้ว่าชื่อฟังก์ชันชื่อตัวแปรและอะไรที่จะเปลี่ยนไป เงื่อนไขอาจถูกย้อนกลับเป็นต้น
ฉันไม่ได้พูดถึงเครื่องมือต่าง ๆ ฉันต้องการตรวจสอบว่าโครงการมีรหัสที่อาจได้รับ "refactored" จากโครงการอื่นหรือไม่ อาจเป็นไปได้ว่าชื่อฟังก์ชันชื่อตัวแปรและอะไรที่จะเปลี่ยนไป เงื่อนไขอาจถูกย้อนกลับเป็นต้น
คำตอบ:
เมื่อฉันสอนวิศวกรรมซอฟต์แวร์ฉันใช้บริการ (ฟรี) ที่Stanford ชื่อ MOSS (Measure of Software คล้ายคลึง) สิ่งนี้ทำให้ฉันสามารถตรวจจับการลอกเลียนแบบระหว่างโครงงานของนักเรียนได้อย่างง่ายดาย ระบบอนุญาตให้ฉันป้อนตัวอย่างรหัส "รู้จักดี" ที่ฉันใช้ในระหว่างชั้นเรียนที่จะถูกละเว้น
สิ่งที่ยอดเยี่ยม (ปัญหาด้านข้างอย่างสมบูรณ์) เกี่ยวกับผลลัพธ์ที่กลับมาคือเราสามารถบอกได้ว่านักเรียนคนไหนทำงานร่วมกันแม้ว่าพวกเขาจะไม่คัดลอกรหัสโจ๋งครึ่มพวกเขาพูดถึงปัญหามากพอที่รหัสของพวกเขาคล้ายกัน ส่วนที่น่าเศร้าคือการหานักเรียนแปลก ๆ ที่ไม่มีความคล้ายคลึงกับรหัสอื่นใด พวกเขามักจะทำไม่ดี
คุณอาจใช้เครื่องมือ PMDเพื่อค้นหาสิ่งที่คุณต้องการ มันมีไว้เพื่อตรวจจับการตัดและวางในฐานรหัส แต่ถ้าคุณรวมแหล่งที่มาของโครงการที่น่าสงสัยมันอาจช่วยให้คุณเห็นว่าคัดลอกรหัสจากที่ใด
สิ่งที่ใกล้เคียงที่สุดที่ฉันรู้ว่าสิ่งที่คุณกำลังมองหาคือนักสืบโคลน มันเป็นปลั๊กอิน Visual Studio
Clone Detective เป็นการรวมเข้าด้วยกันของ Visual Studio ที่ช่วยให้คุณสามารถวิเคราะห์โครงการ C # สำหรับซอร์สโค้ดที่ทำซ้ำที่อื่น การมีรายการที่ซ้ำกันสามารถนำไปสู่ความไม่สอดคล้องกันได้ง่ายและมักจะเป็นตัวบ่งชี้สำหรับรหัสที่ไม่ดี
ดูเหมือนคุณต้องการที่จะคำนวณความแตกต่างระหว่างต้นไม้สองต้นไวยากรณ์นามธรรม (AST) ดังนั้นคุณอาจจะสนใจในเครื่องมือที่สมาร์ท Differencer
ที่พบในhttps://stackoverflow.com/questions/974855/eclipse-abstract-syntax-tree-diff
แม้ว่าคุณจะไม่ได้พูดถึงเครื่องมือต่าง ๆ คุณก็ยังสามารถใช้เครื่องมือนี้ได้ในระดับหนึ่งอย่างน้อยที่สุด ถ้าฉันเห็นโค้ดสองส่วนที่มีลักษณะคล้ายกันฉันมักจะวางทั้งสองอย่างใน BeyondCompare เพื่อดูว่ามันทำงานได้มากแค่ไหนเพื่อทำให้มันง่ายขึ้นโดยปรับโครงสร้างการทำงานทั่วไปออก
ในทางกลับกันถ้าคุณไม่รู้ว่ารหัสที่คล้ายกันอยู่ที่ไหน แต่คุณแค่สงสัยว่ามีบางที่อยู่ที่ไหน ... คุณกำลังมองหาอะไรอยู่? เครื่องมืออัตโนมัติในการตรวจจับการลอกเลียนแบบ? ฉันไม่แน่ใจว่ามีสิ่งใดเกิดขึ้น
นี้บทความเกี่ยวกับวิกิพีเดียในเรื่องนี้ยังรวมถึงการเชื่อมโยงไปเครื่องมือต่างๆที่สามารถใช้ในการค้นหารหัสที่คล้ายกันหรือที่ซ้ำกัน เรามีเครื่องมือภายในสำหรับสิ่งนี้ดังนั้นฉันไม่คุ้นเคยกับเครื่องมือภายนอกที่กล่าวถึงในบทความ
สิ่งที่คุณต้องการทำคือดูว่ามีการโคลนรหัส (คัดลอก) ในทั้งสองโครงการหรือไม่ (ทั้งสองโครงการประกอบด้วยไฟล์ชุดใหญ่) คุณสามารถทำได้โดยใช้เครื่องมือตรวจจับโคลน Wikipediaแสดงรายการที่หลากหลาย
ในการตัดสินใจอย่างถี่ถ้วนหากมีการคัดลอกจำนวนมากคุณจะต้องจับคู่บรรทัดซอร์สและมีเครื่องตรวจจับโคลนบรรทัดซอร์สที่แน่นอนออกมามากมาย ฉันเชื่อว่า PMD เป็นหนึ่งในนั้น สิ่งเหล่านี้จะไม่ทำคือค้นหารหัสที่คัดลอกวางแก้ไข พวกเขาจะพบรหัสที่คัดลอกวางไม่เปลี่ยนแปลงสำเร็จรูปซึ่งมีอยู่ทั่วสิ่งที่คัดลอกผ่านแก้ไข
หากคุณต้องการดูรายละเอียดของการคัดลอกสำหรับรหัสคัดลอกที่ผ่านมาแก้ไขคุณต้องมีเครื่องตรวจจับโคลนที่พบว่า "พารามิเตอร์" โคลน เครื่องตรวจจับที่ใช้ Token ทำสิ่งนี้เพื่อแก้ไขซึ่งแทนที่เพียงชื่อตัวแปรหรือค่าคงที่
Abstract-syntax tree (AST) เครื่องตรวจจับทำสิ่งนี้สำหรับการแก้ไขที่เกี่ยวข้องกับกลุ่มก้อนขนาดใหญ่เช่นนิพจน์คำสั่งการแทรกการลบเป็นต้น หลังเหล่านี้มีแนวโน้มที่จะให้คำตอบที่ดีกว่าเพราะต่างจากเครื่องตรวจจับโทเค็นพวกเขาสามารถใช้โครงสร้างภาษาของซอร์สโค้ดคอมพิวเตอร์เป็นแนวทาง
เครื่องมือCloneDRของเราเป็นเครื่องตรวจจับ
ฉันไม่รู้เครื่องมือที่จะพบรหัส "ที่เทียบเท่า" (เงื่อนไขที่ตรงกันข้าม) ฯลฯ นักวิจัยได้สร้างเครื่องตรวจจับโคลนที่ทำสิ่งนี้ แต่ combinatorics ทำให้ราคาแพงมากในการดำเนินการและต้นแบบการวิจัยปรับขนาดได้ไม่ดี
ฉันชอบวิธีที่CCFinderXมองเห็นความเหมือนกันดังนั้นคุณอาจต้องการตรวจสอบสิ่งนั้นด้วย รองรับภาษาได้ไม่กี่ภาษามันฟรีและง่ายต่อการติดตั้ง (Python 2.6)