एक सी प्रोग्रामर को क्या पता होना चाहिए? [बन्द है]


12

कुछ अवधारणाओं / तकनीकों / भाषा की विशेषताएं हैं जो हर सभ्य सी प्रोग्रामर को पता होना चाहिए / सामान्य सॉफ़्टवेयर इंजीनियरिंग को समान करना (और केवल सी विशिष्ट सामान पर ध्यान केंद्रित करना) को जानना चाहिए। मैं जानना चाहूंगा ताकि मैं अपने सी ज्ञान में कुछ संभावित अंतराल भर सकूं।


9
स्टैक ओवरफ्लो के सी प्रश्नों के साथ शुरू करें और देखें कि क्या कुछ ऐसा है जिसे आप नहीं जानते हैं।
चिरसायकॉक

3
एसी प्रोग्रामर को शायद पता होना चाहिए कि2 + 2 = 4
एडवर्ड स्ट्रेंज

21
उन्हें एक ऐसे स्टोर के बारे में पता होना चाहिए जो बुलेट प्रूफ जूते बेचता हो।
एडम क्रॉसलैंड

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

2
एक और प्रोग्रामिंग भाषा?
मुहम्मद अलकरौरी

जवाबों:


19

सी के लिए विशिष्ट? सामान्य प्रक्रिया से लेकर अधिकांश प्रक्रियात्मक भाषाओं तक, मुझे कहना पड़ेगा:

  • (ab) प्रीप्रोसेसर का उपयोग करना
  • संकलक बनाम संकलक
  • पॉइंटर्स पॉइंट्स पॉइंटर्स!
  • कैसे एरे बिंदु हैं, एरे हैं
  • सी स्ट्रिंग्स कैसे काम करते हैं, और वे भी कैसे संकेत और सरणियाँ हैं
  • खराब स्ट्रिंग स्ट्रिंग का उपयोग बफर ओवरफ्लो में कैसे हो सकता है
  • कुछ भी करने के लिए कैसे कुछ भी (इसके सभी 1s और 0s सब के बाद :))
  • मैनुअल मेमोरी मैनेजमेंट मॉलोक / मुफ्त
  • ढेर बनाम ढेर
  • पॉइंटर अलियासिंग, (C99 में इसके अवैध क्यों)
  • सख्ती से कक्षाओं के बजाय सार्वजनिक रूप से उजागर कार्यों के एक सेट के साथ मॉड्यूल (.h / .c फ़ाइलों) के संदर्भ में विकास के बारे में सोचना
  • यूनियन
  • स्प्रिंटफ आपके पैर को क्यों उड़ा सकता है
  • कार्य बिंदु

मैं सूची में "बफर ओवरफ्लो" जोड़ूंगा।
ऐदन कुल

@ अदान, अच्छी पकड़। जोड़ा गया।
डग टी।

2
कैसे सी सरणियां और संकेत समान नहीं हैं: books.google.ca/…
Matthieu

पॉइंटर्स को कम से कम 3 गुना अधिक दोहराया जाना चाहिए
गौरव

8

पॉइंटर्स को समझें और आप कंप्यूटर को समझेंगे।


12
नहीं, आपको बस एक भ्रम मिलेगा कि आप कंप्यूटर को समझते हैं।
नौकरी

5

पाइथाग्रास के उत्कृष्ट उत्तर के अलावा,

कैसे लिखें (या कम से कम पढ़ें) जटिल घोषणाएं, जैसे कि char (*(*funcs[4])())[10]

funcs एक सरणी है [4] जो एक फ़ंक्शन के लिए सूचक है जो चार्ट के [१०] सरणी के लिए पॉइंटर लौटाता है


1
अगर यह इतना जटिल हो जाता है, तो शायद यह एक टिप्पणी में है?
जॉब

7
शायद उसे सीखना चाहिए कि इस तरह लिखने से कैसे बचा जाए?
FabianB

3
  1. पूर्ण पदोन्नति नियम
  2. किसी ज्ञात मान के लिए सब कुछ प्रारंभ करें
  3. GOTO विशेष रूप से अपवाद / असफलताओं को संभालने के लिए उपयोग किए जाने पर बुराई नहीं है
  4. मॉलॉक और / या कॉलॉक NULL वापस कर सकते हैं ... सुनिश्चित करें कि आपके चेक रिटर्न मान हैं
  5. बार-बार छोटी मेमोरी के आवंटन से ढेर पर विखंडन हो सकता है।
  6. सूचक अंकगणित
  7. बिट मास्क आपके दोस्त हैं
  8. x >> 1 अहस्ताक्षरित पूर्णांक के लिए x / 2 के बराबर है

गोटो के लिए +1 बुरा नहीं है :)
zvrba

2

एसी प्रोग्रामर को पता होना चाहिए ... अन्य भाषाएं! ;-) यह हमेशा विभिन्न प्रतिमानों की अन्य भाषाओं से अवधारणाओं को जानने के लिए उपयोगी होता है, जैसे ओओपी, कार्यात्मक प्रोग्रामिंग और एक।

अधिक गंभीरता से, ओफ़्स्कुलेटेड प्रोग्रामिंग प्रतियोगिता पर एक नज़र मजेदार है और, उत्सुकता से, एक अच्छा अनुभव भी।


2

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

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

void myFn(void) {
    char buf[256];
    gets(buf);
}

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

C आपकी मशीन के काम करने के तरीके के बारे में आपको निम्न-स्तरीय विवरणों से अवगत कराता है, और यह आज आपको व्यापक उपयोग में किसी भी अन्य उपयोगकर्ता-संपादित भाषा की तुलना में आपकी मशीन पर अधिक प्रत्यक्ष नियंत्रण प्रदान करता है। महान शक्ति के साथ बड़ी जिम्मेदारी आती है - आपको वास्तव में सी-सुरक्षित और प्रभावी ढंग से काम करने के लिए उन निम्न-स्तरीय विवरणों को समझना होगा।


0

अन्य अच्छे उत्तरों के अलावा, मैं रक्षात्मक प्रोग्रामिंग तकनीकों को सूची में जोड़ना चाहूंगा ।

अनुबंध को सत्यापित करने के लिए कार्यों के प्रारंभ / अंत में एसेर्स का उपयोग करना।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.