আজ আমরা একটি বাজে বাগের কারণ খুঁজে পেয়েছি যা কেবলমাত্র নির্দিষ্ট প্ল্যাটফর্মে মাঝে মধ্যেই ঘটেছিল। সিদ্ধ হয়ে গেছে, আমাদের কোডটি এমন দেখাচ্ছে:
class Foo {
map<string,string> m;
void A(const string& key) {
m.erase(key);
cout << "Erased: " << key; // oops
}
void B() {
while (!m.empty()) {
auto toDelete = m.begin();
A(toDelete->first);
}
}
}
এই সরল ক্ষেত্রে সমস্যাটি সম্ভবত সুস্পষ্ট বলে মনে হতে পারে: B
কীটির একটি রেফারেন্স A
দেয় যা মুদ্রণের চেষ্টা করার আগে মানচিত্রের এন্ট্রি সরিয়ে দেয়। (আমাদের ক্ষেত্রে এটি মুদ্রিত হয়নি, তবে আরও জটিল উপায়ে ব্যবহার করা হয়েছিল) এটি অবশ্যই অপরিজ্ঞাত আচরণ, যেহেতু key
আহ্বানের পরে ডাঙ্গালিং রেফারেন্স erase
।
এই স্থির তুচ্ছ ছিল - আমরা শুধু থেকে প্যারামিটার প্রকার পরিবর্তন const string&
করতে string
। প্রশ্নটি হ'ল: আমরা কীভাবে প্রথমে এই বাগটি এড়াতে পারি? মনে হচ্ছে উভয় ফাংশনই সঠিক কাজ করেছে:
A
এটি জানার কোনও উপায় নেই যাkey
এটি ধ্বংস করতে চলেছে toB
এটি পাস করার আগে একটি অনুলিপি তৈরি করতে পারতA
, তবে মান দ্বারা বা রেফারেন্সের মাধ্যমে প্যারামিটারগুলি গ্রহণ করা হবে কিনা তা সিদ্ধান্ত নেওয়া কলির কাজ নয়?
কিছু নিয়ম আমরা অনুসরণ করতে ব্যর্থ হয় কি?