C の厳密なエイリアシングに問題があります。GCC 4.7.1 を使用しています。
例 1:
-fstrict-aliasing -Wstrict-aliasing=3 を指定してこのコードをコンパイルすると、「警告: 型がパニングされたポインターを逆参照すると、厳密なエイリアス規則が破られる」というメッセージが表示されます。
#include <stdio.h>
#include <stdint.h>
int main(void)
{
uint8_t a[4] = {0x01, 0x23, 0x45, 0x67};
uint32_t b;
b = *(uint32_t *)a;
printf("%x\n", b);
return(0);
}
例 2:
このコードは、-fstrict-aliasing および -Wstrict-aliasing=3 または -Wstrict-aliasing=2 または -Wstrict-aliasing=1 を指定しても警告を出さない
#include <stdio.h>
#include <stdint.h>
int main(void)
{
uint8_t a[4] = {0x01, 0x23, 0x45, 0x67};
uint32_t b;
void *p;
p = a;
b = *(uint32_t *)p;
printf("%x\n", b);
return(0);
}
どちらの例も正しく機能します。
ユニオンの使用も未定義の動作であり、私の場合、 memcpy() の使用は遅すぎます。
では、最初の例は安全 (偽陽性) でしょうか、それとも 2 番目の例も安全ではありません (偽陰性) でしょうか? それとも ...?
ありがとう。