Jump to content

Циклон (язык программирования)

Циклон
Разработано Лаборатории AT&T
Разработчик Корнелльский университет
Впервые появился 2002 год ; 22 года назад ( 2002 )
Стабильная версия
1.0 / 8 мая 2006 г .; 18 лет назад ( 08.05.2006 )
Веб-сайт циклон .thelanguage .org
Под влиянием
С
Под влиянием
Руст , Проект Верона

Язык Cyclone программирования задумывался как безопасный диалект языка C. [2] . Он позволяет избежать переполнения буфера и других уязвимостей, которые изначально возможны в программах на языке C, не теряя при этом мощности и удобства языка C как инструмента системного программирования . Он больше не поддерживается первоначальными разработчиками, а эталонный инструментарий не поддерживает 64-битные платформы . Cyclone . Первоначальные разработчики упоминают язык Rust как интегрировавший многие из тех же идей, что и [3]

Разработка Cyclone началась как совместный проект Тревора Джима из AT&T Labs Research и Грега Моррисетта группы в Корнелльском университете в 2001 году. Версия 1.0 была выпущена 8 мая 2006 года. [4]

Особенности языка

[ редактировать ]

Cyclone пытается избежать некоторых распространенных ошибок C , сохраняя при этом его внешний вид и производительность. С этой целью Cyclone накладывает на программы следующие ограничения:

Для поддержки набора инструментов, к которому привыкли программисты на C, Cyclone предоставляет следующие расширения:

Более подробное введение в Cyclone, обоснование Cyclone и источник этих списков можно найти в этой статье .

В целом Cyclone очень похож на C, но его следует рассматривать как C-подобный язык.

Типы указателей

[ редактировать ]

Cyclone реализует три типа указателей :

Цель введения этих новых типов указателей — избежать распространенных проблем при использовании указателей. Возьмем, к примеру, функцию под названием foo который принимает указатель на int:

 int foo(int *);

Хотя человек, написавший функцию foo мог бы вставить NULL проверок, предположим, что по соображениям производительности они этого не сделали. Вызов foo(NULL); приведет к неопределенному поведению (обычно, хотя и не обязательно, SIGSEGV сигнал приложению отправляется ). Чтобы избежать таких проблем, 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;
 }

Эта функция предполагает, что передаваемая строка завершается NULL ( '\0'). Однако что произойдет, если char buf[6] = {'h','e','l','l','o','!'}; были переданы в эту строку? Это совершенно законно в C, но может привести к strlen для перебора памяти, не обязательно связанной со строкой s. Есть такие функции, как strnlen которые можно использовать, чтобы избежать таких проблем, но эти функции не являются стандартными для каждой реализации ANSI C. Версия Циклона 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 освобождается при возврате функции, поэтому возвращаемое значение нельзя безопасно использовать вне функции. Хотя GNU Compiler Collection и другие компиляторы предупреждают о таком коде, следующий код обычно компилируется без предупреждений:

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

Коллекция компиляторов GNU может выдавать предупреждения для такого кода как побочный эффект опции -O2 или -O3, но нет никаких гарантий, что все такие ошибки будут обнаружены. Cyclone выполняет региональный анализ каждого сегмента кода, предотвращая висячие указатели, такие как тот, который возвращается из этой версии itoa. Все локальные переменные в данной области считаются частью одного и того же региона, отдельно от кучи или любого другого локального региона. Таким образом, при анализе itoa, компилятор Cyclone увидит это z является указателем на локальный стек и сообщит об ошибке.

См. также

[ редактировать ]
  1. ^ «Журналы открытого доступа Cyclone (язык программирования) · OA.mg» . оа.мг.
  2. ^ Джим, Тревор; Моррисетт, Дж. Грег; Гроссман, Дэн; Хикс, Майкл В.; Чейни, Джеймс; Ван, Яньлин (10 июня 2002 г.). «Циклон: безопасный диалект C» . Материалы Общего курса ежегодной конференции USENIX Annual Tech Conference . АТЭК '02. США: Ассоциация USENIX: 275–288. doi : 10.5555/647057.713871 (неактивен 3 августа 2024 г.). ISBN  978-1-880446-00-3 . {{cite journal}}: CS1 maint: DOI неактивен по состоянию на август 2024 г. ( ссылка ) CS1 maint: игнорируются ошибки DOI ( ссылка )
  3. ^ «Циклон» . cyclone.thelanguage.org . Проверено 11 декабря 2023 г.
  4. ^ «Циклон» . Корнеллский университет .
[ редактировать ]

Презентации:

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: c782380ece1b51b859c69a88dc471e08__1722688140
URL1:https://arc.ask3.ru/arc/aa/c7/08/c782380ece1b51b859c69a88dc471e08.html
Заголовок, (Title) документа по адресу, URL1:
Cyclone (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)