Cyclone è un linguaggio di programmazione rilasciato l'8 maggio 2006 ed inteso a diventare un dialetto sicuro del C. Infatti a differenza di quest'ultimo riesce a evitare i buffer overflows e altre vulnerabilità endemiche del linguaggio C, senza perdere la potenza e la convenienza della programmazione strutturata.
| Cyclone linguaggio di programmazione | |
|---|---|
| Autore | AT & T Labs, Cornell University |
| Data di origine | 2001 |
| Ultima versione | 1.0 |
| Utilizzo | Generico (alta efficienza) |
| Paradigmi | Programmazione procedurale, Programmazione strutturata |
| Tipizzazione | Statica |
| Influenzato da | C |
| Ha influenzato | Rust |
| Implementazione di riferimento | |
| Implementazione | GCC |
| Sistema operativo | Microsoft Windows |
| Sito web | cyclone.thelanguage.org |
| Modifica dati su Wikidata · Manuale | |
Lo sviluppo di Cyclone è iniziato come un progetto congiunto di gruppo tra AT & T Labs e Greg Morrisett della Cornell University, nel 2001.
Cyclone riesce ad evitare alcuni dei problemi comuni di C, pur mantenendo il suo aspetto e le prestazioni. A tal fine, Cyclone pone i seguenti limiti sui programmi:
NULL per evitare errori di segmentazionefree() limitatisetjmp e longjmp non supportatiAl fine di mantenere i tool set che vengono usati dai programmatori del C, Cyclone fornisce le seguenti estensioni:
NULL non richiedono i controlli NULLvoid * rimpiazzate dal polimorfismosetjmp e longjmpCyclone implementa tre tipologie di riferimenti (seguendo la terminologia del C):
* (puntatore comune)@ (puntatore never-NULL)? (puntatore con supporto dei puntatori aritmetici e dei puntatori "Fat").
Questi nuovi tipi di puntatore sono stati introdotti per evitare i problemi più comuni. Prendiamo in considerazione la funzione foo, che indirizza il puntatore ad un intero:
int foo(int *);
Si suppone che l'ideatore del controllo foo non lo abbia inserito tramite controlli NULL per motivi di prestazioni, infatti chiamando foo(NULL); il codice si tradurrebbe in un segnale SIGSEGV. Per evitare tali problemi, Cyclone introduce il tipo di puntatore Never-Null @. Perciò la versione "sicura" di foo sarebbe:
int foo(int @);
In questo modo il compilatore comprende che foo è Never-NULL, evitando il suddetto comportamento indefinito. Il semplice scambio di * in @. permette al programmatore di evitare la scrittura dei controlli NULL. Questo limite in più, tuttavia, può essere un grande ostacolo per la maggior parte dei programmatori C, abituati a manipolare i puntatori direttamente con l'aritmetica, che porterebbero però a buffer overflows e altri errori simili. Per evitare ciò, il puntatore ? è designato per questa funzione. Anche se questo aggiungerebbe delle informazioni supplementari, migliora la sicurezza. Prendete per esempio una semplice funzione strlen, scritta in C:
int strlen(const char *s)
{
int iter = 0;
if (s == NULL)
return 0;
while (s[iter] != '\0') {
iter++;
}
return iter;
}
Questa funzione presuppone che la stringa venga passata e terminata dal controllo NULL('\0'). Tuttavia risconteremmo errori nel passargli un array. Anche se questo errore non verrebbe riconosciuto in C, necessiterebbe dell'uso di strlen per correggere l'allocazione della memoria sulla stringa s, anche se queste funzioni non sono standard con ogni implementazione della versione ANSI C. Cyclone, infatti fa un uso di strlen non poi così diverso dal C:
int strlen(const char ? s)
{
int iter, n = s.size;
if (s == NULL)
return 0;
for (iter = 0; iter < n; iter++, s++) {
if (*s == '\0')
return iter;
}
return n;
}
Possiamo notare, nell'esecuzione del codice, i limiti di strlen nel passaggio della lunghezza della matrice. Il ? viene usato come puntatore indirizzato dal compilatore agli array, (il passaggio da * a ? pone un controllo sui limiti, infatti se avessimo usato il puntatore @ al posto di ? avremmo dovuto usare degli ulteriori controlli NULL e un casting da * a ? per ogni controllo NULL)
Prendete in considerazione il seguente codice, scritto in C:
char *itoa(int i)
{
char buf[20];
sprintf(buf,"%d",i);
return buf;
}
Il codice restituisce il valore di un oggetto allocato sullo stack della funzione itoa, che non sarà più disponibile dopo l'esecuzione delle istruzioni. Mentre GCC e altri compilatori mettono in guardia su questo codice, i seguente verrà compilato senza problemi:
char *itoa(int i)
{
char buf[20], *z;
sprintf(buf,"%d",i);
z = buf;
return z;
}
Cyclone, facendo un'analisi regionale, blocca i puntatori del come itoa, rendendo le variabili locali separate dal gruppo o da qualsiasi altra regione. In questo modo, inizializzando itoa, il compilatore vedrebbe che z punta allo stack locale, riscontrando degli errori.
|
|
Questa sezione sull'argomento informatica è ancora vuota. Aiutaci a scriverla!
|
Il migliore esempio del linguaggio Cyclone è il classico programma Hello world:
#include <stdio.h>
#include <core.h>
using Core;
int main(int argc, string_t ? args)
{
if (argc <= 1) {
printf("Usage: hello-cyclone <name>\n");
return 1;
}
printf("Hello from Cyclone, %s\n", args[1]);
return 0;
}
Documentazioni: