次のコードは未定義の動作を引き起こしますか (エイリアシング違反またはその他による)?
int foo(int (*a)[10], int (*b)[5])
{
(*a)[5]++;
return (*b)[0];
}
int x[10];
foo(&x, (int (*)[5])&x[5]);
と は同じ型へのポインターになり、相互にエイリアスを許可するため、int *
配列へのポインター型ではなくプレーンを使用する対応するコードは完全に合法であることに注意してください。a
b
編集:これが実際にエイリアシング違反である場合、興味深い結果は、restrict
C99より前のセマンティクスを取得するためのハックだが有効な方法であるように見えることです。次のように:
void some_func(int *aa, int *bb)
{
int (*a)[1] = (void *)aa;
int (*b)[2] = (void *)bb;
/* Now **a and **b can be assumed by the compiler not to alias */
}
おそらく、各アドレスで実際の配列にアクセスする必要がある場合は、サイズの違いとして SIZE_MAX-1 や SIZE_MAX-2 などを使用できます。