2016-07-19 6 views
0

を中断します32ビットCortex M0。タイプ間接参照型punnedポインタは、私は、このコードでは(「厳格なエイリアシング規則を破るだろうタイプの間接参照型punnedポインタを」)警告コンパイラを持っている厳格なエイリアシング規則

警告にもかかわらず、正常に動作しています。私の質問は、警告を解決できるかどうかです。

+0

* strict aliasing * ruleを参照してください。それは広いテーマです。 –

+0

...あなたのお気に入りの検索エンジンに警告を貼り付けてみましたか?またはこの非常にサイト? –

+0

関連:http://stackoverflow.com/questions/2958633/gcc-strict-aliasing-and-horror-stories –

答えて

3

保存期間を他の(互換性のない)タイプのオブジェクトとして割り当てられていないオブジェクトを再解析することは、未定義の動作です。

Buffのタイプがuint8_tで、静的または自動保存期間のいずれかがある場合は、タイプDWORDとして再解釈されています。これらのタイプは互換性がありません、動作は定義されていません。

あなたは、単にDWORDように表示される、あなたが使用するタイプとしてBuffを定義する必要があります。

volatile DWORD Buff[READ_BUFF_SIZE]; 

をし、その後、あなたは単に組み込みのオペレータが行います使用して、アクセス用のマクロを必要としません。我々が想定している場合でも


ChunkID = Buff[0]; 
uint8_tはunsigned charとして定義されています。任意の型のエイリアスでもよく、型 DWORDは別名 unsigned charではありません。

標準タイプuint8_tをCHAR_BIT拡張整数型を見る8.であってもunsigned charとして定義されていないことを可能にします。

+0

ええ、まともな答えですが、重複の問題を少なくしません。 –

+0

@JonathanLeffler「ちゃんと」だけ? :-)ええ、私はそれが 'ちょっと' dupだと思います。 – 2501

+0

よかったら、意味をなさえ!私はいつもなぜ警告が生成されているのか知りたい。リンクありがとう、私はいくつかを読んで理解した。 uint8以外のものとしてバッファを宣言することはできません。なぜなら、それをそのまま使用するルーチンが多いからです。しかし、他のいくつかのデータでは、データはuint16、uint32などのように意味があります。元のバッファー上で共用体を使用すると、より洗練された方法で解決できます。ありがとう。 – user1797147

関連する問題