2008-10-31 15 views

उत्तर

34

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

मान लें कि आपने एक ऐसा फ़ंक्शन लिखा है जो एक पॉइंटर को तर्क के रूप में लेता है। एक अच्छा मौका है कि आपका कोड यह मान लेगा कि पॉइंटर गैर-नल है, तो स्पष्ट रूप से किसी दावे के साथ जांच क्यों न करें?

#include <assert.h> 

void function(int* pointer_arg) 
{ 
    assert(pointer_arg != NULL); 

    ... 
} 

नोट करने के लिए एक महत्वपूर्ण बात यह है कि भाव तो आपको यह स्पष्ट दुष्प्रभाव हो नहीं करना चाहिए, क्योंकि वे रिलीज निर्माण में मौजूद नहीं होगा: यहाँ कैसे। तो इस तरह कुछ ऐसा न करें:

assert(a++ == 5); 

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

assert((a == 5) && "a has the wrong value!!"); 
+0

मैंने पहले एक स्ट्रिंग के साथ एंडिंग नहीं देखा है। असली उपयोगी! –

+0

उस प्रकार की चाल (या एक समान भिन्नता) का प्रयोग पर्ल-भूमि में हर समय किया जाता है, अर्थात्, उदाहरण के प्रयोग से: a == 5 || मरें ("एक गलत मूल्य है"); ढीले बूलियन टाइपिंग के लिए Hurray। –

+0

रिलीज कोड में मानों को मान्य करते समय, इस स्ट्रिंग की लाइनों के साथ एक और चाल है, लेकिन डीबग कोड में जोर दे रही है। उदाहरण के लिए, पहले (x> 10) जांच का उपयोग करें, और फिर यदि गलत स्थिति गुजरती है, तो बस (! "X सीमाओं से बाहर") पर जोर दें और फिर लॉगफाइल पर प्रिंट करें, आदि – Marcin

6

दावा बूलियन अभिव्यक्तियां हैं जो आम तौर पर हमेशा सत्य होना चाहिए।

उनका उपयोग यह सुनिश्चित करने के लिए किया जाता है कि आप क्या उम्मीद करते हैं।

void some_function(int age) 
{ 
    assert(age > 0); 
} 

आप उम्र से निपटने के लिए, आप भी 'पता' पक्का आप हमेशा समझदार तर्क गुजर रहे हैं, तो आप एक ज़ोर का उपयोग समारोह लिखा था। यह कहने जैसा है "मुझे पता है कि यह कभी गलत नहीं हो सकता है, लेकिन अगर ऐसा होता है, तो मैं जानना चाहता हूं", क्योंकि, ठीक है, हर कोई गलती करता है।

तो समझदार उपयोगकर्ता इनपुट की जांच नहीं करना है, अगर परिदृश्य है जहां कुछ गलत हो सकता है, तो एक जोर का उपयोग न करें। असली जांच करें और त्रुटियों से निपटें।

आवेषण आमतौर पर केवल डीबग बिल्ड के लिए होते हैं, इसलिए आवेषण में साइड इफेक्ट्स के साथ कोड न डालें।

1

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

0

यहाँ एक अभिकथन है और here कुछ नमूना कोड है की एक definition है। संक्षेप में, एक धारणा किसी डेवलपर के किसी भी बिंदु पर कोड की स्थिति के बारे में उसकी (या उसकी) धारणाओं का परीक्षण करने का एक तरीका है। उदाहरण के लिए, आप निम्न कोड कर रहे थे, तो: - कि mypointer कॉल करने से पहले शून्य कभी नहीं होगा

mypointer->myfunct(); 

आप शायद कि mypointer बात पर जोर देना चाहते हैं शून्य क्योंकि है कि आपके धारणा है नहीं है।

2

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

6

आमतौर पर इनपुट मानकों और रिटर्न परिणामों के संदर्भ में डिज़ाइन धारणाओं को सत्यापित करने के लिए सम्मिलन का उपयोग किया जाता है। उदाहरण के लिए

// Given customer and product details for a sale, generate an invoice 

Invoice ProcessOrder(Customer Cust,Product Prod) 
{ 
    assert(IsValid(Cust)); 
    assert(IsValid(Prod); 
' 
' 
' 
    assert(IsValid(RetInvoice)) 
    return(RetInvoice); 

} 

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

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

extern void _my_assert(void *, void *, unsigned); 

#define myassert(exp)        \ 
{             \ 
    if (InDiagnostics)        \ 
     if (!(exp))        \ 
      _my_assert(#exp, __FILE__, __LINE__); \ 
}             \ 

इस तकनीक में एक छोटा सा क्रम भूमि के ऊपर नहीं है, लेकिन यह किसी भी कीड़े है कि यह क्षेत्र में बहुत आसान बना दिया है पर नज़र रखने में आता है।

3

"नहीं हो सकता" स्थितियों की जांच के लिए दावाों का उपयोग करें।

विशिष्ट उपयोग: फ़ंक्शन के शीर्ष पर अमान्य/असंभव तर्कों के विरुद्ध जांचें।

शायद ही कभी देखा गया, लेकिन अभी भी उपयोगी: लूप इनवेरिएंट्स और पोस्टकंडिशन।

1

यह ज़ोर सुविधा है जो जल्दी सी दिनों से हमारे लिए नीचे आ गया है पता नहीं है, लेकिन आप भी Boost StaticAssert कार्यक्षमता के बारे में पता होना चाहिए, घटना में है कि अपनी परियोजनाओं को बूस्ट का उपयोग कर सकता है।

मानक सी/सी ++ जोर रनटाइम के दौरान काम करता है। बूस्ट स्टेटिकएस्र्ट सुविधा आपको संकलन समय पर कुछ वर्गों के दावे करने, तर्क त्रुटियों को पकड़ने और पहले की तरह भी करने में सक्षम बनाता है।

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