C++-এ কিছু অনডিফাইনড বিহেভিয়র (Undefined Behavior - UB) রয়েছে যা প্রোগ্রামারের জানা দরকার। এগুলো কম্পাইল টাইমে ক্যাচ না হয়ে রানটাইমে অপ্রত্যাশিত ফলাফল বা ক্র্যাশ করতে পারে। নিচে কিছু সাধারণ UB উদাহরণ দেওয়া হলো।
১. শূন্য দিয়ে ভাগ (Divide by Zero)
#include <iostream>
using namespace std;
int main() {
int x = 10, y = 0;
int z = x / y; // UB: রানটাইম এরর
cout << "Done" << endl;
}
আউটপুট
Runtime error for divide by zero operation
২. অনইনিশিয়ালাইজড ভেরিয়েবল ব্যবহার
#include <iostream>
using namespace std;
int main() {
bool x; // ইনিশিয়ালাইজড নয়
if (x == true)
cout << "true value";
else
cout << "false value"; // কম্পাইলার অনুযায়ী ফলাফল ভিন্ন হতে পারে
}
আউটপুট
false value (This may differ in different compilers)
৩. নাল পয়েন্টার ডিরেফারেন্স
#include <iostream>
using namespace std;
int main() {
int* ptr = NULL;
cout << "Value: " << *ptr; // UB: সেগমেন্টেশন ফল্ট
}
আউটপুট
Runtime error for accessing null pointer values
৪. অ্যারে বাউন্ডস বাইরে অ্যাকসেস
#include <iostream>
using namespace std;
int main() {
int array[10];
for (int i = 0; i <= 10; i++) // i=10 বাউন্ডস বাইরে
cout << array[i] << endl; // UB: অপ্রত্যাশিত মান বা ক্র্যাশ
}
আউটপুট
Runtime error or arbitrary values
৫. সাইনড ইন্টিজার ওভারফ্লো
#include <iostream>
#include <climits>
using namespace std;
int main() {
int x = INT_MAX;
cout << "x + 1: " << x + 1; // UB: wraparound হয়
}
আউটপুট
x + 1: -2147483648 (minimum signed int value)
৬. স্ট্রিং লিটারেল মডিফাই করা
#include <iostream>
using namespace std;
int main() {
char* str = "Hello World";
str[2] = 'x'; // UB: রিড-অনলি মেমরি মডিফাই
cout << str;
}
আউটপুট
Runtime error (trying to modify constant memory)
পরামর্শ: সানিটাইজার (AddressSanitizer, UBSan) ব্যবহার করে ডেভেলপমেন্ট সময় UB ধরা যায়। আধুনিক C++ (smart pointers, std::array, std::string_view ইত্যাদি) ব্যবহার করলে অনেক UB এড়ানো যায়।