2008-10-15 7 views
11

मैं एक बुरा टाइपो है कि मेरे समय और अपने साथी के समय बर्बाद, यह कुछ इस तरह था:सी कोड में मूर्खतापूर्ण गलतियों को पकड़ने के लिए कोई उपकरण?

सभी की
for (i = 0; i < blah; i++); // <- I had a semi-colon here, that's the bug! 
{ 
    // Some awesome logic here 
} 

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

+3

के लिए एक और अच्छा स्थिर विश्लेषण उपकरण है। पहली मूर्खतापूर्ण गलती को पकड़ने के बाद, वे एक और नहीं बनाते हैं! – Danimal

+0

आह, अर्धविराम समस्या एक पुनरावर्ती समस्या है। एक अतिरिक्त, एक लापता एक; इससे कोई फ़र्क नहीं पड़ता। वे सभी एक ही दर्द-में-गधे खोज की ओर ले जाते हैं जो हमेशा के लिए लेता है और परिणाम "दोह!" और एक सिर थप्पड़। मैं अभी भी इसे एक बार में हर बार है। –

+0

आप प्लेटफ़ॉर्म निर्दिष्ट करना चाहेंगे। सभी प्लेटफॉर्म पर सभी टूल्स अपरिवर्तित नहीं होंगे। –

उत्तर

15

हां, PC-Lint शायद सबसे अच्छा उपकरण उपलब्ध है।

+1

लेकिन अगर कोडबेस किसी भी प्रकार का आकार है और पहले से ही लिंट नहीं किया गया है तो चेतावनियों के * बहुत * के लिए तैयार रहें। –

+1

कई चेतावनियों के बारे में सच है - लेकिन वे सभी अलग-अलग कॉन्फ़िगर करने योग्य हैं। तो आप जिस चीज की जरूरत है उसे बंद कर सकते हैं। –

+0

मुझे पीसी-लिंट की चेतावनियां गूढ़ और अस्पष्ट होने के लिए मिलती हैं। –

3

मैं splint और gdb के बारे में सीखकर शुरू करूंगा। यदि आपको अधिक उन्नत की आवश्यकता है, तो इन दो उपकरणों पर निर्माण करें। लेकिन वे एक अच्छी शुरुआत कर रहे हैं।

7

Lykathea's PC-Lint suggestion के अतिरिक्त, यदि आप कंपाइलर के चेतावनी स्तर को टक्कर देते हैं तो आप बेहतर (या कम से कम अधिक) निदान भी प्राप्त कर सकते हैं। /W4 या -Wall

हालांकि मुझे यकीन नहीं है कि आपकी विशेष समस्या इस के साथ पकड़ी गई होगी (एमएस वीसी इसे सभी चेतावनियों के साथ भी ध्वजांकित नहीं लग रहा है)। मुझे लगता है कि ऐसा इसलिए है क्योंकि यह लूप नियंत्रण अभिव्यक्तियों के साइड इफेक्ट्स के रूप में कार्य किए जाने पर for लूप खाली होने के लिए असामान्य मुहावरे नहीं है।

0

ग्रहण की तरह कोई भी अच्छा जीयूआई प्रोग्रामिंग वातावरण ("आईडीई" - एकीकृत विकास पर्यावरण) इस तरह के मामले में चेतावनी उत्पन्न करेगा।

4
कुछ बातें है कि मुझे अतीत में बचाया है, मेरे सिर के ऊपर से

:

  • अगर उपयोग (3 == bla) के बजाय (bla == 3), क्योंकि अगर आप गलत वर्तनी और प्रकार (3 = bla) संकलक शिकायत करेंगे।

  • सभी चेतावनियों स्विच का उपयोग करें। आपके कंपाइलर को आपको खाली बयान के बारे में चेतावनी देना चाहिए।

  • दावे का उपयोग करें जब आप रक्षात्मक रूप से प्रोग्राम कर सकते हैं। अपने कार्यक्रम को जल्दी विफल करने में अच्छा प्रयास करें, आप उस तरह की कमजोरियों को देखेंगे।

  • कंपाइलर या ओएस के किसी भी सुरक्षा उपायों को रोकने की कोशिश न करें। वे आपके प्रोग्रामिंग की आसानी के लिए भी हैं।

+3

मैं '(CONST == var) 'सम्मेलन को नापसंद करता हूं। यह कोड को बहुत कम पठनीय बनाता है। एक स्थिर विश्लेषण उपकरण यह सुनिश्चित करेगा कि आप कभी भी '(var = CONST)' टाइप न करें। –

-1

How to Shoot Yourself In the Foot के इस (पुराने) संस्करण में, तथा संपूर्ण वेब पर कई अन्य संस्करणों में, सी हमेशा भाषा है कि सबसे सरल प्रक्रिया के लिए अनुमति देता है। सी में प्रोग्रामिंग करते समय, आपको इसे याद रखना होगा और सावधान रहना होगा। अगर आप सुरक्षा चाहते हैं, तो दूसरी भाषा चुनें।

यह कहानियां attributed Bjarne Stroustrup (C++) में स्वयं है। करने के लिए (गलत) बोली:

+1

मैंने जो उद्धरण सुना है वह था "सी पैर में खुद को शूट करना आसान बनाता है, लेकिन सी ++ के साथ यह आपके पूरे पैर को उड़ाता है" –

+0

स्टीवन ए लोवे, आप सही हैं - स्ट्राउस्ट्रप लिंक देखें। यही कारण है कि मैंने लिखा "(गलत) उद्धरण"। – gimel

0

एक अच्छा वाक्य रचना हाइलाइटर यह अधिक दिखाई तरह कुछ मामलों कर देगा "सी आसान पैर में अपने आप को शूट करने के लिए बनाता है"।

+0

या जीएनयू इंडेंट जैसे सुधारक। – reinierpost

2

जीसीसी में अधिकांश कार्यक्षमता है जो लिंट ने warning flags के माध्यम से बनाया है।

+0

मत भूलना -ओ 2। –

0

मैं यह सुझाव दूंगा कि आपके पास enforce MISRA standards की क्षमता है या नहीं। वे महान विचार और कई नियमों के साथ लिखे गए थे जो जांचने के लिए एक कंपाइलर के लिए सरल हैं। उदाहरण के लिए, मेरे द्वारा उपयोग किए जाने वाले नियमों के लिए सभी एनओपी कमांडों की अपनी लाइन की आवश्यकता होती है। इसका मतलब है कि जब आप एक डालते हैं; लूप स्टेटमेंट के अंत में यह एक त्रुटि के माध्यम से कहता है कि यह अपनी लाइन पर नहीं है।

0

QA·C को देखो हम यहाँ एक बेसबॉल के बल्ले का उपयोग कर के साथ बड़ी सफलता मिली है सी

संबंधित मुद्दे