limitare-edness con pre-C99
-
12-09-2019 - |
Domanda
Considerando questo codice, VC9 non rileva aliasing:
typedef struct { int x, y; } vec_t;
void rotate_cw(vec_t const *from,
vec_t *to)
{
/* Notice x depends on y and vice versa */
to->x = from->y;
to->y = -from->x;
}
/* ... */
vec_t a, b;
rotate_cw(&a, &b); /* OK, no aliasing */
rotate_cw(&a, &a); /* FAIL, aliasing is not detected */
La correzione ovvia è quella di utilizzare una temporanea:
void rotate_cw(vec_t const *from,
vec_t *to)
{
int temp = from->x;
to->x = from->y;
to->y = -temp;
}
E 'questo comportamento standard? Mi aspettavo che il compilatore, a meno che detto così, avrebbe assunto sia puntatori per essere possibilmente alias.
Soluzione
Prova a mettere __restrict prima i parametri , sembra essere l'unico modo in cui nessuno trovato di ottenere MSVC per dare eventuali avvisi.
Altri suggerimenti
Il codice come scritto è perfettamente valido, in C89 o C99. E 'oscuro, ma non c'è nulla per il compilatore per diagnosticare, in modo da non diagnosticare.
Se è stato utilizzato C99 e 'limitare' su entrambi i parametri della funzione, allora si otterrebbe un errore - se il vostro compilatore supporta C99. Per quanto ne so, nessuna versione corrente di MSVC ancora sostiene pienamente C99.
Prima di C99 ha inventato il qualificatore restrict
, alcuni compilatori C incluso opzioni di ottimizzazione, che avrebbe diretto loro di fare alcune ipotesi circa l'uso del puntatore; i manuali che ho visto per tali compilatori espressamente avvertito che tali ottimizzazioni erano non è conforme agli standard , e possono causare arbitrariamente codice utilizzando alcuni costrutti particolari il cui comportamento è stato definito dallo standard a comportarsi in un modo che era contrario sia allo standard e l'intenzione programmatore. Dal punto di vista del manuale, le ottimizzazioni detto al compilatore per compilare un sottoinsieme di C che non definiscono il comportamento di taluni casi angolo che sono stati definiti in C, ma che permetterebbero la generazione di codice più efficiente per quei casi ha definito.