Циклон (язык программирования)
Эта статья включает список общих ссылок , но в ней отсутствуют достаточные соответствующие встроенные цитаты . ( Август 2015 г. ) |
Разработано | Лаборатории AT&T |
---|---|
Разработчик | Корнелльский университет |
Впервые появился | 2002 год |
Стабильная версия | 1.0
/ 8 мая 2006 г |
Веб-сайт | циклон |
Под влиянием | |
С | |
Под влиянием | |
Руст , Проект Верона |
Язык Cyclone программирования задумывался как безопасный диалект языка C. [2] . Он позволяет избежать переполнения буфера и других уязвимостей, которые изначально возможны в программах на языке C, не теряя при этом мощности и удобства языка C как инструмента системного программирования . Он больше не поддерживается первоначальными разработчиками, а эталонный инструментарий не поддерживает 64-битные платформы . Cyclone . Первоначальные разработчики упоминают язык Rust как интегрировавший многие из тех же идей, что и [3]
Разработка Cyclone началась как совместный проект Тревора Джима из AT&T Labs Research и Грега Моррисетта группы в Корнелльском университете в 2001 году. Версия 1.0 была выпущена 8 мая 2006 года. [4]
Особенности языка
[ редактировать ]Cyclone пытается избежать некоторых распространенных ошибок C , сохраняя при этом его внешний вид и производительность. С этой целью Cyclone накладывает на программы следующие ограничения:
NULL
проверки вставляются для предотвращения ошибок сегментации- Арифметика указателей ограничена
- Указатели должны быть инициализированы перед использованием (это обеспечивается путем анализа определенного присваивания ).
- Висячие указатели предотвращаются за счет анализа региона и ограничений на
free()
- Разрешены только «безопасные» приведения и объединения.
goto
в области запрещеноswitch
метки в разных областях запрещены- Функции, возвращающие указатель, должны выполняться
return
setjmp
иlongjmp
не поддерживаются
Для поддержки набора инструментов, к которому привыкли программисты на C, Cyclone предоставляет следующие расширения:
- Никогда-
NULL
указатели не требуютNULL
чеки - во время выполнения. «Толстые» указатели поддерживают арифметику указателей с проверкой границ
- Расширяемые регионы поддерживают форму безопасного ручного управления памятью.
- Сбор мусора для значений, размещенных в куче
- Теговые объединения поддерживают аргументы, изменяющиеся по типу.
- Инъекции помогают программистам автоматизировать использование теговых объединений.
- Полиморфизм заменяет некоторые варианты использования
void *
- varargs реализованы как жирные указатели
- Исключения заменяют некоторые варианты использования
setjmp
иlongjmp
Более подробное введение в Cyclone, обоснование Cyclone и источник этих списков можно найти в этой статье .
В целом Cyclone очень похож на C, но его следует рассматривать как C-подобный язык.
Типы указателей
[ редактировать ]Cyclone реализует три типа указателей :
*
(обычный тип)@
(никогда-NULL
указатель) и?
(единственный тип, допускающий арифметику указателей , «толстые» указатели ).
Цель введения этих новых типов указателей — избежать распространенных проблем при использовании указателей. Возьмем, к примеру, функцию под названием 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
является указателем на локальный стек и сообщит об ошибке.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Журналы открытого доступа Cyclone (язык программирования) · OA.mg» . оа.мг.
- ^ Джим, Тревор; Моррисетт, Дж. Грег; Гроссман, Дэн; Хикс, Майкл В.; Чейни, Джеймс; Ван, Яньлин (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 ( ссылка ) - ^ «Циклон» . cyclone.thelanguage.org . Проверено 11 декабря 2023 г.
- ^ «Циклон» . Корнеллский университет .
Внешние ссылки
[ редактировать ]- Домашняя страница Циклона
- Старый веб-сайт
- Cyclone — репозитории исходного кода
- Циклон - Часто задаваемые вопросы
- Циклон для программистов на языке C.
- Руководство пользователя Циклона.
- Cyclone: a Type-safe Dialect of C Дэна Гроссмана, Майкла Хикса, Тревора Джима и Грега Моррисетта - опубликовано в январе 2005 г.
Презентации: