سایکلون (زبان برنامه‌نویسی) کیست؟ توضیح بده.
زبان برنامه‌نویسی سایکلون به عنوان گویش امن زبان cدر نظر گرفته شده‌است. سایکلون برای جلوگیری از سرریز بافر و سایر آسیب‌پذیری‌هایی که در برنامه‌های C امکان‌پذیر است، بدون از دست دادن قدرت و راحتی C به عنوان ابزاری برای برنامه‌نویسی سیستم، طراحی شده‌است.توسعه سایکلون به عنوان پروژه مشترک پژوهش و گروه در دانشگاه کرنل در سال ۲۰۰۱ آغاز شد. نسخه ۱٫۰ در ۸ می ۲۰۰۶ منتشر شد.ویژگی‌ها.زبان Cyclone برای جلوگیری از بعضی دام های رایج تلاش می کند، در حالی که هم چنان جلوه و عملکردش را حفظ کرده. به این منظور، Cyclone محدودیت های زیر را در برنامه ها قرار می دهد:برای حفظ مجموعه ابزاری که برنامه نویسان C به آن عادت دارند، Cyclone افزونه های زیر را فراهم می کند:برای معرفی بهتر و سطح بالاتر به زبان Cyclone، دلیل وجود Cyclone و منبع تمام این لیست ها، این مقاله را مشاهده کنید.Cyclone در کل بسیار شبیه به C است، اما باید به عنوان یک زبان شبه-C دیده شود.انواع اشاره گر ها.Cyclone سه نوع را پیاده سازی می کند:هدف از معرفی کردن این اشاره گر های جدید برای جلوگیزی از مشکلات رایج به هنگام استفاده از اشاره گر ها است. برای مثال یک تابع را در نظر بگیرید به نام codice_14 که یک اشاره گر به یک int است:int foo(int *);اگرچه فردی که تابع codice_14 را نوشته می توانست چک کردن codice_12 را درج کند، اما بنا به دلایل عملکرد فرض می کنیم که اینکار را انجام نداده است. صدا زدن codice_17 به عنوان یک نتیجه خواهد داد (معمولا، اگرچه لازم نیست، یک به برنامه در حال ارسال است). برای جلوگیری از مشکلاتی نظیر این، Cyclone اشاره گر codice_11 را معرفی می کند، که هیچگاه نمی تواند codice_12 باشد. بنابراین، ورژن امنِ تابع codice_14 به این صورت در می آید:int foo(int @);برای جلوگیری از رفتار نامشخص فوق الذکر، این به کامپایلر Cyclone می گوید که آرگومان ورودی codice_14 هیچ گاه نباید codice_12 باشد. تغییر ساده codice_10 به codice_11 برنامه نویس را از نوشتن کد برای چک کردن codice_12 خلاص می کند و سیستم عامل را برای مجبور بودن به دام انداختن اشاره گر codice_12 عدم ارجاعات. این محدودیت اضافه، با این حال می تواند نسبتا مانع بزرگی برای بیشتر برنامه نویسان C باشد، که به دستکاری کردن اشاره گر هایشان مستقیما با اعمال حسابی عادت کردند. اگرچه این مطلوب است، ولی می تواند به , و دیگر اشتباهات یک به یک مانند ختم شود. برای پیشگیری این مشکل، اشاره گر نوع codice_13 با یک مرز شناخته شده محدود می شود، اندازه آرایه. اگرچه این به دلیل اطلاعات اضافی ذخیره شده در مورد اشاره گر، سربار اضافه می کند، ایمنی و امنیت آن را بهبود می بخشد. به عنوان یک مثال ساده تابع codice_28 در نظر بگیرید که در C نوشته شده است: int strlen(const char *s) int i = 0; if (s == NULL) return 0; while (s[i] != '\0') { i++; return i;این تابع فرض می‌کند که رشته‌ای که در آن ارسال می‌شود با خاتمه می‌یابد. با این حال، چه اتفاقی می افتد اگر به این رشته ارسال شود؟ این در C کاملاً قانونی است، اما باعث می شود codice_28 از طریق حافظه تکرار شود که لزوماً با رشته codice_30 مرتبط نیست. توابعی مانند codice_31 وجود دارد که می توان از آنها برای جلوگیری از چنین مشکلاتی استفاده کرد، اما این توابع با هر پیاده سازی استاندارد نیستند. نسخه Cyclone codice_28 چندان متفاوت از نسخه C نیست: int strlen(const char ? s) int i, n = s.size; if (s == NULL) return 0; for (i = 0; i &lt; n; i++, s++) { if (*s == '\0') return i; return n;در اینجا، codice_28 خود را با طول آرایه ارسال شده به آن محدود می کند، بنابراین از طول واقعی عبور نمی کند. هر یک از انواع نوع اشاره گر را می توان با خیال راحت به هر یک از موارد دیگر فرستاد، و آرایه ها و رشته ها به طور خودکار به codice_13 توسط کامپایلر تبدیل می شوند. (تغییر دادن از codice_13 به codice_11 هر دو چک کردن codice_12 و یک را فراخوانی می کند. تغییر دادن از codice_10 به codice_13 به هر حال نتیجه در هیچ چک نکردنی می دهد؛ در نتیجه اشاره گر codice_13 اندازه 1 دارد.)اشاره گر های معلق و آنالیز ناحیه ای.کد زیر را در C در نظر بگیرید: char *itoa(int i) char buf[20]; sprintf(buf,"%d",i); return buf;تابع codice_41 آرایه ای از کاراکترهای codice_42 را در پشته تخصیص می دهد و یک اشاره گر را به شروع codice_42 برمی گرداند. با این حال، حافظه ای که در پشته برای codice_42 استفاده می شود، زمانی که تابع برمی گرداند، تخصیص داده می شود، بنابراین مقدار بازگشتی نمی تواند به طور ایمن خارج از تابع استفاده شود. در حالی که مجموعه کامپایلر و سایر کامپایلرها در مورد چنین کدی هشدار می دهند، موارد زیر معمولاً بدون اخطار کامپایل می شوند: char *itoa(int i) char buf[20], *z; sprintf(buf,"%d",i); z = buf; return z;مجموعه کامپایلر جی سی سی می تواند اخطارهایی را برای چنین کدهایی به عنوان اثر جانبی گزینه codice_45 یا codice_46 ایجاد کند، اما هیچ تضمینی وجود ندارد که همه این خطاها شناسایی شوند. Cyclone تجزیه و تحلیل منطقه ای هر بخش از کد را انجام می دهد و از نشانگرهای معلق مانند آنچه از این نسخه از codice_41 برگردانده شده است جلوگیری می کند. همه متغیرهای محلی در یک محدوده معین به عنوان بخشی از همان منطقه، جدا از پشته یا هر منطقه محلی دیگر در نظر گرفته می شوند. بنابراین، هنگام تجزیه و تحلیل codice_41، کامپایلر Cyclone می بیند که codice_49 یک اشاره گر در پشته محلی است و یک خطا را گزارش می دهد.لینک های خارجی.ارائه ها: