Frage

Mit diesem Code betrachtet, VC9 nicht erkennt 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 */

Die offensichtliche Lösung ist eine temporäre zu verwenden:

void rotate_cw(vec_t const *from,
               vec_t       *to)
{
        int temp = from->x;
        to->x = from->y;
        to->y = -temp;
}

Ist das Standardverhalten? Ich hatte erwartet, dass der Compiler, es sei denn, so sagte, würde davon ausgehen, beide Zeiger möglicherweise aliased werden.

War es hilfreich?

Lösung

diese Antwort Schauen Sie sich.

Versuchen Sie __restrict vor den Parametern , scheint der einzige Weg, jemand, der immer MSVC zu geben, alle Warnungen gefunden werden.

Andere Tipps

Der Code geschrieben ist vollkommen gültig, in C89 oder C99. Es ist unklar, aber es ist nichts für die Compiler zu diagnostizieren, so dass es nicht diagnostizieren.

Wenn Sie C99 verwendet und ‚beschränken‘ auf beiden Parameter der Funktion, dann würden Sie eine Fehlermeldung erhalten - wenn Ihr Compiler C99 unterstützt. AFAIK, keine aktuelle Version von MSVC unterstützt noch C99 vollständig.

Vor der C99 die restrict Qualifikationsspiel erfunden, enthalten einige C-Compiler-Optimierungsoptionen, die sie lenken würden bestimmte Annahmen über Zeiger Nutzung zu machen; die Handbücher ich für eine solche Compiler gesehen habe gewarnt ausdrücklich, dass solche Optimierungen waren nicht standardkonformer und willkürlich Code unter Verwendung von bestimmten speziellen Konstrukte, deren Verhalten verursachen kann durch die Norm definiert wurde in einer Weise zu verhalten, die war im Gegensatz zu der Standard- und Programmierern Absicht. Aus der Sicht des Handbuchs, sagte die Optimierungen der Compiler eine Teilmenge von C zu kompilieren, die nicht das Verhalten bestimmter Sonderfälle definieren, die in C definiert wurden, aber die Erzeugung von effizienteren Code für die Fälle erlauben würden, hat definieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top