[c++] विकास के दौरान कोड डुप्लिकेशन का पता कैसे लगाएं?



Answers

मैंने पीएमडी की कॉपी-एंड-पेस्ट-डिटेक्टर का उपयोग किया है और इसे निम्न रैपर स्क्रिप्ट का उपयोग करके क्रूज़ कंट्रोल में एकीकृत किया है (क्लासपाथ में pmd जार होना सुनिश्चित करें)।

हमारा चेक रात में चलता है। यदि आप मौजूदा परिवर्तन सेट से केवल फाइलों को सूचीबद्ध करने के लिए आउटपुट को सीमित करना चाहते हैं तो आपको कुछ कस्टम प्रोग्रामिंग की आवश्यकता हो सकती है (विचार: सभी को जांचें और केवल डुप्लीकेट सूचीबद्ध करें जहां बदले गए फाइलों में से एक शामिल है। आपको सभी फाइलों को जांचना होगा क्योंकि एक बदलाव का उपयोग किया जा सकता है एक गैर-बदली गई फ़ाइल से कुछ कोड)। एक्सएमएल आउटपुट का उपयोग करके और परिणाम को पार्स करके कर योग्य होना चाहिए। जब यह किया जाता है तो उस स्क्रिप्ट को पोस्ट करना न भूलें;)

स्टार्टर्स के लिए "टेक्स्ट" आउटपुट ठीक होना चाहिए, लेकिन आप परिणामों को उपयोगकर्ता के अनुकूल तरीके से प्रदर्शित करना चाहते हैं, जिसके लिए मैं सीपीडी के "एक्सएमएल" आउटपुट से एचटीएमएल फाइलें उत्पन्न करने के लिए एक पर्ल स्क्रिप्ट का उपयोग करता हूं। वे उन्हें टॉमकैट पर पोस्ट करके सुलभ होते हैं जहां क्रूज़ की रिपोर्टिंग जेएसपी रहता है। डेवलपर्स उन्हें वहां से देख सकते हैं और अपने गंदे हैकिंग के परिणाम देख सकते हैं :)

यह 150 केएलओसी कोड (खाली लाइनों और टिप्पणियों में उस संख्या में गिना जाता है) पर 2 सेकंड से भी कम तेज़ चलता है।

duplicatecheck.xml :

<project name="duplicatecheck" default="cpd">

<property name="files.dir" value="dir containing your sources"/>
<property name="output.dir" value="dir containing results for publishing"/>

<target name="cpd">
    <taskdef name="cpd" classname="net.sourceforge.pmd.cpd.CPDTask"/>
    <cpd minimumTokenCount="100" 
         language="cpp" 
         outputFile="${output.dir}/duplicates.txt"
         ignoreLiterals="false"
         ignoreIdentifiers="false"
         format="text">
        <fileset dir="${files.dir}/">
            <include name="**/*.h"/>
            <include name="**/*.cpp"/>
                <!-- exclude third-party stuff -->
            <exclude name="boost/"/>
            <exclude name="cppunit/"/>
        </fileset>
    </cpd>
</target>

Question

हमारे पास काफी बड़ा कोड बेस है, सी ++ का 400 के एलओसी है, और कोड डुप्लिकेशन एक समस्या है। क्या कोई उपकरण है जो प्रभावी रूप से कोड के डुप्लिकेट ब्लॉक का पता लगा सकता है?

आदर्श रूप से यह ऐसा कुछ होगा जो डेवलपर्स विकास के दौरान कभी-कभी दौड़ने के बजाय उपयोग कर सकते हैं यह देखने के लिए कि समस्याएं कहां हैं। यह भी अच्छा होगा अगर हम प्रत्येक चेक के बाद रिपोर्ट देने के लिए क्रूज़ कंट्रोल के साथ इस तरह के एक उपकरण को एकीकृत कर सकते हैं।

मैंने कुछ समय पहले Duploc पर एक नज़र Duploc थी, यह एक अच्छा ग्राफ दिखाता था, लेकिन इसे इस्तेमाल करने के लिए एक छोटे से पर्यावरण की आवश्यकता होती है, जो इसे स्वचालित रूप से कठिन बना देती है।

नि: शुल्क उपकरण अच्छा होगा, लेकिन अगर कुछ अच्छे वाणिज्यिक उपकरण हैं तो मुझे भी दिलचस्पी होगी।




खैर, आप हर रात अपने स्रोत कोड बेस पर एक क्लोन डिटेक्टर चला सकते हैं।

कई क्लोन डिटेक्टर स्रोत लाइनों की तुलना करके काम करते हैं, और केवल सटीक डुप्लिकेट कोड ही प्राप्त कर सकते हैं।

उपरोक्त सीसीफ़िंडर भाषा टोकन की तुलना करके काम करता है, इसलिए यह सफेद अंतरिक्ष परिवर्तनों के प्रति संवेदनशील नहीं है। यह क्लोन का पता लगा सकता है जो मूल कोड के रूप हैं यदि केवल एकल टोकन में परिवर्तन होता है (उदाहरण के लिए, क्लोन में एक चर एक्स को वाई में बदलें)।

आदर्श रूप से आप जो चाहते हैं वह उपर्युक्त है, लेकिन क्लोन खोजने की क्षमता जहां विविधता को अपेक्षाकृत मनमानी होने की अनुमति है, उदाहरण के लिए, एक अभिव्यक्ति द्वारा एक चर को प्रतिस्थापित करें, ब्लॉक द्वारा एक कथन आदि।

हमारा क्लोनरोड क्लोन डिटेक्टर जावा, सी #, सी ++, कोबोल, वीबीनेट, वीबी 6, फोरट्रान और कई अन्य भाषाओं के लिए ऐसा करता है। इसे यहां देखा जा सकता है: http://www.semdesigns.com/Products/Clone/index.html

साथ ही साथ कई भाषाओं को संभालने में सक्षम होने के कारण, क्लोनरोड इंजन एएससीआईआई, आईएसओ -885 9 -1, यूटीएफ 8, यूटीएफ 16, ईबीसीडीआईसी, कई माइक्रोसॉफ्ट एन्कोडिंग और (जापानी) शिफ्ट- सहित विभिन्न इनपुट एन्कोडिंग शैलियों को संभालने में सक्षम है। JIS।

इस साइट में कई क्लोन डिटेक्शन रन उदाहरण रिपोर्ट हैं, जिनमें से एक सी ++ के लिए भी शामिल है।

फरवरी 2014 संपादित करें: अब सभी सी ++ 14 को संभालता है।




पीएमडी परियोजना को देखो।

मैंने कभी इसका इस्तेमाल नहीं किया है, लेकिन हमेशा यह करना चाहता था।




Simian भी है जो जावा, सी #, सी ++, सी, ऑब्जेक्टिव-सी, जावास्क्रिप्ट का समर्थन करता है ...

यह हडसन (सीपीडी की तरह) द्वारा समर्थित है।

जब तक आप एक ओपन सोर्स प्रोजेक्ट न हों, आपको सिमियन के लिए भुगतान करना होगा




"समान" कोड स्निपेट ढूंढना अपेक्षाकृत आसान है, मौजूदा उपकरण हैं जो पहले से ही ऐसा करते हैं (अन्य उत्तरों देखें)।

कभी-कभी यह अच्छी बात है, कभी-कभी यह नहीं होती है; अगर यह बहुत बढ़िया "स्तर" पर किया जाता है तो यह विकास के समय को कम कर सकता है; यानी इतना कोड दोबारा करने की कोशिश कर रहे हैं, आप अपना लक्ष्य खो देते हैं (और शायद अपने मील का पत्थर और शेड्यूल फेंक दें)।

एक ही बात करने वाले कई फ़ंक्शन / विधि को ढूंढना कठिन होता है लेकिन उचित दस्तावेज के बिना अलग-अलग (लेकिन समान) इनपुट और / या एल्गोरिदम के साथ।

यदि आपको एक ही चीज़ करने के लिए दो या अलग-अलग तरीके हैं और प्रोग्रामर एक उदाहरण को ठीक करने का प्रयास करता है लेकिन अन्य को ठीक करने के लिए भूल जाते हैं (या वे नहीं जानते हैं), तो आप अपने सॉफ़्टवेयर को जोखिम बढ़ाएंगे।




ConQAT एक शानदार उपकरण है जो सी ++ कोड विश्लेषण का समर्थन करता है। व्हाइटस्पेस को अनदेखा कर डुप्लिकेट पा सकते हैं। गहराई से गुई और कंसोल इंटरफेस है। इसकी लचीलापन के कारण इसे सेटअप करना आसान नहीं है। मुझे यह ब्लॉग पोस्ट सी ++ प्रोजेक्ट स्थापित करने के लिए बहुत उपयोगी पाया है।




Related