ক্ল্যাং / এলএলভিএম কেন সমস্ত সংখ্যার মামলা আবৃত থাকে এমন একটি স্যুইচ বিবৃতিতে ডিফল্ট ব্যবহার সম্পর্কে আমাকে সতর্ক করে?


34

নিম্নলিখিত এনাম এবং সুইচ বিবৃতি বিবেচনা করুন:

typedef enum {
    MaskValueUno,
    MaskValueDos
} testingMask;

void myFunction(testingMask theMask) {
    switch (theMask) {
        case MaskValueUno: {}// deal with it
        case MaskValueDos: {}// deal with it
        default: {} //deal with an unexpected or uninitialized value
    }
};

আমি একটি উদ্দেশ্য-সি প্রোগ্রামার, তবে আমি এটি বৃহত্তর দর্শকদের জন্য খাঁটি সিতে লিখেছি।

ডিগ্রি / এলএলভিএম ৪.১ এর সাথে ঝাঁকুনি / প্রত্যেকটি আমাকে ডিফল্ট লাইনে সতর্ক করে:

স্যুইচটিতে ডিফল্ট লেবেল যা সমস্ত গণনা মানকে কভার করে

এখন, আমি এখানে বাছাই করে দেখতে পারি কেন এটি রয়েছে: নিখুঁত বিশ্বে, যুক্তিতে প্রবেশ করার একমাত্র মানগুলি theMaskএনুমে থাকবে, সুতরাং কোনও ডিফল্ট প্রয়োজন হয় না। তবে যদি কিছু হ্যাক আসে এবং আমার সুন্দর ফাংশনে একটি অবিশ্রুত প্রান্ত ছুড়ে দেয় তবে কী হবে? আমার ফাংশনটি লাইব্রেরির ড্রপ হিসাবে সরবরাহ করা হবে এবং সেখানে কী যেতে পারে তার উপর আমার কোনও নিয়ন্ত্রণ নেই। ব্যবহার করা defaultএটি পরিচালনা করার খুব পরিষ্কার উপায়।

এলএলভিএম দেবতারা এই আচরণকে তাদের নরকীয় ডিভাইসের পক্ষে অযোগ্য বলে কেন মনে করেন? যুক্তিটি যাচাই করার জন্য যদি আমি একটি বিবৃতি দ্বারা এটি করা উচিত?


1
আমার বলা উচিত, আমার প্রত্যেকটি কারণের কারণ হ'ল নিজেকে আরও ভাল প্রোগ্রামার করা। হিসাবে NSHipster বলেছেন : "Pro tip: Try setting the -Weverything flag and checking the “Treat Warnings as Errors” box your build settings. This turns on Hard Mode in Xcode."
Swizzlr

2
-Weverythingদরকারী হতে পারে, তবে এটি মোকাবেলা করার জন্য আপনার কোডটিকে খুব বেশি পরিবর্তন করার বিষয়ে সতর্ক হন। এই সতর্কতাগুলির মধ্যে কয়েকটি কেবল মূল্যহীন নয়, পাল্টা উত্পাদনশীল এবং সেরাভাবে বন্ধ রয়েছে। (প্রকৃতপক্ষে, -Weverythingএটির জন্য ব্যবহারের ক্ষেত্রে : এটি শুরু করুন, এবং যা বোঝায় না তা বন্ধ করুন
স্টিভেন ফিশার

উত্তরোত্তর সম্পর্কে সতর্কতা বার্তায় আপনি কি কিছুটা প্রসারিত করতে পারেন? তাদের চেয়ে সাধারণত আরও কিছু আছে।
স্টিভেন ফিশার

উত্তরগুলি পড়ার পরেও আমি আপনার প্রাথমিক সমাধানটি পছন্দ করি। ডিফল্ট বিবৃতি আইএমএইচওর উত্তরগুলিতে দেওয়া বিকল্পগুলির চেয়ে ভাল। কেবলমাত্র একটি ছোট নোট: উত্তরগুলি সত্যই ভাল এবং তথ্যবহুল, তারা কীভাবে সমস্যাটি সমাধান করবেন তা একটি দুর্দান্ত উপায় দেখায়।
বিবাজা 42

পুনঃটুইট করেছেন এবং কিলিয়ান যেমন উল্লেখ করেছিলেন যে আমি যদি পরে আমার এনামটি সংশোধন করি তবে এটি বৈধ মানগুলির ডিফল্ট বাস্তবায়নে যাওয়ার সম্ভাবনাটি উন্মুক্ত করবে। এটি একটি ভাল ডিজাইনের প্যাটার্ন বলে মনে হচ্ছে (যদি এটি এমন জিনিস হয়)।
Swizzlr

উত্তর:


31

এখানে এমন একটি সংস্করণ যা সমস্যা ঝাঁকুনির রিপোর্টিং বা আপনার বিরুদ্ধে রক্ষা করছে না:

void myFunction(testingMask theMask) {
    assert(theMask == MaskValueUno || theMask == MaskValueDos);
    switch (theMask) {
        case MaskValueUno: {}// deal with it
        case MaskValueDos: {}// deal with it
    }
}

কিলিয়ান ইতিমধ্যে ব্যাখ্যা করেছেন যে ঝাঁকুনি কেন সতর্কবার্তাটি প্রকাশ করে: আপনি এনাম বাড়িয়ে দিলে আপনি ডিফল্ট ক্ষেত্রে পড়ে যাবেন যা সম্ভবত আপনি চান না। করণীয় সঠিক কাজটি হ'ল ডিফল্ট কেসটি সরিয়ে ফেলা এবং অপরিবর্তিত অবস্থার জন্য সতর্কতা পেতে ।

এখন আপনি উদ্বিগ্ন যে কেউ আপনার ফাংশনটিকে এমন একটি মান দিয়ে কল করতে পারে যা গণনার বাইরে। এটি ফাংশনটির পূর্বশর্ত পূরণ করতে ব্যর্থ হওয়ার মতো মনে হচ্ছে: এটি testingMaskগণনা থেকে কোনও মূল্য আশা করার জন্য নথিভুক্ত করা হয়েছে তবে প্রোগ্রামার অন্য কিছু দিয়ে গেছে। সুতরাং এটি ব্যবহার করে কোনও প্রোগ্রামার ত্রুটি করুনassert() (বা NSCAssert()যেমন আপনি বলেছেন যে আপনি উদ্দেশ্য-সি ব্যবহার করছেন)। প্রোগ্রামার যদি এটি ভুল করে থাকে তবে প্রোগ্রামারটি এটি ভুল করছে বলে একটি বার্তা দিয়ে আপনার প্রোগ্রামটিকে ক্র্যাশ করুন।


6
+1 টি। একটি ছোট পরিবর্তন হিসাবে, আমি প্রতিটি কেস থাকতে return;এবং assert(false);শেষের দিকে যুক্ত করতে পছন্দ করি (আইনি এনামগুলিকে প্রাথমিক assert()এবং এর তালিকাভুক্ত করে নিজেকে পুনরাবৃত্তি করার পরিবর্তে switch)।
জোশ কেলি

1
তবে কী যদি ভুল এনামটি বোবা প্রোগ্রামার দ্বারা পাস না করা হয়, বরং মেমরির দুর্নীতি বাগের মাধ্যমে হয়? যখন ড্রাইভারটি তাদের টয়োটার ব্রেকটি চাপ দেয় এবং একটি বাগ এনুমকে দূষিত করে তোলে, তারপরে ব্রেক-হ্যান্ডলিং প্রোগ্রামটি ক্র্যাশ ও জ্বলতে হবে এবং ড্রাইভারের কাছে একটি পাঠ্য প্রদর্শিত হবে: "প্রোগ্রামারটি এটি ভুল করছে, খারাপ প্রোগ্রামার! "। আমি একটি ক্লিফের প্রান্তে গাড়ি চালানোর আগে এটি ব্যবহারকারীকে কীভাবে সহায়তা করবে তা আমি পুরোপুরি দেখতে পাই না।

2
@ লন্ডিন হ'ল ওপি কী করছে, বা এটি সবেমাত্র আপনি তৈরি করেছেন এমন একটি অর্থহীন তাত্ত্বিক প্রান্তের কেস? নির্বিশেষে, একটি "মেমরি দুর্নীতি বাগ" [i] প্রোগ্রামার ত্রুটি, [ii] এমন কিছু নয় যা আপনি অর্থপূর্ণ উপায়ে চালিয়ে যেতে পারেন (কমপক্ষে প্রশ্নে বর্ণিত প্রয়োজনীয়তার সাথে নয়)।

1
@ গ্রাহামলি আমি কেবল বলে দিচ্ছি যে "অপ্রত্যাশিত হয়ে মারা যাও" যখন আপনি অপ্রত্যাশিত ত্রুটি দেখেন তখন অগত্যা সর্বোত্তম বিকল্প নয়।

1
এটিতে নতুন সমস্যা রয়েছে যা আপনি সম্ভবত দৃ and়তার সাথে দাবিগুলি এবং কেসগুলি সিঙ্ক থেকে বেরিয়ে যেতে পারেন।
ব্যবহারকারী 253751

9

defaultএখানে একটি লেবেল থাকা একটি সূচক যা আপনি প্রত্যাশা করছেন তা সম্পর্কে বিভ্রান্ত। যেহেতু আপনি সমস্ত সম্ভাব্য enumমানগুলি স্পষ্টভাবে শেষ করে দিয়েছেন, defaultসম্ভবত এটি কার্যকর করা যায় না এবং ভবিষ্যতের পরিবর্তনের বিরুদ্ধেও আপনাকে রক্ষা করার প্রয়োজন হয় না, কারণ আপনি যদি প্রসারিত করেন enumতবে কনস্ট্রাক্টটি ইতিমধ্যে একটি সতর্কতা তৈরি করবে ।

সুতরাং, কম্পাইলার নোটিশ যে সমস্ত ঘাঁটি আচ্ছাদিত কিন্তু প্রদর্শিত আছে করা চিন্তা যে, আপনি নিজে আছে, এবং যে সবসময় একটি খারাপ লক্ষণ। switchপ্রত্যাশিত ফর্মটিতে পরিবর্তন আনতে সর্বনিম্ন প্রচেষ্টা গ্রহণ করে আপনি সংকলককে দেখিয়েছেন যে আপনি যা করছেন বলে মনে হচ্ছে আপনি যা করছেন তা আসলে আপনি করছেন এবং আপনি এটি জানেন।


1
তবে আমার উদ্বেগটি একটি নোংরা পরিবর্তনশীল, এবং এর বিরুদ্ধে রক্ষা করা (যেমন, আমি যেমন বলেছি, একটি অবিশ্বাস্য অন্তর্ভুক্ত)। আমার কাছে মনে হচ্ছে এমন পরিস্থিতিতে স্যুইচ স্টেটমেন্টটির পক্ষে ডিফল্ট পৌঁছানো সম্ভব হবে।
Swizzlr

আমি ওজেক্টিভ-সি এর সংজ্ঞা হৃদয় দিয়ে জানি না, তবে আমি ধরে নিয়েছিলাম যে একটি টাইপড এন এনম সংকলক দ্বারা প্রয়োগ করা হবে। অন্য কথায়, যদি আপনার প্রোগ্রামটি ইতিমধ্যে সংজ্ঞায়িত আচরণ প্রদর্শন করে তবে একটি "অবিচ্ছিন্ন" মান কেবল সেই পদ্ধতিতে প্রবেশ করতে পারে এবং আমি এটি পুরোপুরি যুক্তিসঙ্গত বলে মনে করি যে কোনও সংকলক এটি বিবেচনায় না নেয়।
কিলিয়ান ফুট

3
@ কিলিয়ানফথ নাহ, তারা নেই। অবজেক্টিভ-সি এনামগুলি সি এনম হয়, জাভা এনাম নয়। অন্তর্নিহিত ইন্টিগ্রাল টাইপ থেকে কোনও মান ফাংশন আর্গুমেন্টে উপস্থিত হতে পারে।

2
এছাড়াও, পূর্ণসংখ্যা থেকে এনামগুলি রানটাইমে সেট করা যেতে পারে। সুতরাং তারা কল্পনাযোগ্য কোনও মান ধারণ করতে পারে।

ওপি সঠিক। টেস্টিংমাস্ক এম; myFunction (মি); সম্ভবত ডিফল্ট ক্ষেত্রে আঘাত করবে।
ম্যাথু জেমস ব্রিগেস

4

কলং বিভ্রান্ত, একটি ডিফল্ট বিবৃতি আছে পুরোপুরি সূক্ষ্ম অনুশীলন, এটি ডিফেন্সিভ প্রোগ্রামিং হিসাবে পরিচিত এবং ভাল প্রোগ্রামিং অনুশীলন হিসাবে বিবেচিত (1)। এটি মিশন-সমালোচনামূলক সিস্টেমে প্রচুর পরিমাণে ব্যবহৃত হয়, যদিও সম্ভবত ডেস্কটপ প্রোগ্রামিংয়ে না।

আত্মরক্ষামূলক প্রোগ্রামিংয়ের উদ্দেশ্য হ'ল অপ্রত্যাশিত ত্রুটিগুলি ধরা যা তত্ত্বগতভাবে কখনও ঘটেনি। এই জাতীয় অপ্রত্যাশিত ত্রুটিটি অবশ্যই প্রোগ্রামারটিকে ফাংশনটিকে একটি ভুল ইনপুট দেয় না, এমনকি একটি "দুষ্ট হ্যাক" দেয়। সম্ভবত, এটি কোনও দুর্নীতিগ্রস্থ ভেরিয়েবলের কারণে হতে পারে: বাফার ওভারফ্লো, স্ট্যাক ওভারফ্লো, রানওয়ে কোড এবং আপনার ফাংশনের সাথে সম্পর্কিত নয় এমন অনুরূপ বাগগুলি এর কারণ হতে পারে। এবং এম্বেড থাকা সিস্টেমগুলির ক্ষেত্রে, EMI এর কারণে ভেরিয়েবলগুলি সম্ভবত পরিবর্তিত হতে পারে, বিশেষত যদি আপনি বাহ্যিক র‌্যাম সার্কিট ব্যবহার করছেন।

ডিফল্ট বিবৃতিতে কী লিখতে হবে ... যদি আপনি সন্দেহ করেন যে প্রোগ্রামটি শেষ হয়ে যাওয়ার পরে এই হাইওয়ারটি চলে গেছে, তবে আপনার কোনওরকম ত্রুটি পরিচালনার প্রয়োজন। অনেক ক্ষেত্রে আপনি সম্ভবত একটি মন্তব্য দিয়ে একটি খালি বিবৃতি যোগ করতে পারেন: "অপ্রত্যাশিত তবে কিছু যায় আসে না" ইত্যাদি, আপনি যে সম্ভাবনা পরিস্থিতি বিবেচনা করেছেন তা দেখানোর জন্য।


(1) মিশ্র-সি: 2004 15.3।


1
দয়া করে না যে গড় পিসি প্রোগ্রামার সাধারণত রক্ষণাত্মক প্রোগ্রামিংয়ের ধারণাটিকে সম্পূর্ণ এলিয়েন হিসাবে আবিষ্কার করে, যেহেতু একটি প্রোগ্রাম সম্পর্কে তাদের দৃষ্টিভঙ্গি একটি বিমূর্ত ইউটোপিয়া যেখানে তত্ত্বের ক্ষেত্রে ভুল হতে পারে এমন কিছুই বাস্তবে ভুল হতে পারে না। অতএব আপনি কাকে জিজ্ঞাসা করছেন তার উপর নির্ভর করে আপনি আপনার প্রশ্নের বেশ বিচিত্র উত্তর পেয়ে যাবেন।

3
ঝাঁকুনি বিভ্রান্ত হয় না; এটি স্পষ্টভাবে সমস্ত সতর্কতা সরবরাহ করতে বলা হয়েছে , যার মধ্যে এমন সবগুলি অন্তর্ভুক্ত রয়েছে যা সর্বদা দরকারী নয় যেমন স্টাইলিস্টিক সতর্কতা। (আমি ব্যক্তিগতভাবে এই সতর্কতাটি বেছে নিয়েছি কারণ আমি আমার এনাম সুইচগুলিতে ডিফল্ট চাই না; তাদের থাকার অর্থ যদি আমি একটি এনাম মান যোগ করি এবং এটি পরিচালনা না করি তবে আমি কোনও সতর্কতা পাই না this এই কারণে, আমি সর্বদা হ্যান্ডেল করি এনামের বাইরে খারাপ মানের ক্ষেত্রে।)
জেনস আইটন

2
@ জেনস অ্যাটটন এটি বিভ্রান্ত যদি একটি সুইচ বিবৃতি সকল পেশাদারী স্ট্যাটিক বিশ্লেষক সরঞ্জাম সেইসাথে সব মিশ্রের-অনুবর্তী কম্পাইলার একটি সতর্কবার্তা দিতে হবে অভাব আছে একটি ডিফল্ট বিবৃতি। নিজেই চেষ্টা করে দেখুন।

4
MISRA-C তে কোডিং কোনও সি সংকলকটির জন্য একমাত্র বৈধ ব্যবহার নয় এবং আবারও প্রতিটি সতর্কতা -Weverythingচালু করে , নির্দিষ্ট ব্যবহারের ক্ষেত্রে উপযুক্ত নয় not আপনার স্বাদ ফিট না করা বিভ্রান্তির মতো জিনিস নয়।
জেনস আইটন

2
@ লন্ডিন: আমি অবশ্যই নিশ্চিত যে মিস্রা-সি এর সাথে লেগে থাকার ফলে যাদুকরভাবে প্রোগ্রামগুলি নিরাপদ এবং বাগ-মুক্ত করা যায় না ... এবং আমিও সমানভাবে নিশ্চিত যে এমন লোকদের থেকে প্রচুর সুরক্ষিত, বাগ-মুক্ত সি কোড রয়েছে যা এমনকি কখনও নেই মিস্রার কথা শুনেছি । প্রকৃতপক্ষে, এটি কারও (জনপ্রিয়, তবে অবিসংবাদযুক্ত নয়) মতামতের চেয়ে কিছুটা বেশি এবং এমন কিছু লোক রয়েছে যাঁরা এর নকশাকৃত প্রসঙ্গের বাইরে এর কিছু বিধি স্বেচ্ছাচারিত এবং কখনও কখনও ক্ষতিকারকও খুঁজে পান।
সিএও

4

এখনও ভাল:

typedef enum {
    MaskValueUno,
    MaskValueDos,

    MaskValue_count
} testingMask;

void myFunction(testingMask theMask) {
    assert(theMask >= 0 && theMask<MaskValue_count);
    switch theMask {
        case MaskValueUno: {}// deal with it
        case MaskValueDos: {}// deal with it
    }
};

এনামগুলিতে আইটেম যুক্ত করার সময় এটি ত্রুটি-প্রবণতা কম। আপনি যদি নিজের এনাম মানগুলি স্বাক্ষরবিহীন করে থাকেন তবে আপনি> = 0 এর জন্য পরীক্ষাটি এড়িয়ে যেতে পারেন। এই পদ্ধতিটি কেবল তখনই কাজ করে যদি আপনার এনাম মানগুলিতে কোনও ফাঁক না থাকে তবে প্রায়ই এটি হয়।


2
এটি এমন মানগুলির সাথে প্রকারটিকে দূষিত করছে যে আপনি কেবল চান না যে টাইপটি রয়েছে। এখানে ভাল পুরানো ডাব্লুটিএফ এর সাথে মিল রয়েছে: thedailywtf.com/articles/Wat_Is_Truth_0x3f_
মার্টিন সুগিয়ার্তো

4

তবে যদি কিছু হ্যাক আসে এবং আমার সুন্দর ফাংশনে একটি অবিশ্রুত প্রান্ত ছুড়ে দেয় তবে কী হবে?

তারপরে আপনি অনির্ধারিত আচরণ পান এবং আপনার defaultঅর্থহীন হবে। এটিকে আরও ভাল করার জন্য আপনি যা করতে পারেন তেমন কিছুই নেই।

আমাকে আরও পরিষ্কার করা যাক। তাত্ক্ষণিকভাবে কেউ intআপনার ফাংশনে অবিচ্ছিন্নভাবে পাস করে, এটি হয় সংজ্ঞায়িত আচরণ। আপনার ফাংশনটি হ্যালটিং সমস্যা সমাধান করতে পারে এবং এটি কোনও ব্যাপার নয়। এটি ইউবি। একবার ইউবি ডাকা হয়ে গেলে আপনি সম্ভবত কিছু করতে পারবেন না।


3
নিঃশব্দে এটিকে অগ্রাহ্য করা হলে এটি লগ করা বা পরিবর্তে একটি ব্যতিক্রম ছোঁড়া সম্পর্কে কীভাবে?
jgauffin

3
প্রকৃতপক্ষে, অনেক কিছুই করা যায় যেমন ... স্যুইচটিতে একটি ডিফল্ট বিবৃতি যুক্ত করা এবং ত্রুটিপূর্ণভাবে ত্রুটিটি পরিচালনা করা। এটি ডিফেন্সিভ প্রোগ্রামিং হিসাবে পরিচিত । এটি কেবল বোবা প্রোগ্রামারকে ফাংশনটি ভুল ইনপুট প্রদানের বিরুদ্ধে রক্ষা করবে না, তবে বাফার ওভারফ্লো, স্ট্যাক ওভারফ্লো, রানওয়ে কোড ইত্যাদির কারণে সৃষ্ট বিভিন্ন বাগের বিরুদ্ধেও রক্ষা করবে

1
না, এটি কিছু পরিচালনা করবে না। এটি ইউবি। ফাংশনটি প্রবেশের মুহুর্তে প্রোগ্রামটির ইউবি রয়েছে এবং ফাংশন বডিটি এটি সম্পর্কে কিছুই করতে পারে না।
ডেডএমজি

2
@ ডেডজিএম একটি এনামের প্রয়োগের ক্ষেত্রে এটির সাথে সম্পর্কিত পূর্ণসংখ্যার যে কোনও মান থাকতে পারে। এটি সম্পর্কে অপরিবর্তিত কিছুই নেই। অবিচ্ছিন্ন অটো ভেরিয়েবলের বিষয়বস্তু অ্যাক্সেস করা প্রকৃতপক্ষে ইউবি, তবে "দুষ্ট হ্যাক" (যা সম্ভবত কিছু প্রকারের বাগ) সম্ভবত কোনও ফাংশনটির জন্য একটি সংজ্ঞায়িত মান টস করতে পারে, যদিও এটি মানগুলির মধ্যে একটি নয় not এনাম ঘোষণায় তালিকাভুক্ত।

2

ডিফল্ট বিবৃতি অগত্যা সাহায্য করবে না। যদি স্যুইচটি এনামের উপরে চলে যায় তবে এনামে সংজ্ঞায়িত না হওয়া কোনও মান অপরিজ্ঞাত আচরণ সম্পাদন করে।

আপনারা জানেন সকলের জন্য, সংকলকটি সেই স্যুইচটি (ডিফল্ট সহ) সংকলন করতে পারে:

if (theMask == MaskValueUno)
  // Execute something MaskValueUno code
else // theMask == MaskValueDos
  // Execute MaskValueDos code

একবার আপনি সংজ্ঞায়িত আচরণটি ট্রিগার করার পরে আর ফিরে আসবে না।


2
প্রথমত, এটি একটি অনির্ধারিত মান , অপরিবর্তিত আচরণ নয়। এর অর্থ হ'ল সংকলকটি আরও কিছু মান আরও বেশি সুবিধাজনক বলে ধরে নিতে পারে তবে এটি চাঁদকে সবুজ পনির ইত্যাদিতে পরিণত করতে পারে না Second দ্বিতীয়ত, যতদূর আমি বলতে পারি, এটি কেবল সি ++ এর ক্ষেত্রে প্রযোজ্য। সি-তে, কোনও enumধরণের মানগুলির পরিসীমা তার অন্তর্নিহিত পূর্ণসংখ্যার ধরণের মানগুলির সীমার সমান (যা প্রয়োগ-সংজ্ঞায়িত, সুতরাং স্ব-সামঞ্জস্যপূর্ণ হওয়া আবশ্যক)।
জেনস আইটন

1
যাইহোক, একটি এনাম ভেরিয়েবল এবং একটি গণনা ধ্রুবক একটি উদাহরণ অগত্যা একই প্রস্থ এবং স্বাক্ষর থাকা প্রয়োজন হয় না, তারা উভয় impl.de সংজ্ঞায়িত। তবে আমি নিশ্চিত যে সি এর সমস্ত এনামগুলি তাদের যথাযথ সংখ্যার মতোই মূল্যায়ন করা হয়, সুতরাং সেখানে কোনও সংজ্ঞায়িত বা এমনকি অনির্দিষ্ট আচরণ নেই।

2

আমি default:সব ক্ষেত্রে একটি করা পছন্দ । আমি যথারীতি পার্টিতে দেরি করেছি, কিন্তু ... অন্য কিছু চিন্তা যা আমি উপরে দেখিনি:

  • নির্দিষ্ট সতর্কতা (অথবা যদি নিক্ষেপ করা হয় তবে ত্রুটি -Werror) আসছে -Wcovered-switch-default( -Weverythingতবে না থেকে ) আসছে -Wall। যদি আপনার নৈতিক নমনীয়তা আপনাকে নির্দিষ্ট সতর্কতাগুলি বন্ধ করতে দেয় (যেমন, কিছু থেকে শুল্ক আরোপ করে -Wallবা -Weverything), নিক্ষেপ -Wno-covered-switch-default(বা -Wno-error=covered-switch-defaultব্যবহার করার সময় -Werror) বিবেচনা করুন এবং সাধারণভাবে -Wno-...অন্যান্য সতর্কতার জন্য আপনি অসম্মতিজনক বলে মনে করেন।
  • জন্য gcc(এবং আরও জেনেরিক আচরণ clang), সঙ্গে পরামর্শ gccজন্য র manpage -Wswitch, -Wswitch-enum, -Wswitch-defaultজন্য (বিভিন্ন) সুইচ বিবৃতি মধ্যে গণিত ধরনের অনুরূপ পরিস্থিতিতে আচরণ।
  • আমি ধারণাটিতে এই সতর্কতাটি পছন্দ করি না এবং এর শব্দবন্ধগুলি আমার পছন্দ হয় না; আমার কাছে, সতর্কতার শব্দগুলি ("ডিফল্ট লেবেল ... সমস্ত ... মানগুলি অন্তর্ভুক্ত") পরামর্শ দেয় যে কেসটি default:সর্বদা কার্যকর করা হবে, যেমন

    switch (foo) {
      case 1:
        do_something(); 
        //note the lack of break (etc.) here!
      default:
        do_default();
    }
    

    প্রথম পাঠের সময়, আমি ভাবলাম আপনি যা চালাচ্ছেন - আপনার বা আপনার default:ক্ষেত্রে সর্বদা মৃত্যুদন্ড কার্যকর করা হবে কারণ এর সাথে break;বা তেমন কোনও return;মিল নেই। এই ধারণাটি অন্যান্য আয়া শৈলীর (আমার কাছে কানের সাথে) অনুরূপ (মাঝে মাঝে সহায়ক হলেও) মন্তব্য থেকে প্রকাশিত হয় clang। যদি foo == 1, উভয় ফাংশন কার্যকর করা হবে; আপনার কোড উপরে এই আচরণ আছে। অর্থাত্, যদি আপনি সম্ভবত পরবর্তী সমস্যাগুলি থেকে কোড সম্পাদন করতে চান তবেই ব্রেক-আউট করতে ব্যর্থ হন! এটি প্রদর্শিত হবে তবে আপনার সমস্যা হবে না।

পেডেন্টিক হওয়ার ঝুঁকিতে, সম্পূর্ণতার জন্য কিছু অন্যান্য ধারণা:

  • তবে আমি মনে করি এই আচরণটি (আরও) অন্যান্য ভাষা বা সংকলকগুলিতে আক্রমণাত্মক ধরণের পরীক্ষার সাথে সামঞ্জস্যপূর্ণ। আপনি অনুমান হিসাবে, কিছু তিরস্কার এই ফাংশন, যা স্পষ্টভাবে আপনার নিজস্ব নির্দিষ্ট ধরণের গ্রাহ্যint করতে ইচ্ছুক একটি বা কিছু পাস করার চেষ্টা করে , আপনার সংকলক আক্রমণাত্মক সতর্কতা বা ত্রুটি সঙ্গে সেই পরিস্থিতিতে আপনাকে সমানভাবে ভাল রক্ষা করা উচিত। কিন্তু এটা না! (যেমন, এটা যে অন্তত মনে হয় gccএবং clangনা enum, কিন্তু টাইপ-পরীক্ষণের আমি শুনেছি যে iccকরে )। যেহেতু আপনি টাইপ- নিরাপদতা পাচ্ছেন না , আপনি উপরে আলোচনা হিসাবে মান- সুরক্ষা পেতে পারেন । অন্যথায়, টিএফএ-তে প্রস্তাবিত হিসাবে, এমন কোনও structবা কিছু বিবেচনা করুন যা টাইপ-সুরক্ষা সরবরাহ করতে পারে।
  • অন্য একটি কাজ হতে পারে আপনার enumযেমন একটি নতুন "মান" তৈরি করা MaskValueIllegal, এবং caseএটি আপনার সমর্থন করে না switch। এটি default:(অন্য কোনও ভ্যাকুয় মান ছাড়াও) খাওয়া হবে

দীর্ঘ লাইভ ডিফেন্সিভ কোডিং!


1

এখানে একটি বিকল্প প্রস্তাব আছে:
ওপি ক্ষেত্রে রক্ষা করার জন্য যেখানে কেউ কোনো পাসের চেষ্টা করছে intযেখানে enum আশা করা হচ্ছে। বা, সম্ভবত, যেখানে আরও বেশি ক্ষেত্রে নতুন শিরোনাম ব্যবহার করে কেউ নতুন প্রোগ্রামের সাথে একটি পুরানো লাইব্রেরি যুক্ত করেছে।

intমামলা হ্যান্ডেল করতে সুইচ পরিবর্তন করবেন না কেন ? স্যুইচটিতে মানের সামনে একটি কাস্ট যোগ করা সতর্কতাটি সরিয়ে দেয় এবং ডিফল্টটি কেন বিদ্যমান তা সম্পর্কে কিছুটা ইঙ্গিতও সরবরাহ করে।

void myFunction(testingMask theMask) {
    int maskValue = int(theMask);
    switch(maskValue) {
        case MaskValueUno: {} // deal with it
        case MaskValueDos: {}// deal with it
        default: {} //deal with an unexpected or uninitialized value
    }
}

আমি খুঁজে এই অনেক কম আপত্তিকর assert()সম্ভাব্য মান প্রতিটি পরীক্ষার বা এমনকি ভাবনাটি হলো এই যে পরিসীমা উপার্জন enum মান যাতে একটি সহজ পরীক্ষা কাজ ভালভাবে নির্দেশ দেওয়া হয়। এটি ডিফল্ট নির্ভুলভাবে এবং সুন্দরভাবে কী করে তা করার একটি কুশলী উপায়।


1
এই পোস্টটি পড়ার চেয়ে শক্ত (পাঠ্যের প্রাচীর)। আপনি এটিকে আরও ভাল আকারে সম্পাদনা করতে আপত্তি করবেন ?
জিনাত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.