でこのコードを考慮すると、VC9は、エイリアシングを検出しません:が制限-ednessを事前C99
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 */
明白な修正が一時的に使用することです:
void rotate_cw(vec_t const *from,
vec_t *to)
{
int temp = from->x;
to->x = from->y;
to->y = -temp;
}
は、この標準の動作ですか?私は、コンパイラは、そう言わない限り、と、ポインタの両方にエイリアスがあると想定していると予想していました。
これは標準的な動作ではありません。少なくともC99とC++ではコンパイラのバグのようです。彼らは明示的に互いをエイリアスすることができます。私はあなたのためのものであるように思われるC89の問題がどのようになったのかわかりません:(しかし、私はC89で読むと思っていますが、事柄はさらに許されていました –
あなたはコーナーケースを世話してくれると期待しています?それはしません:あなた自身のためのこれらの種類の詳細を心配することを期待している。それはより高いレベルの言語を考慮する理由かもしれませんが、Cのバグではありません*: – dmckee
@dmckee:公正であるためには、固定されたバージョンが最初に来て、私のマクロアセンブラはうまくいくのです;) – diapir