Cyclone| AT&T Labs | طراحی شده توسط |
| دانشگاه کرنل | توسعه دهنده |
| 2002، 21 سال قبل | اولین بار در این تاریخ دیده شد |
| 1.0، 8 می 2006؛ 17 سال قبل | انتشار باثبات |
|  | وبسایت |
| 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 سه نوع اشاره گر را پیاده سازی می کند:

* `*` (نوع معمولی)
* `@` (اشاره گر نوع never-`NULL`)
* `?` (تنها نوع اشاره گر حسابی مجاز، اشاره گر های "چاق")

  

هدف از معرفی کردن این اشاره گر های جدید برای جلوگیزی از مشکلات رایج به هنگام استفاده از اشاره گر ها است. برای مثال یک تابع را در نظر بگیرید به نام `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"

### لینک های خارجی

* صفحه اصلی وبسایت Cyclone
* وبسایت قدیمی
* Cyclone - مخازن و کد منبع
* Cyclone - سوالات متداول
* Cyclone برای برنامه نویسان C
* راهنمای کاربری Cyclone
* Cyclone: یک زیر زبان Type-safe از C توسط دن گروسمن، مایکل هیکس، ترور جیم و گِرِگ موریست - انتشار شده در ژانویه 2005

  

ارائه ها:

* Cyclone: یک زیر زبان Type-safe از C
* Cyclone: یک زبان در سطح C و حافظه ایمن

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