2010-04-23 15 views
13

हमें निम्नलिखित कार्यक्रम पर विचार करने देता है:क्रैश cmd लाइन आर्ग के साथ कार्यक्रम

#include <stdlib.h> 

int main(int argc, char **argv){ 
    int a,b; 

    if (argc != 3) 
     return -1; 

    a = atoi(argv[1]); 
    b = atoi(argv[2]); 

    a = b ? a/b : 0; 

    return a; 
} 

कार्य कमांड लाइन में तर्क प्रदान करके कार्यक्रम के क्रैश होने का है।

+1

@Stacker: कोई विचार नहीं, कुछ डिमेंटेड साक्षात्कार प्रश्न की तरह लगता है। – Quixotic

+0

मुझे लगता है कि संभव नहीं है ... – Kasturi

+2

क्या मुझे सही तरीके से जवाब देने पर कुकी मिलती है? अगर उन्होंने आपको एक साक्षात्कार में यह पूछा, तो आशा है कि वे आपको नौकरी न दें। अगर वे करते हैं, तो चलाएं। –

उत्तर

18

a प्लेटफ़ॉर्म के INT_MIN और b के रूप में -1 के रूप में पास करें। फिर आपको किसी भी दो की पूरक मशीन पर ओवरफ्लो त्रुटि मिलती है, हालांकि यह आवश्यक रूप से एक क्रैश नहीं है।

+0

मैं इस मुद्दे को एक साक्षात्कार में देखकर आश्चर्यचकित हूं जो सुरक्षा विशेषज्ञों के लिए नहीं है। लेकिन स्वीकार्य रूप से, मैं जावा और पायथन का उपयोग करता हूं जहां यह एक मुद्दा नहीं है। – Uri

5

इस प्रश्न का उत्तर है: यह निर्भर करता है।

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

कई विधियां हैं जिन्हें वैध रूप से उपयोग किया जा सकता है और उनमें से एक पुनरावर्ती है। आइए एक सेकंड के लिए मान लें कि इसे एक सिर रिकर्सिव एल्गोरिदम के रूप में लागू किया गया है जो ढेर के निर्माण को मजबूर करता है। इसके बाद मैं इस कार्यक्रम को लंबे समय तक पर्याप्त तर्क प्रदान करके क्रैश कर सकता था कि उसने atoi को मजबूर करने के लिए पर्याप्त गहराई से भर्ती करने के लिए मजबूर किया और इसलिए एप्लिकेशन को क्रैश कर दिया।

2

आप उन्मूलन की एक प्रक्रिया के माध्यम से पीछे की ओर काम कर सकता था:

1) आप शून्य से एक विभाजन के साथ समाप्त कर सकते हैं? कम संभावना। यदि बी 0 है, तो अंतिम अभिव्यक्ति 0 है, और यदि यह 0 नहीं है, तो आपको शून्य से विभाजित नहीं किया जाएगा।

2) क्या आप सरणी पहुंच पर गलत संख्या में तर्क और क्रैश प्रदान कर सकते हैं? वास्तव में पहले argc चेक

3) यदि आपके तर्क किसी संख्या में अनुवाद नहीं करते हैं, तो atoi एक संख्यात्मक मान लौटाएं। मुझे लगता है कि यह लाइब्रेरी विनिर्देश का हिस्सा है और इस प्रकार कार्यान्वयन भिन्नता के लिए खुला नहीं है लेकिन मैं गलत हो सकता हूं।

तो मुझे नहीं पता कि आप यहां कैसे क्रैश करेंगे।

एकमात्र चीज़ जो मुझे इस प्रश्न के बारे में पसंद है वह शून्य भाग से विभाजन है - यह जांचता है कि आप समझते हैं? ऑपरेटर और वह 0 झूठा है। मैं आपको संदर्भ मैनुअल तक पहुंच प्रदान किए बिना एटोई भाग को नापसंद करता हूं। मुझे सुनिश्चित करने के लिए दस्तावेज़ों को देखना था।

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

अपडेट: मैंने कई संदर्भों पर ऑनलाइन खोज की और ऐसा लगता है कि अटोई को खराब इनपुट पर 0 वापस करना चाहिए। उदाहरण के लिए, MSDN से:

प्रत्येक समारोह पूर्णांक मूल्य एक संख्या के रूप इनपुट पात्रों की व्याख्या द्वारा उत्पादित देता है। मूल्य atoi और _wtoi के लिए 0 है, यदि इनपुट को उस प्रकार के मान में परिवर्तित नहीं किया जा सकता है।

+1

पुन: 3) नहीं। एटोई को कुछ पास करना जिसे एक int में परिवर्तित नहीं किया जा सकता है, को संख्यात्मक मान वापस करने की आवश्यकता नहीं है। यह अपरिभाषित व्यवहार का आह्वान करता है। एक कार्यान्वयन आपके प्रोग्राम को क्रैश करने के लिए स्वतंत्र है, यदि आप ऐसा करते हैं तो अपने हार्डड्राइव को जलाएं। – nos

+0

@nos: क्या यह मामला है? मैंने विकिपीडिया और एमएसडीएन की जांच की और ऐसा लगता है कि अन्यथा यह इंगित करता है: "प्रत्येक फ़ंक्शन इनपुट वर्णों को एक संख्या के रूप में व्याख्या करके उत्पादित int मान देता है। वापसी मूल्य AToi और _wtoi के लिए 0 है, यदि इनपुट उस मान के रूप में परिवर्तित नहीं किया जा सकता है प्रकार।" – Uri

+1

सी मानक के अनुसार यह मामला है, हां। "[1] atof, atoi, atol, और atoll के कार्यों की आवश्यकता नहीं है त्रुटि पर पूर्णांक अभिव्यक्ति त्रुटि के मान को प्रभावित करता है। यदि परिणाम का मान प्रदर्शित नहीं किया जा सकता है, तो व्यवहार अपरिभाषित है।" – nos

0

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

0

मुझे नहीं पता कि अधिकांश ओएस कैसे argv डेटा पास करते हैं। क्या यह ढेर पर आवंटित है? क्या यह मूल रूप से लंबाई में सीमित है?

क्या आप वास्तव में एक लंबे समय तक कमांड लाइन पैरामीटर पारित कर सकते हैं और एक स्टैक-ओवरफ्लो बना सकते हैं?

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