2009-06-07 7 views
2

でこのコードを考慮すると、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; 
} 

は、この標準の動作ですか?私は、コンパイラは、そう言わない限り、と、ポインタの両方にエイリアスがあると想定していると予想していました。

+4

これは標準的な動作ではありません。少なくともC99とC++ではコンパイラのバグのようです。彼らは明示的に互いをエイリアスすることができます。私はあなたのためのものであるように思われるC89の問題がどのようになったのかわかりません:(しかし、私はC89で読むと思っていますが、事柄はさらに許されていました –

+0

あなたはコーナーケースを世話してくれると期待しています?それはしません:あなた自身のためのこれらの種類の詳細を心配することを期待している。それはより高いレベルの言語を考慮する理由かもしれませんが、Cのバグではありません*: – dmckee

+0

@dmckee:公正であるためには、固定されたバージョンが最初に来て、私のマクロアセンブラはうまくいくのです;) – diapir

答えて

4

Check out this answer

パラメータを入力する前に__restrictを入れてみてください。MSVCで警告が表示される唯一の方法だと思われます。

+0

リンクをありがとう。むしろ、__norestrictキーワードが必要になりますので、コンパイラは制約を受けないようにします。 – diapir

4

書かれたコードは完全に有効です(C89またはC99)。それはあいまいですが、コンパイラが診断するものは何もないので、診断はしません。

C99を使用し、関数の両方のパラメータに「制限」を設定すると、コンパイラがC99をサポートしている場合にエラーが発生します。 AFAIK、MSVCの現在のバージョンはまだ完全にC99をサポートしていません。

0

C99がrestrict修飾子を発明する前に、いくつかのCコンパイラには、ポインタの使用法に関する一定の前提を設定する最適化オプションが含まれていました。このようなコンパイラで見たマニュアルでは、このような最適化がではなく、標準に準拠していると警告しています。プログラマの意向。マニュアルの観点から、最適化は、Cで定義された特定のコーナーケースの動作を定義していないCのサブセットをコンパイルするようにコンパイラに指示しましたが、それらのケースではより効率的なコードを生成できます定義した。

関連する問題