Cyclone زبان برنامه نویسی

از ویکی‌پدیا، دانشنامهٔ آزاد
Cyclone
AT&T Labs طراحی شده توسط
دانشگاه کرنل توسعه دهنده
2002، 21 سال قبل اولین بار در این تاریخ دیده شد
1.0، 8 می 2006؛ 17 سال قبل انتشار باثبات
http://cyclone.thelanguage.org/ وبسایت
C تحت تاثیر قرار گرفته از
راست, Project Verona تحت تاثیر قرار داد

زبان برنامه نویسی Cyclone یک زیرمجموعه امن از زبان C در نظر گرفته شده. Cyclone به منظور جلوگیری از سرریز بافر و دیگر آسیب پذیری هایی که در برنامه های C احتمال وقوع دارندف طراحی شده است، بدون از دست دادن قدرت و آسودگیِ زبان C به عنوان یک ابزار برنامه نویسی سیستمی.

توسعه Cyclone به عنوان یک پروژه مشترک بین AT&T Labs Research و تیم گِرِگ موریست در دانشگاه کرنل در سال 2001 آغاز شد.

ورژن 1.0 در تاریخ 8 می 2006 عرضه شد.[۱][۲]

ویژگی های زبان[ویرایش]

زبان Cyclone برای جلوگیری از بعضی دام های رایج زبان C تلاش می کند، در حالی که هم چنان جلوه و عملکردش را حفظ کرده. به این منظور، Cyclone محدودیت های زیر را در برنامه ها قرار می دهد:

  • چک های NULL برای جلوگیری از خطای بخش بندی(Segmentation fault) درج می شوند
  • اشاره گر حسابی محدود شده است
  • اشاره گر ها باید قبل از استفاده مقدار دهی اولیه شوند ( این مورد توسط آنالیز تخصیص قطعی اجرا می شود)
  • اشاره‌گرهای معلق از طریق آنالیز منطقه ای و محدودیت های روی ()free جلوگیری می شوند
  • تنها قالب ها و اتصالات "امن" مجاز هستند
  • goto در محدوده ها غیر مجاز هستند
  • برچسب های switch در محدوده های متفاوت غیر مجاز هستند
  • توابعی که یک اشاره گر بر می گردانند باید return را اجرا کنند
  • setjmp و longjmp پشتیبانی نمی شوند


برای حفظ مجموعه ابزاری که برنامه نویسان C به آن عادت دارند، Cyclone افزونه های زیر را فراهم می کند:

  • اشاره گر های Never-null نیاز به چک کردن null ندارند
  • اشاره گر های "چاق"، اشاره گر حسابی را همراه بررسی مرز ها در زمان اجرا پشتیبانی می کند
  • ناحیه های قابل رشد فرمی از مدیریت امن حافظه را پشتیانی می کند
  • بازیافت حافظه برای مقادیر تخصیص یافته به پشته
  • اتصالات علامت گذاری شده از انواع متفاوت آرگومان ها پشتیبانی می کنند
  • تزریقات، کمک به خودکار سازی عمل استفاده از اتصالات علامت گذاری شده برای برنامه نویسان می کنند
  • چندریختی بعضی از استفاده های * void را جایگزین می کند
  • varargs به عنوان اشاره گر های چاق اجرا می شوند
  • استثنا ها بعضی از استفاده های setjmp و longjmp جایگزین می کنند


برای معرفی بهتر و سطح بالاتر به زبان Cyclone، دلیل وجود Cyclone و منبع تمام این لیست ها، این مقاله را مشاهده کنید.

Cyclone در کل بسیار شبیه به C است، اما باید به عنوان یک زبان شبه-C دیده شود.

انواع اشاره گر ها[ویرایش]

Cyclone سه نوع اشاره گر را پیاده سازی می کند:


هدف از معرفی کردن این اشاره گر های جدید برای جلوگیزی از مشکلات رایج به هنگام استفاده از اشاره گر ها است. برای مثال یک تابع را در نظر بگیرید به نام foo که یک اشاره گر به یک int است:

int foo(int *);

اگرچه فردی که تابع foo را نوشته می توانست چک کردن NULL را درج کند، اما بنا به دلایل عملکرد فرض می کنیم که اینکار را انجام نداده است. صدا زدن foo(NULL) به عنوان یک رفتار نامشخص نتیجه خواهد داد (معمولا، اگرچه لازم نیست، یک سیگنال خطای بخش بندی به برنامه در حال ارسال است). برای جلوگیری از مشکلاتی نظیر این، Cyclone اشاره گر @ را معرفی می کند، که هیچگاه نمی تواند NULL باشد. بنابراین، ورژن امنِ تابع foo به این صورت در می آید:

int foo(int @);

برای جلوگیری از رفتار نامشخص فوق الذکر، این به کامپایلر Cyclone می گوید که آرگومان ورودی foo هیچ گاه نباید NULL باشد. تغییر ساده * به @ برنامه نویس را از نوشتن کد برای چک کردن NULL خلاص می کند و سیستم عامل را برای مجبور بودن به دام انداختن اشاره گر NULL عدم ارجاعات. این محدودیت اضافه، با این حال می تواند نسبتا مانع بزرگی برای بیشتر برنامه نویسان C باشد، که به دستکاری کردن اشاره گر هایشان مستقیما با اعمال حسابی عادت کردند. اگرچه این مطلوب است، ولی می تواند به سرریز بافر , و دیگر اشتباهات یک به یک مانند ختم شود. برای پیشگیری این مشکل، اشاره گر نوع ? با یک مرز شناخته شده محدود می شود، اندازه آرایه. اگرچه این به دلیل اطلاعات اضافی ذخیره شده در مورد اشاره گر، سربار اضافه می کند، ایمنی و امنیت آن را بهبود می بخشد. به عنوان یک مثال ساده تابع strlen در نظر بگیرید که در C نوشته شده است:

 int strlen(const char *s)
 {
     int i = 0;
     if (s == NULL)
        return 0;
     while (s[i] != '\0') {
        i++;
     }
     return i;
 }

این تابع فرض می‌کند که رشته‌ای که در آن ارسال می‌شود با '\0' NULL خاتمه می‌یابد. با این حال، چه اتفاقی می افتد اگر char buf[6] = {'h','e','l','l','o','!'}; به این رشته ارسال شود؟ این در C کاملاً قانونی است، اما باعث می شود strlen از طریق حافظه تکرار شود که لزوماً با رشته s مرتبط نیست. توابعی مانند strnlen وجود دارد که می توان از آنها برای جلوگیری از چنین مشکلاتی استفاده کرد، اما این توابع با هر پیاده سازی ANSI C استاندارد نیستند. نسخه Cyclone strlen چندان متفاوت از نسخه C نیست:

 int strlen(const char ? s)
 {
    int i, n = s.size;
    if (s == NULL)
       return 0;
    for (i = 0; i < n; i++, s++) {
       if (*s == '\0')
          return i;
    }
    return n;
 }

در اینجا، strlen خود را با طول آرایه ارسال شده به آن محدود می کند، بنابراین از طول واقعی عبور نمی کند. هر یک از انواع نوع اشاره گر را می توان با خیال راحت به هر یک از موارد دیگر فرستاد، و آرایه ها و رشته ها به طور خودکار به ? توسط کامپایلر تبدیل می شوند. (تغییر دادن از ? به @ هر دو چک کردن NULL و یک چک کردن مرزی را فراخوانی می کند. تغییر دادن از * به ? به هر حال نتیجه در هیچ چک نکردنی می دهد؛ در نتیجه اشاره گر ? اندازه 1 دارد.)

اشاره گر های معلق و آنالیز ناحیه ای[ویرایش]

کد زیر را در C در نظر بگیرید:

 char *itoa(int i)
 {
    char buf[20];
    sprintf(buf,"%d",i);
    return buf;
 }

تابع itoa آرایه ای از کاراکترهای buf را در پشته تخصیص می دهد و یک اشاره گر را به شروع buf برمی گرداند. با این حال، حافظه ای که در پشته برای buf استفاده می شود، زمانی که تابع برمی گرداند، تخصیص داده می شود، بنابراین مقدار بازگشتی نمی تواند به طور ایمن خارج از تابع استفاده شود. در حالی که مجموعه کامپایلر جی سی سی و سایر کامپایلرها در مورد چنین کدی هشدار می دهند، موارد زیر معمولاً بدون اخطار کامپایل می شوند:

 char *itoa(int i)
 {
    char buf[20], *z;
    sprintf(buf,"%d",i);
    z = buf;
    return z;
 }

مجموعه کامپایلر جی سی سی می تواند اخطارهایی را برای چنین کدهایی به عنوان اثر جانبی گزینه -O2 یا -O3 ایجاد کند، اما هیچ تضمینی وجود ندارد که همه این خطاها شناسایی شوند. Cyclone تجزیه و تحلیل منطقه ای هر بخش از کد را انجام می دهد و از نشانگرهای معلق مانند آنچه از این نسخه از itoa برگردانده شده است جلوگیری می کند. همه متغیرهای محلی در یک محدوده معین به عنوان بخشی از همان منطقه، جدا از پشته یا هر منطقه محلی دیگر در نظر گرفته می شوند. بنابراین، هنگام تجزیه و تحلیل itoa، کامپایلر Cyclone می بیند که z یک اشاره گر در پشته محلی است و یک خطا را گزارش می دهد.

همچنین ببینید[ویرایش]

منابع[ویرایش]

  1. "Open Access Cyclone (programming language) Journals · OA.mg". oa mg
  2. "Cyclone"و "Cornell University"

لینک های خارجی[ویرایش]


ارائه ها:

  1. "Cyclone".
  2. "دانشگاه کرنل".