มีเครื่องมือในการกำหนดรหัสที่คล้ายคลึงกันหรือไม่ [ปิด]


37

ฉันไม่ได้พูดถึงเครื่องมือต่าง ๆ ฉันต้องการตรวจสอบว่าโครงการมีรหัสที่อาจได้รับ "refactored" จากโครงการอื่นหรือไม่ อาจเป็นไปได้ว่าชื่อฟังก์ชันชื่อตัวแปรและอะไรที่จะเปลี่ยนไป เงื่อนไขอาจถูกย้อนกลับเป็นต้น


5
สำหรับชั้นเรียนหรือบางอย่าง?
TheLQ

1
@TheLQ - ฉันสามารถนึกถึงกรณีมากกว่าหนึ่งกรณีนอกห้องเรียนซึ่งฉันไปล่าสัตว์เพื่อดูว่า "การตัดและแปะถูกนำมาใช้ใหม่ใช่มั้ย?" กองพลน้อยได้ผ่านไปแล้ว
MIA

อย่าลืมเกี่ยวกับสตีฟสมิ ธAtomiq
Jim G.

ความคิดเห็นและข้อความที่ส่งออก (เช่นข้อผิดพลาด ฯลฯ ) มักจะมีรหัสลายนิ้วมือดีกว่ารหัสจริง
Bork Blatt

พวกเขาข่มขู่เราด้วยสิ่งนี้ที่ Uni มันน่าสนใจที่จะดูว่าเครื่องมือดังกล่าวมีอยู่จริงหรือไม่
Jake

คำตอบ:


10

เมื่อฉันสอนวิศวกรรมซอฟต์แวร์ฉันใช้บริการ (ฟรี) ที่Stanford ชื่อ MOSS (Measure of Software คล้ายคลึง) สิ่งนี้ทำให้ฉันสามารถตรวจจับการลอกเลียนแบบระหว่างโครงงานของนักเรียนได้อย่างง่ายดาย ระบบอนุญาตให้ฉันป้อนตัวอย่างรหัส "รู้จักดี" ที่ฉันใช้ในระหว่างชั้นเรียนที่จะถูกละเว้น

สิ่งที่ยอดเยี่ยม (ปัญหาด้านข้างอย่างสมบูรณ์) เกี่ยวกับผลลัพธ์ที่กลับมาคือเราสามารถบอกได้ว่านักเรียนคนไหนทำงานร่วมกันแม้ว่าพวกเขาจะไม่คัดลอกรหัสโจ๋งครึ่มพวกเขาพูดถึงปัญหามากพอที่รหัสของพวกเขาคล้ายกัน ส่วนที่น่าเศร้าคือการหานักเรียนแปลก ๆ ที่ไม่มีความคล้ายคลึงกับรหัสอื่นใด พวกเขามักจะทำไม่ดี


ขอบคุณฉันกำลังมองหาบางสิ่งบางอย่างเหมือนกัน :) ว่า
อู Dangel

8

คุณอาจใช้เครื่องมือ PMDเพื่อค้นหาสิ่งที่คุณต้องการ มันมีไว้เพื่อตรวจจับการตัดและวางในฐานรหัส แต่ถ้าคุณรวมแหล่งที่มาของโครงการที่น่าสงสัยมันอาจช่วยให้คุณเห็นว่าคัดลอกรหัสจากที่ใด


อ๋อ - เราใช้ CPD จาก PMD ในรหัสของเรา
JoseK

แต่ PMD สำหรับ Java เท่านั้นใช่มั้ย
Janusz Lenar

5

สิ่งที่ใกล้เคียงที่สุดที่ฉันรู้ว่าสิ่งที่คุณกำลังมองหาคือนักสืบโคลน มันเป็นปลั๊กอิน Visual Studio

Clone Detective เป็นการรวมเข้าด้วยกันของ Visual Studio ที่ช่วยให้คุณสามารถวิเคราะห์โครงการ C # สำหรับซอร์สโค้ดที่ทำซ้ำที่อื่น การมีรายการที่ซ้ำกันสามารถนำไปสู่ความไม่สอดคล้องกันได้ง่ายและมักจะเป็นตัวบ่งชี้สำหรับรหัสที่ไม่ดี


4

ดูเหมือนคุณต้องการที่จะคำนวณความแตกต่างระหว่างต้นไม้สองต้นไวยากรณ์นามธรรม (AST) ดังนั้นคุณอาจจะสนใจในเครื่องมือที่สมาร์ท Differencer

ที่พบในhttps://stackoverflow.com/questions/974855/eclipse-abstract-syntax-tree-diff


(ขอบคุณสำหรับคำชมจากเครื่องมือของฉัน) SmartDifferencer ค้นหาความแตกต่างระหว่างไฟล์คู่หนึ่ง ความคล้ายคลึงกันเป็นส่วนเติมเต็มของความแตกต่างดังนั้นฉันจึงเห็นด้วยว่ามันเป็นความคิดที่ถูกต้อง แต่คุณต้องระบุคู่ของไฟล์ที่จะให้มันและมันก็เจ็บปวดถ้าระบบของคุณประกอบด้วยไฟล์จำนวนมาก สิ่งที่จำเป็นจริงๆคือเติมเต็ม: ค้นหาความคล้ายคลึงกันและทำได้โดยไม่ต้องระบุคู่ของไฟล์เป็นการส่วนตัว ดู CloneDR ของฉันตอบในหัวข้อเดียวกันนี้สำหรับเครื่องมือดังกล่าว ใช่มันใช้เทคโนโลยีที่เกี่ยวข้อง
Ira Baxter

1

แม้ว่าคุณจะไม่ได้พูดถึงเครื่องมือต่าง ๆ คุณก็ยังสามารถใช้เครื่องมือนี้ได้ในระดับหนึ่งอย่างน้อยที่สุด ถ้าฉันเห็นโค้ดสองส่วนที่มีลักษณะคล้ายกันฉันมักจะวางทั้งสองอย่างใน BeyondCompare เพื่อดูว่ามันทำงานได้มากแค่ไหนเพื่อทำให้มันง่ายขึ้นโดยปรับโครงสร้างการทำงานทั่วไปออก

ในทางกลับกันถ้าคุณไม่รู้ว่ารหัสที่คล้ายกันอยู่ที่ไหน แต่คุณแค่สงสัยว่ามีบางที่อยู่ที่ไหน ... คุณกำลังมองหาอะไรอยู่? เครื่องมืออัตโนมัติในการตรวจจับการลอกเลียนแบบ? ฉันไม่แน่ใจว่ามีสิ่งใดเกิดขึ้น


ถ้าเป็นเช่นนั้น SCO อาจชนะ IBM :-)

1

นี้บทความเกี่ยวกับวิกิพีเดียในเรื่องนี้ยังรวมถึงการเชื่อมโยงไปเครื่องมือต่างๆที่สามารถใช้ในการค้นหารหัสที่คล้ายกันหรือที่ซ้ำกัน เรามีเครื่องมือภายในสำหรับสิ่งนี้ดังนั้นฉันไม่คุ้นเคยกับเครื่องมือภายนอกที่กล่าวถึงในบทความ


1

สิ่งที่คุณต้องการทำคือดูว่ามีการโคลนรหัส (คัดลอก) ในทั้งสองโครงการหรือไม่ (ทั้งสองโครงการประกอบด้วยไฟล์ชุดใหญ่) คุณสามารถทำได้โดยใช้เครื่องมือตรวจจับโคลน Wikipediaแสดงรายการที่หลากหลาย

ในการตัดสินใจอย่างถี่ถ้วนหากมีการคัดลอกจำนวนมากคุณจะต้องจับคู่บรรทัดซอร์สและมีเครื่องตรวจจับโคลนบรรทัดซอร์สที่แน่นอนออกมามากมาย ฉันเชื่อว่า PMD เป็นหนึ่งในนั้น สิ่งเหล่านี้จะไม่ทำคือค้นหารหัสที่คัดลอกวางแก้ไข พวกเขาจะพบรหัสที่คัดลอกวางไม่เปลี่ยนแปลงสำเร็จรูปซึ่งมีอยู่ทั่วสิ่งที่คัดลอกผ่านแก้ไข

หากคุณต้องการดูรายละเอียดของการคัดลอกสำหรับรหัสคัดลอกที่ผ่านมาแก้ไขคุณต้องมีเครื่องตรวจจับโคลนที่พบว่า "พารามิเตอร์" โคลน เครื่องตรวจจับที่ใช้ Token ทำสิ่งนี้เพื่อแก้ไขซึ่งแทนที่เพียงชื่อตัวแปรหรือค่าคงที่

Abstract-syntax tree (AST) เครื่องตรวจจับทำสิ่งนี้สำหรับการแก้ไขที่เกี่ยวข้องกับกลุ่มก้อนขนาดใหญ่เช่นนิพจน์คำสั่งการแทรกการลบเป็นต้น หลังเหล่านี้มีแนวโน้มที่จะให้คำตอบที่ดีกว่าเพราะต่างจากเครื่องตรวจจับโทเค็นพวกเขาสามารถใช้โครงสร้างภาษาของซอร์สโค้ดคอมพิวเตอร์เป็นแนวทาง

เครื่องมือCloneDRของเราเป็นเครื่องตรวจจับ

ฉันไม่รู้เครื่องมือที่จะพบรหัส "ที่เทียบเท่า" (เงื่อนไขที่ตรงกันข้าม) ฯลฯ นักวิจัยได้สร้างเครื่องตรวจจับโคลนที่ทำสิ่งนี้ แต่ combinatorics ทำให้ราคาแพงมากในการดำเนินการและต้นแบบการวิจัยปรับขนาดได้ไม่ดี


1

ฉันชอบวิธีที่CCFinderXมองเห็นความเหมือนกันดังนั้นคุณอาจต้องการตรวจสอบสิ่งนั้นด้วย รองรับภาษาได้ไม่กี่ภาษามันฟรีและง่ายต่อการติดตั้ง (Python 2.6)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.