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.

È stato utile?

Soluzione

Check out questa risposta .

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top