নিম্নলিখিত প্রোগ্রাম বিবেচনা করুন:
#include<stdexcept>
#include<iostream>
int main() {
try {
throw std::range_error(nullptr);
} catch(const std::range_error&) {
std::cout << "Caught!\n";
}
}
Libstdc ++ কল সহ জিসিসি এবং কলঙ্ক std::terminate
এবং বার্তাটি সহ প্রোগ্রামটি বাতিল করে দিন
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct null not valid
ব্যতিক্রম নির্মাণে libc ++ segfaults সঙ্গে ঝাঁকুনি।
গডবোল্ট দেখুন ।
সংকলকরা কি মান-অনুসারে আচরণ করছে? স্ট্যান্ডার্ডের [ডায়াগনস্টিক্স.আরঞ্জ.অররর] (সি +++ এন 4659) এর প্রাসঙ্গিক বিভাগটি বলে যে std::range_error
একটি const char*
নির্মাণকারী ওভারলোড রয়েছে যা ওভারলোডের চেয়ে বেশি পছন্দ করা উচিত const std::string&
। বিভাগটি কনস্ট্রাক্টরের উপর কোনও পূর্বশর্তও বর্ণনা করে না এবং কেবল পোস্টকন্ডিশনকেই জানিয়েছে
Postconditions :
strcmp(what(), what_arg) == 0
।
what_arg
নাল পয়েন্টার হলে এই পোস্টকন্ডিশনে সর্বদা অপরিবর্তিত আচরণ থাকে , সুতরাং এর অর্থ কি এই যে আমার প্রোগ্রামেও অনির্ধারিত আচরণ রয়েছে এবং উভয় সংকলকই সঙ্গতিপূর্ণ আচরণ করে? যদি তা না হয়, তবে একজনের কীভাবে স্ট্যান্ডার্ডটিতে এমন অসম্ভব পোস্টকন্ডিশনগুলি পড়া উচিত?
দ্বিতীয় চিন্তায়, আমি মনে করি এটি অবশ্যই আমার প্রোগ্রামের জন্য অপরিবর্তিত আচরণের অর্থ হওয়া উচিত, কারণ যদি তা না হয় (বৈধ) পয়েন্টারগুলি নাল-টার্মিনেটেড স্ট্রিংগুলিতে নির্দেশ না করে তবে এটিও স্পষ্টভাবে কোনও অর্থবহ নয়।
সুতরাং, এটি সত্য বলে ধরে নিচ্ছি, আমি কীভাবে মানকে এই অনির্ধারিত আচরণকে বোঝায় সেদিকেই প্রশ্নটি আরও केन्द्रিত করতে চাই। এটি কি পোস্টকন্ডিশনের অসম্ভবতা থেকে অনুসরণ করে যে কলটিতেও অনির্ধারিত আচরণ রয়েছে বা পূর্বশর্তটি সহজেই ভুলে গিয়েছিল?
এই প্রশ্নের দ্বারা অনুপ্রাণিত ।
nullptr
পাস হয়ে যায় তবে আমি মনে করব যে what()
মানটি পেতে কোনও সময় এটির অবনতি করতে হবে। এটি একটি ডিগ্রিফারেন্সিং হবে nullptr
, যা সর্বোপরি সমস্যাযুক্ত এবং ক্র্যাশ করার জন্য সবচেয়ে খারাপ এটি।
strcmp
এর মান বর্ণনা করতে ব্যবহৃত হয় what_arg
। সি স্ট্যান্ডার্ড থেকে প্রাসঙ্গিক বিভাগটি যাইহোক বলে, যা এর স্পেসিফিকেশন দ্বারা উল্লেখ করা হয় <cstring>
। অবশ্যই শব্দবন্ধ পরিষ্কার হতে পারে।
what()
গেলে কল করাnullptr
সমস্যার কারণ হতে পারে।