[C++] विकास के दौरान कोड दोहराव का पता कैसे लगा सकता है?


Answers

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

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

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

यह 150 KLOK कोड (रिक्त पंक्तियों और टिप्पणियों को उस नंबर में नहीं गिना जाता है) पर 2 सेकंड से भी कम समय में तेजी से चलाता है

डुप्लिकेटचेक। एक्सएमएल :

<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

हमारे पास काफी बड़े कोड बेस है, सी +4 के 400 किमी लोकल और कोड दोहराव, समस्या का कुछ है क्या कोई ऐसा टूल है जो प्रभावी ढंग से कोड के डुप्लिकेट ब्लॉक का पता लगा सकता है?

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

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

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




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




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

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

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




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

कभी-कभी यह एक अच्छी बात है, कभी-कभी यह नहीं है; यह बहुत अच्छा "स्तर" पर किया गया है, तो यह विकास का समय कम कर सकता है; अर्थात् इतना कोड को रिएक्टर करने का प्रयास करते हुए, आप अपना लक्ष्य ढील (और संभवत: अपने मील के पत्थर और कार्यक्रमों को बास्ट कर सकते हैं)

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

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




ठीक है, आप प्रत्येक रात अपने स्रोत कोड आधार पर एक क्लोन डिटेक्टर चला सकते हैं।

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

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

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

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

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

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

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