رفتار نامشخص

در برنامه‌نویسی کامپیوتر رفتار نامشخص  نتیجهٔ اجرای یک کد کامپیوتری است که این نتیجه متناسب با حالت فعلی برنامه و روال زبان برنامه‌نویسی نیست.

رفتار نامشخص زمانی اتفاق می‌افتد که مترجم کد ( کامپایلر یا مفسر) فرضیات مشخصی داشته باشد اما این فرضیات در طول زمان اجرای کد ارضا نشوند.

رفتار برخی از زبان‌های برنامه‌نویسی (به‌طور ویژه زبان‌های c وc++) درموارد خاصی نا مشخص است.
در استاندارداین زبان‌های برنامه‌نویسی معنای اعمال مشخصی تعریف نشده‌است و نتیجهٔ اجرای این اعمال نامشخص است.

چرا رفتار نامشخص خوب است؟ 
تنها خوبی رفتار نامشخص در زبان‌های برنامه‌نویسی c و c++ این است که این حالت کار کامپایلر را ساده‌تر می‌کند.
برای مثال زمانی که کامپایلر کد یک حلقه را کامپایل می‌کند لازم نیست نگران آن باشد که برای شمارندهٔ حلقه سرریز (overflow) رخ داده یا اینکه شمارنده منفی شده‌است. این کار می‌تواند سرعت اجرای کد حلقه را ۳۰ تا ۵۰ درصد افزایش دهد
واز این جهت برای بالابردن سرعت کامپایلر رفتارنامشخص می‌تواند مفید باشد.

مشکلات رفتار نامشخص 
رفتار نامشخص می‌تواند یک مشکل بد برای کدهایی مانند وب سرورها و مرورگرهای وب باشد.
این رفتار می‌تواند مشکلات امنیتی برای وب سرورها به وجود آورد.

چه زمانی رفتارنامشخص رخ می‌دهد؟ 
رفتار نامشخص می‌تواند در شرایط زیر ایجاد شود:

۱. تلاش برای تغییر دادن literal یک رشته:
مثال:

char *p = "wikipedia";

p[0] = 'W'; // undefined behavior

۲. تقسیم یک عدد صحیح بر صفر:

int x = 1

return x / 0; // undefined behavior

۳. اعمال خاصی بر روی پوینترها:

مثال:

int arr[4] = {0, 1, 2, 3};

int *p = arr + 5; // undefined behavior

۴. خالی گذاشتن بخش return یک تابع که باید مقداری را برگرداند درحالی که از این مقداربازگردانده شده تابع دیگری استفاده می‌کند.

.۵ایجاد تغییرات متوالی بر روی یک متغیر

مثال:

i = ++i + 1; // undefined behavior

منابع 

 http://blog.regehr.org/archives/213
 http://en.cppreference.com/w/cpp/language/ub
 https://gist.github.com/rygorous/e0f055bfb74e3d5f0af20690759de5a7#file-gistfile1-txt-L166
 https://gist.github.com/rygorous/e0f055bfb74e3d5f0af20690759de5a7#file-gistfile1-txt-L166

پیاده‌سازی زبان برنامه‌نویسی
زبان برنامه‌نویسی سی
سی++