सारांश :
C में एक फ़ंक्शन को हमेशा यह सुनिश्चित करने के लिए जांचना चाहिए कि यह एक NULLपॉइंटर को डीरफेरिंग नहीं कर रहा है ? यदि नहीं, तो इन जाँचों को कब छोड़ना उचित है?
विवरण :
मैं प्रोग्रामिंग साक्षात्कार के बारे में कुछ किताबें पढ़ रहा हूं और मैं सोच रहा हूं कि सी में फ़ंक्शन तर्कों के लिए इनपुट सत्यापन की उपयुक्त डिग्री क्या है? जाहिर है कि उपयोगकर्ता से इनपुट लेने वाले किसी भी फ़ंक्शन को सत्यापन करने की आवश्यकता होती है, जिसमें NULLइसे डीरफेर करने से पहले एक पॉइंटर की जांच करना शामिल है। लेकिन उसी फ़ाइल के भीतर एक फ़ंक्शन के मामले में क्या है जो आप अपने एपीआई के माध्यम से उजागर करने की उम्मीद नहीं करते हैं?
उदाहरण के लिए git के स्रोत कोड में निम्नलिखित प्रकट होता है:
static unsigned short graph_get_current_column_color(const struct git_graph *graph)
{
if (!want_color(graph->revs->diffopt.use_color))
return column_colors_max;
return graph->default_column_color;
}
अगर *graphहै NULLतो एक अशक्त सूचक dereferenced किया जाएगा, शायद कार्यक्रम दुर्घटनाग्रस्त, लेकिन संभवतः कुछ अन्य अप्रत्याशित व्यवहार में जिसके परिणामस्वरूप। दूसरी ओर फ़ंक्शन है staticऔर इसलिए शायद प्रोग्रामर ने पहले से ही इनपुट को मान्य किया है। मुझे नहीं पता, मैंने इसे यादृच्छिक रूप से चुना क्योंकि यह सी में लिखे गए एक एप्लिकेशन प्रोग्राम में एक छोटा उदाहरण था। मैंने कई अन्य स्थानों पर देखा है, जहां NULL की जाँच किए बिना पॉइंटर्स का उपयोग किया जाता है। मेरा प्रश्न इस कोड सेगमेंट के लिए सामान्य नहीं है।
मैंने अपवाद स्वरूप सौंपने के संदर्भ में एक समान प्रश्न पूछा । हालांकि, सी या सी ++ जैसी असुरक्षित भाषा के लिए, बिना किसी अपवाद के कोई स्वचालित त्रुटि प्रसार नहीं है।
दूसरी ओर मैंने ओपन सोर्स प्रोजेक्ट्स (जैसे ऊपर उदाहरण) में बहुत सारे कोड देखे हैं, जो उन्हें इस्तेमाल करने वाले पॉइंटर्स का कोई चेक नहीं करता है। मैं सोच रहा था कि किसी को दिशा-निर्देशों पर विचार करना है कि किसी फ़ंक्शन में चेक कब डालना है या यह मानकर कि फ़ंक्शन को सही तर्क के साथ कहा गया था।
मैं उत्पादन कोड लिखने के लिए सामान्य रूप से इस सवाल में दिलचस्पी लेता हूं। लेकिन मुझे इंटरव्यू प्रोग्रामिंग इंटरव्यू के संदर्भ में भी है। उदाहरण के लिए कई एल्गोरिथ्म पाठ्यपुस्तकें (जैसे सीएलआर) एल्गोरिदम को बिना किसी त्रुटि जाँच के छद्मकोश में प्रस्तुत करने की प्रवृत्ति रखते हैं। हालांकि, जबकि यह एक एल्गोरिथ्म के मूल को समझने के लिए अच्छा है, यह स्पष्ट रूप से एक अच्छा प्रोग्रामिंग अभ्यास नहीं है। इसलिए मैं एक साक्षात्कारकर्ता को यह बताना नहीं चाहूंगा कि मैं अपने कोड उदाहरणों को सरल बनाने के लिए त्रुटि की जाँच कर रहा था (जैसा कि एक पाठ्यपुस्तक हो सकती है)। लेकिन मैं भी अत्यधिक त्रुटि जाँच के साथ अक्षम कोड का उत्पादन करना नहीं चाहता हूँ। उदाहरण के लिए, अशक्त के graph_get_current_column_colorलिए जाँच करने के *graphलिए संशोधित किया जा सकता था, लेकिन यह स्पष्ट नहीं है कि यदि *graphयह अशक्त होगा, तो इसके अलावा यह इसे नहीं करना चाहिए।