test_func
次のスニペットは、2つの引数が部分的に重なっている場合、厳密なエイリアシング規則で未定義の動作を引き起こしますか?第二引数である構造体メンバへのポインタを使用する場合、厳密なエイリアシングが適用されますか?
は最初のメンバーである:
#include <stdio.h>
typedef struct
{
//... Other fields
int x;
//... Other fields
} A;
int test_func(A *a, int *x)
{
a->x = 0;
*x = 1;
return a->x;
}
int main()
{
A a = {0};
printf("%d\n", test_func(&a, &a.x));
return 0;
}
はA*
とint*
がエイリアスではないだろうという仮定に基づいて、test_func
がちょうど0を返すだろうと思いを許可コンパイラですか? *x
はメンバーを上書きできませんか?
これはCのキーワード['restrict'](https://en.wikipedia.org/wiki/Restrict)の目的ではないと思います。 – Stargateur
*厳密なエイリアシング*は、型が同じサイズであると仮定して、ポインタ型間で変換する場合例えば、 'int *'を 'float *'に変換するには、 'sizeof int == sizeof float'のプラットフォームで行います。そして、私は、この制限は、各プラットフォームに異なるアライメント要件があることが原因であると考えました。特定のシナリオでは未定義の動作につながる可能性があります。私はあなたのコード内にそれが見当たらない。 –
大まかには、ポインタを別の型にキャストした場合、または 'void *'に変換して別の型に変換した場合、 ''厳密なエイリアシング ''違反しかないと言うことができます。ここでは、すべての型情報がコンパイラに存在するため、問題を作成してはいけません。 –