সি ++ মূল নির্দেশিকাতে ES.20 বিধি রয়েছে: সর্বদা কোনও বস্তুর সূচনা করুন ।
ব্যবহৃত-পূর্বে-সেট ত্রুটি এবং তাদের সম্পর্কিত অপরিবর্তিত আচরণ এড়িয়ে চলুন। জটিল আরম্ভের বোধগম্যতা নিয়ে সমস্যাগুলি এড়ান। রিফ্যাক্টরিং সরল করুন।
তবে এই নিয়মটি বাগগুলি খুঁজে পেতে সহায়তা করে না, এটি কেবল সেগুলি লুকিয়ে রাখে।
ধরা যাক যে কোনও প্রোগ্রামের একটি নির্বাহের পথ রয়েছে যেখানে এটি একটি অবিচ্ছিন্ন ভেরিয়েবল ব্যবহার করে। এটি একটি বাগ। অপরিজ্ঞাত আচরণকে একদিকে রেখে, এর অর্থ হ'ল কিছু ভুল হয়েছে এবং সম্ভবত প্রোগ্রামটি তার পণ্যের প্রয়োজনীয়তা পূরণ করে না। এটি যখন উত্পাদনে নিযুক্ত করা হবে তখন কোনও অর্থের ক্ষতি বা আরও খারাপ হতে পারে।
আমরা কীভাবে বাগ স্ক্রিন করব? আমরা পরীক্ষা লিখি। কিন্তু পরীক্ষাগুলি 100% এক্সিকিউশন পাথগুলিকে আচ্ছাদন করে না এবং পরীক্ষাগুলি কখনই 100% প্রোগ্রাম ইনপুটকে কভার করে না। এর চেয়ে বেশি, এমনকি একটি পরীক্ষাও একটি ত্রুটিযুক্ত মৃত্যুদন্ডের পথ জুড়ে covers এটি এখনও পাস হতে পারে। এটি সর্বোপরি নির্ধারিত আচরণ, একটি অবিচ্ছিন্ন ভেরিয়েবলের কিছুটা বৈধ মান থাকতে পারে।
তবে আমাদের পরীক্ষাগুলির পাশাপাশি, আমাদের সংকলক রয়েছে যা 0xCDCDCDCD এর মতো কিছু লিখতে পারে অনিচ্ছাকৃত ভেরিয়েবলগুলিতে। এটি পরীক্ষার সনাক্তকরণের হারকে সামান্য উন্নতি করে।
আরও ভাল - অ্যাড্রেস স্যানিটাইজারের মতো সরঞ্জাম রয়েছে যা অবিরাম মেমরি বাইটগুলির সমস্ত পাঠকে ধরে ফেলবে।
এবং অবশেষে স্থিতিশীল বিশ্লেষক রয়েছে, যা প্রোগ্রামটি দেখতে পারে এবং বলতে পারে যে কার্যকর করার পথে একটি পঠন-পূর্ব-সেট রয়েছে।
সুতরাং আমাদের কাছে অনেক শক্তিশালী সরঞ্জাম রয়েছে তবে আমরা যদি ভেরিয়েবলটি শুরু করি - স্যানিটাইজাররা কিছুই খুঁজে পান না ।
int bytes_read = 0;
my_read(buffer, &bytes_read); // err_t my_read(buffer_t, int*);
// bytes_read is not changed on read error.
// It's a bug of "my_read", but detection is suppressed by initialization.
buffer.shrink(bytes_read); // Uninitialized bytes_read could be detected here.
// Another bug: use empty buffer after read error.
use(buffer);
আরও একটি নিয়ম রয়েছে - যদি প্রোগ্রাম এক্সিকিউশনটির সাথে বাগের মুখোমুখি হয়, প্রোগ্রামটি যত তাড়াতাড়ি সম্ভব মারা যায়। এটিকে বাঁচিয়ে রাখার দরকার নেই, কেবল ক্রাশ হবে, ক্র্যাশডাম্প লিখবে, ইঞ্জিনিয়ারদের তদন্তের জন্য দেবে।
অযৌক্তিকভাবে ভেরিয়েবলগুলি আরম্ভ করা বিপরীতভাবে করে - প্রোগ্রামটি জীবিত রাখা হচ্ছে, যখন এটি ইতিমধ্যে অন্যথায় কোনও সেগমেন্টেশন ফল্ট পাবে।
\0
তবে এটি বগি। যদি এটির সাথে ডিল করার জন্য দলিল করা হয় তবে আপনার কলিং কোডটি বগি। কল করার bytes_read==0
আগে যদি আপনি আপনার কলিং কোডটি যাচাই করার জন্য ঠিক করে থাকেন, তবে আপনি যেখানে শুরু করেছিলেন সেখানে ফিরে এসেছেন: আপনি কোডটি বগি বানাচ্ছেন যদি আপনি আরম্ভ না করেন bytes_read
তবে আপনি যদি নিরাপদ করেন তবে নিরাপদ। ( সাধারণত ফাংশনগুলি কোনও ত্রুটির ক্ষেত্রে এমনকি তাদের আউট-প্যারামিটারগুলি পূরণ করার কথা : আসলেই নয় Qu বেশিরভাগ ক্ষেত্রে আউটপুটগুলি হয় একা বা অপরিবর্তিত থাকে))
err_t
দ্বারা ফিরে আসা উপেক্ষা করার কোন কারণ আছে my_read()
? উদাহরণে কোথাও যদি বাগ থাকে তবে তা।
bytes_read
পরিবর্তিত হয় না (তাই শূন্য রাখা থাকে) তবে এটি কেন বাগ হওয়ার কথা? যতক্ষণ নাbytes_read!=0
পরে স্পষ্টতই এটি প্রত্যাশা করে না ততক্ষণ প্রোগ্রামটি বুদ্ধিমান পদ্ধতিতে চালিয়ে যেতে পারে । সুতরাং এটি জরিমানা স্যানিটাইজাররা অভিযোগ করবেন না। অন্যদিকে, যখনbytes_read
আগে শুরু করা হয় না, প্রোগ্রামটি বুদ্ধিমান পদ্ধতিতে চালিয়ে যেতে সক্ষম হবে না, সুতরাং আরম্ভ না করাbytes_read
আসলে একটি বাগটি প্রবর্তন করে যা আগে ছিল না।