رفتار نامشخص
این مقاله نیازمند ویکیسازی است. لطفاً با توجه به راهنمای ویرایش و شیوهنامه، محتوای آن را بهبود بخشید. |
در برنامهنویسی کامپیوتر رفتار نامشخص (به انگلیسی: undefined behavior) نتیجهٔ اجرای یک کد کامپیوتری است که این نتیجه متناسب با حالت فعلی برنامه و روال زبان برنامهنویسی نیست.
رفتار نامشخص زمانی اتفاق میافتد که مترجم کد ( کامپایلر یا مفسر) فرضیات مشخصی داشته باشد اما این فرضیات در طول زمان اجرای کد ارضا نشوند.
رفتار برخی از زبانهای برنامهنویسی (بهطور ویژه زبانهای 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