Content deleted Content added
m →top: HTTP to HTTPS for Cornell University |
|||
(34 intermediate revisions by 22 users not shown) | |||
Line 1:
{{Short description|Memory-safe dialect of the C programming language}}
{{more footnotes|date=August 2015}}
{{Infobox programming language
| name = Cyclone
| logo =
| logo caption
| file ext =
| paradigm =
| released = {{
| designer = [[AT&T Labs]]
| developer = [[Cornell University]]
| latest release version = 1.0
| latest release date = {{
| latest preview version =
| latest preview date = <!-- {{start date and age|YYYY|MM|DD}} -->
Line 16 ⟶ 19:
| dialects =
| influenced by = [[C (programming language)|C]]
| influenced = [[Rust (programming language)|Rust]], [[Project Verona]]
| programming language =
| operating system =
Line 22 ⟶ 25:
| website = {{URL|http://cyclone.thelanguage.org}}
| wikibooks =
| discontinued = Yes<ref>{{cite web |title=Open Access Cyclone (programming language) Journals · OA.mg |url=https://oa.mg/journals/open-access-cyclone-programming-language-journals |website=oa.mg |access-date=30 October 2022 |archive-date=30 October 2022 |archive-url=https://web.archive.org/web/20221030192542/https://oa.mg/journals/open-access-cyclone-programming-language-journals |url-status=live }}</ref>
}}
The '''Cyclone''' [[programming language]]
Cyclone development was started as a joint project of Trevor Jim from [[AT&T Labs]] Research and [[Greg Morrisett]]'s group at [[Cornell University]] in 2001. Version 1.0 was released on May 8, 2006.<ref>{{cite web |title=Cyclone |url=https://www.cs.cornell.edu/Projects/cyclone/ |website=[[Cornell University]] |access-date=30 October 2022 |archive-date=15 October 2022 |archive-url=https://web.archive.org/web/20221015034248/https://www.cs.cornell.edu/Projects/cyclone/ |url-status=live }}</ref>
==Language features==
Line 33 ⟶ 36:
* [[Pointer arithmetic]] is limited
* Pointers must be initialized before use (this is enforced by [[definite assignment analysis]])
* [[Dangling pointer]]s are prevented through region analysis and limits on
* Only "safe" casts and unions are allowed
* [[Control flow|<code>goto</code>]] into scopes is disallowed
* [[Control flow|<code>switch</code>]] labels in different scopes are disallowed
* Pointer-returning functions must execute <code>return</code>
* [[Setjmp
To maintain the tool set that C programmers are used to, Cyclone provides the following extensions:
*
*
*
*
*
*
*
*
*
For a better high-level introduction to Cyclone, the reasoning behind Cyclone and the source of these lists, see [http://www.cs.umd.edu/projects/cyclone/papers/cyclone-safety.pdf this paper].
Cyclone looks, in general, much like
===Pointer types===
Line 61 ⟶ 64:
* <code>?</code> (the only type with [[pointer arithmetic]] allowed, [[fat pointer|"fat" pointer]]s).
The purpose of introducing these new pointer types is to avoid common problems when using pointers. Take for instance a function, called <code>foo</code> that takes a pointer to an int:
<
int foo(int *);
</syntaxhighlight>
Although the person who wrote the function <code>foo</code> could have inserted <code>NULL</code> checks, let us assume that for performance reasons they did not. Calling <code>foo(NULL);</code> will result in [[undefined behavior]] (typically, although not necessarily, a [[SIGSEGV]] [[Unix signal|signal]] being sent to the application). To avoid such problems, Cyclone introduces the <code>@</code> pointer type, which can never be <code>NULL</code>. Thus, the "safe" version of <code>foo</code> would be:
<
int foo(int @);
</syntaxhighlight>
This tells the Cyclone compiler that the argument to <code>foo</code> should never be <code>NULL</code>, avoiding the aforementioned undefined behavior. The simple change of <code>*</code> to <code>@</code> saves the programmer from having to write <code>NULL</code> checks and the operating system from having to trap <code>NULL</code> pointer dereferences. This extra limit, however, can be a rather large stumbling block for most C programmers, who are used to being able to manipulate their pointers directly with arithmetic. Although this is desirable, it can lead to [[buffer overflow]]s and other "off-by-one"-style mistakes. To avoid this, the <code>?</code> pointer type is delimited by a known bound, the size of the array. Although this adds overhead due to the extra information stored about the pointer, it improves safety and security. Take for instance a simple (and naïve) <code>strlen</code> function, written in C:
<
int strlen(const char *s)
{
int
if (s == NULL)
return 0;
while (s[
}
return
}
</syntaxhighlight>
This function assumes that the string being passed in is terminated by
<
int strlen(const char ? s)
{
int
if (s == NULL)
return 0;
for (
if (*s == '\0')
return
return n;
}
</syntaxhighlight>
Here, <code>strlen</code> bounds itself by the length of the array passed to it, thus not going over the actual length. Each of the kinds of pointer type can be safely cast to each of the others, and arrays and strings are automatically cast to <code>?</code> by the compiler. (Casting from <code>?</code> to <code>*</code> invokes a [[bounds checking|bounds check]], and casting from <code>?</code> to <code>@</code> invokes both a <code>NULL</code> check and a bounds check. Casting from <code>*</code> to <code>?</code> results in no checks whatsoever; the resulting <code>?</code> pointer has a size of 1.)
===Dangling pointers and region analysis===
Consider the following code, in C:
<
char *itoa(int i)
{
Line 106 ⟶ 108:
return buf;
}
</syntaxhighlight>
<
char *itoa(int i)
{
Line 116 ⟶ 118:
return z;
}
</syntaxhighlight>
Cyclone does regional analysis of each segment of code, preventing dangling pointers, such as the one returned from this version of <code>itoa</code>. All of the local variables in a given scope are considered to be part of the same region, separate from the heap or any other local region. Thus, when analyzing <code>itoa</code>, the Cyclone compiler would see that <code>z</code> is a pointer into the local stack, and would report an error.
Line 126 ⟶ 128:
==References==
{{Reflist}}
▲{{no footnotes|date=August 2015}}
* [http://cyclone.thelanguage.org/wiki/User%20Manual Cyclone User Manual]▼
* [http://www.cs.umd.edu/~mwh/papers/cyclone-cuj.pdf Cyclone: a Type-safe Dialect of C] by Dan Grossman, Michael Hicks, Trevor Jim, and Greg Morrisett - published January 2005▼
==External links==
* [http://cyclone.thelanguage.org/ Cyclone
* [https://web.archive.org/web/20111227232825/http://www.eecs.harvard.edu/~greg/cyclone/old_cyclone.html Old web site]
▲* [http://cyclone.thelanguage.org/wiki/Download Cyclone - Source code repositories]
* [http://cyclone.thelanguage.org/wiki/Frequently%20Asked%20Questions Cyclone - FAQ]
* [http://cyclone.thelanguage.org/wiki/Cyclone%20for%20C%20Programmers Cyclone for C programmers]
▲* [http://www.cs.umd.edu/~mwh/papers/cyclone-cuj.pdf Cyclone: a Type-safe Dialect of C] by Dan Grossman, Michael Hicks, Trevor Jim, and Greg Morrisett - published January 2005
Presentations:
Line 146 ⟶ 147:
{{DEFAULTSORT:Cyclone (Programming Language)}}
[[Category:C programming language family]]
[[Category:Programming languages created in 2002]]
|