সি এবং সি ++-তে, সমানতা (==) যেখানে প্রয়োজন সেখানে অ্যাসাইনমেন্ট (=) এর দুর্ঘটনাজনিত ব্যবহারকে কী কী পদ্ধতিগুলি আটকাতে পারে?


15

সি এবং সি ++ এ গুরুতর ত্রুটি সহ নিম্নলিখিত কোডটি লেখা খুব সহজ।

char responseChar = getchar();
int confirmExit = 'y' == tolower(responseChar);
if (confirmExit = 1)
{
    exit(0);
}

ত্রুটিটি হল যে যদি বিবৃতিটি হওয়া উচিত ছিল:

if (confirmExit == 1)

কোডেড হিসাবে, এটি প্রতিবার প্রস্থান করবে, কারণ confirmExitভেরিয়েবলের অ্যাসাইনমেন্টটি ঘটে, তারপরে confirmExitএক্সপ্রেশনটির ফলাফল হিসাবে ব্যবহৃত হয়।

এই ধরণের ত্রুটি রোধ করার জন্য কি ভাল উপায় আছে?


39
হ্যাঁ. সংকলক সতর্কতা চালু করুন। সতর্কতাগুলি ত্রুটি হিসাবে বিবেচনা করুন এবং এটি কোনও সমস্যা নয়।
মার্টিন ইয়র্ক


9
প্রদত্ত উদাহরণে সমাধানটি সহজ। আপনি এটা একটি বুলিয়ান মান নির্ধারণ, এইভাবে একটি বুলিয়ান হিসাবে এটি ব্যবহার: if (confirmExit)
নিরাপদ

4
সমস্যাটি হ'ল ভুলটি সি ভাষা "ডিজাইনার" দ্বারা করা হয়েছিল, যখন তারা অ্যাসাইনমেন্ট অপারেটরের জন্য = এবং সমতা তুলনার জন্য == ব্যবহার করা বেছে নিয়েছিল। ALGOL ব্যবহৃত: =, কারণ তারা বিশেষত সমতা তুলনার জন্য = ব্যবহার করতে চেয়েছিল এবং পাস্কাল এবং অ্যাডা ALGOL সিদ্ধান্ত অনুসরণ করেছিল। (এটি লক্ষণীয় যে, যখন ডিওডি ডিওড 1 বেক-অফে সি-ভিত্তিক প্রবেশের জন্য অনুরোধ করেছিল, ফলে শেষ পর্যন্ত অ্যাডা পাওয়া যায়, বেল ল্যাবস বলেছিলেন যে "সি এখন ছিল না এবং কখনও ডওড মিশন-সমালোচনার পক্ষে যথেষ্ট শক্তিশালী হবে না) সফ্টওয়্যার। "আপনারা চাইছেন যে ডিওডি এবং ঠিকাদাররা এই বিষয়ে বেল ল্যাবগুলি শুনেছিল।)
জন আর স্ট্রোহম

4
@ জন, প্রতীক বাছাই সমস্যা নয়, এটি বাস্তবিক বিষয়গুলিও একটি অভিব্যক্তি যা নির্ধারিত মান প্রদান করে যা শর্তাধীন a = bবা a == bশর্তসাপেক্ষে অনুমতি দেয় ।
কার্ল বিলেফেল্ট

উত্তর:


60

সর্বোত্তম কৌশলটি হ'ল আপনার সংকলকটির সতর্কতা স্তর বাড়ানো। এরপরে এটি আপনাকে শর্তসাপেক্ষে সম্ভাব্য কার্যনির্বাহী সম্পর্কে সতর্ক করবে।

নিশ্চিত হয়ে নিন যে আপনি শূন্য সতর্কতা সহ আপনার কোডটি সংকলন করেছেন (যা আপনার যাইহোক করা উচিত)। আপনি যদি পেডেন্টিক হতে চান তবে সতর্কতাগুলিকে ত্রুটি হিসাবে বিবেচনা করতে আপনার সংকলকটি সেট করুন।

ইয়োদা শর্তসাপেক্ষে (বাম দিকে ধ্রুবক স্থাপন) ব্যবহার করা আরও একটি কৌশল যা প্রায় এক দশক আগে জনপ্রিয় ছিল। তবে তারা কোডটি পড়তে আরও শক্ত করে তোলে (এবং এভাবে তারা পড়ে এমন অপ্রাকৃত উপায়ের কারণে বজায় রাখে (যদি আপনি যোদা না হন)) এবং সতর্কতার স্তরটি বাড়িয়ে তোলার চেয়ে বৃহত্তর কোনও সুবিধা দেয় না (এতে আরও সতর্কতার অতিরিক্ত সুবিধাও রয়েছে)।

সতর্কতাগুলি কোডটিতে সত্যই যৌক্তিক ত্রুটি এবং এটি সংশোধন করা উচিত।


2
অবশ্যই ইয়োডা শর্তসাপেক্ষে নয়, সতর্কতার সাথে যান - আপনি শর্তসাপেক্ষ ধ্রুবকটি প্রথমে যত সহজেই করতে ভুলে যেতে পারেন যত সহজেই আপনি যা করতে ভুলে যেতে পারেন ==
মাইকেল কোহেন

8
আমি একটি মনোরম আশ্চর্য পেয়েছি যে এই প্রশ্নের সর্বাধিক ভোট দেওয়া উত্তর হ'ল সংকলক সতর্কতাগুলিকে ত্রুটি হিসাবে পরিণত করুন '। আমি if (0 == ret)ভয়াবহতা আশা করছিলাম ।
জেমস

2
@ জেমস: ... উল্লেখ না করে এটি কাজ করবে না a == b!!
এমিলিও গারাভাগলিয়া

6
@ এমিলিও গারাভাগলিয়া: এর জন্য একটি সহজ কাজ রয়েছে: কেবল লিখুন 0==a && 0==b || 1==a && 1==b || 2==a && 2==b || ...(সমস্ত সম্ভাব্য মানের জন্য পুনরাবৃত্তি করুন)। বাধ্যতামূলক ...|| 22==a && 22==b || 23==a && 24==b || 25==a && 25==b ||... ত্রুটিটি ভুলে যাবেন না , বা রক্ষণাবেক্ষণ প্রোগ্রামারদের কোনও মজা থাকবে না।
ব্যবহারকারী 281377

10

আপনি সর্বদা আপনার সফ্টওয়্যার পরীক্ষার মতো র‌্যাডিক্যাল কিছু করতে পারেন। আমি এমনকি স্বয়ংক্রিয় ইউনিট পরীক্ষার অর্থও করছি না, প্রতিটি পরীক্ষামূলক অভিজ্ঞ বিকাশকারী তার নতুন কোডটি দু'বার চালিয়ে একবার অভ্যাসের বাইরে চলে যান, একবার প্রস্থানটি নিশ্চিত করে একবার করেন নি। বেশিরভাগ প্রোগ্রামাররা এটিকে একটি নন-ইস্যু বলে মনে করেন।


1
আপনার প্রোগ্রামের আচরণ যখন সম্পূর্ণরূপে নির্বিচারে হয় তখন করা সহজ।
জেমস

3
এই নির্দিষ্ট সমস্যাটির জন্য পরীক্ষা করা কঠিন হতে পারে। আমি মানুষকে rc=MethodThatRarelyFails(); if(rc = SUCCESS){একাধিকবার কামড়ে দেখেছি , বিশেষত যদি পদ্ধতিটি শুধুমাত্র এমন পরিস্থিতিতে ব্যর্থ হয় যার জন্য পরীক্ষা করা শক্ত হয়।
25:50

3
@ স্টিভেন বার্নাপ: মক অবজেক্টের জন্য এটিই। সঠিক পরীক্ষায় ব্যর্থতা মোডগুলির পরীক্ষা করা অন্তর্ভুক্ত।
জানু হুডেক

এটা সঠিক উত্তর.
মনিকার সাথে লাইটনেস রেস

6

অভিব্যক্তির মধ্যে অ্যাসাইনমেন্টের ভুল ব্যবহার রোধ করার একটি traditionalতিহ্যগত উপায় হ'ল বামদিকে ধ্রুবক এবং ডানদিকে পরিবর্তনশীল।

if (confirmExit = 1)  // Unsafe

if (1=confirmExit)    // Safe and detected at compile time.

সংকলক নীচের মত ধ্রুবক হিসাবে অবৈধ দায়িত্ব জন্য ত্রুটি রিপোর্ট করবে।

.\confirmExit\main.cpp:15: error: C2106: '=' : left operand must be l-value

শর্তটি যদি সংশোধিত হয়:

  if (1==confirmExit)    

নীচের মন্তব্যে দেখানো হিসাবে, এটি অনেকের দ্বারা অনুচিত পদ্ধতি হিসাবে বিবেচনা করা হয়।


8
: এছাড়াও Yoda কন্ডিশন নামে পরিচিত wiert.me/2010/05/25/... এবং stackoverflow.com/questions/8591182/... এবং programmers.stackexchange.com/questions/16908/...
মার্টিন ইয়র্ক

13
এটি লক্ষ করা উচিত যে এইভাবে জিনিসগুলি করা আপনাকে মোটামুটি জনপ্রিয় না করে তোলে।
রিওয়ালক

11
দয়া করে এই অনুশীলনের সুপারিশ করবেন না।
জেমস

5
একে অপরের সাথে দুটি ভেরিয়েবলের তুলনা করার প্রয়োজন থাকলে এটিও কাজ করে না।
dan04

কিছু ভাষা আসলে 1 কে নতুন মানকে বরাদ্দ দেয় (হ্যাঁ, আমি জানি Q একটি
বাউন্ড

4

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


আমি একমত নই বিশেষত = এর পরিবর্তে == কোডটি পর্যালোচনা করে সহজেই পিছলে যেতে পারে।
সাইমন

2

প্রথমত, আপনার সতর্কতার স্তরগুলি বাড়ানো কখনই ব্যথা করে না।

আপনি যদি নিজের শর্তসাপেক্ষে যদি বিবৃতিতে কোনও অ্যাসাইনমেন্টের ফলাফলটি পরীক্ষা না করতে চান তবে বেশ কয়েক বছর ধরে সি এবং সি ++ প্রোগ্রামারদের সাথে কাজ করেছেন, এবং ধ্রুবকটির সাথে প্রথম তুলনা করা if(1 == val)খারাপ জিনিস বলে কখনও শুনেন নি , আপনি যে নির্মাণ চেষ্টা করতে পারে।

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

যদি আপনার ইচ্ছা যদি কোনও অ্যাসাইনমেন্টের ফলাফলটি পরীক্ষা করা হয় তবে উচ্চতর সতর্কতাগুলি ব্যবহার করা সম্ভবত [সম্ভবত] অ্যাসাইনমেন্টটিকে ধ্রুবক হিসাবে ধরে ফেলতে পারে।


আমি কোনও অ-বিগনিয়ার প্রোগ্রামারকে সন্দেহজনক ভ্রু উত্থাপন করি যিনি কোনও যোদা শর্তযুক্ত দেখেন এবং তা অবিলম্বে বুঝতে পারেন না। এটি কেবল একটি ফ্লিপ, পড়া কঠিন নয় এবং কিছু মন্তব্য দাবি করার মতো খারাপও নয়।
আন্ডারস্কোর_ডে

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

আমি একা ইয়োদা শর্তাবলীর বিষয়ে ভাবছিলাম (এখানে আপনার ডেমোর মতো), বরাদ্দ দিয়ে নয় (ওপি হিসাবে)। আমি আগেরটিকে কিছু মনে করি না তবে পরবর্তীকালে খুব বেশি পছন্দ করি না। আমি ইচ্ছাকৃতভাবে একমাত্র ফর্মটি ব্যবহার করি if ( auto myPtr = dynamic_cast<some_ptr>(testPtr) ) {কারণ এটি nullptrকাস্ট ব্যর্থ হলে স্কোপটিতে অকেজো রাখার বিষয়টি এড়িয়ে চলে - যা সম্ভবত সি ++ এর শর্তসাপেক্ষে নির্ধারিত করার এই সীমিত ক্ষমতা রয়েছে। বাকীগুলির জন্য, হ্যাঁ, একটি সংজ্ঞাটির নিজস্ব লাইন পাওয়া উচিত, আমি বলব - এক নজরে দেখতে আরও সহজ এবং মনের দিক থেকে বিভিন্ন ধরণের স্লিপগুলি কম প্রবণ।
আন্ডারস্কোর_ডি

আপনার মন্তব্যগুলির উপর ভিত্তি করে @ौंসক_আর সম্পাদিত উত্তর। ভাল যুক্তি.
অক্টোপাসগ্র্যাববাস 22

1

আগের মতো পার্টিতে দেরীতে, তবে স্ট্যাটিক কোড বিশ্লেষণ এখানে মূল বিষয়

বেশিরভাগ আইডিই এখন কম্পাইলারের সিনট্যাকটিক চেকের ওপরে এবং তারপরে এসসিএ সরবরাহ করে এবং অন্যান্য সরঞ্জামগুলি পাওয়া যায়, যা মিশ্র (*) এবং / অথবা সিইআরটি-সি নির্দেশিকা বাস্তবায়িত করে।

ঘোষণা: আমি মিস্রা সি ওয়ার্কিং গ্রুপের অংশ, তবে আমি ব্যক্তিগত ক্ষমতা নিয়ে পোস্ট করছি। আমি কোনও সরঞ্জাম বিক্রেতার থেকেও স্বাধীন


-2

কেবল বাম হাতের অ্যাসাইনমেন্টটি ব্যবহার করুন, সংকলক সতর্কতাগুলি আপনাকে সহায়তা করতে পারে তবে আপনাকে সঠিক স্তরটি পেয়েছে কিনা তা নিশ্চিত করতে হবে অন্যথায় আপনি হয় অর্থহীন সতর্কবাণীতে সজ্জিত হয়ে যাবেন বা আপনি যা দেখতে চান তা বলা হবে না।


4
আধুনিক কম্পাইলাররা কতটা অর্থহীন সতর্কবার্তা উত্পন্ন করে তাতে আপনি অবাক হবেন। আপনি একটি সতর্কতা গুরুত্বপূর্ণ বলে মনে করেন না, তবে বেশিরভাগ ক্ষেত্রে আপনি কেবল ভুল wrong
ক্রিস্টফ প্রোভস্ট

বই, "সলিড কোড লেখা" পরীক্ষা করে দেখুন amazon.com/Writing-Solid-Microsoft-Programming-Series/dp/... । এটি সংকলকগুলি এবং সতর্কতা বার্তাগুলি এবং আরও বিস্তৃত স্থিতিশীল বিশ্লেষণ থেকে আমরা কতটা উপকৃত হতে পারি তা নিয়ে দুর্দান্ত আলোচনা দিয়ে শুরু হয়।
ডেভেলপারডন

@ ক্রিস্টফপ্রোস্ট আমি একই কোডের একই লাইন থেকে আমাকে একই একই সতর্কতার 10 কপি দিতে ভিজ্যুয়াল স্টুডিওতে পরিচালিত হয়েছি, তারপরে যখন এই সমস্যাটি 'স্থির' হয়েছিল তখন একই কোডের একই লাইন সম্পর্কে 10 টি অভিন্ন সতর্কবার্তা হয়েছিল মূল পদ্ধতিটি আরও ভাল ছিল।
উল্টানো ল্লামা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.