2010-06-30 79 views
0

閱讀我有這樣的typedef:16位位域導致*從未初始化的內存*警告

typedef union 
{ 
    unsigned Value; 
    unsigned Timestamp:16; 
} BITFIELD; 

,並得到這個編譯器警告:

BITFIELD bitfield; 

// read from uninitialised memory - may result in unexpected behaviour 
bitfield.Timestamp = 12; 

現在,當我用很短的,而不是警告消失的位域:

typedef union 
{ 
    unsigned Value; 
    unsigned short Timestamp; 
} DATATYPE; 

我不知道該怎麼想這個警告 - 我不明白。沒有未初始化的內存涉及,也沒有讀取操作。恕我直言編譯器(VisualDSP ++ 5.0 C/C++編譯器)在這裏是錯誤的。警告消失,當我使用:32位字段時間戳

有沒有什麼我沒有意識到?我可以放心地忽略這個警告嗎?

+0

您可以使用顯式類型而不是實現特定的類型(像uint32_t或等效的東西)?這可能會使錯誤更加清晰,並且在錯位時更清晰。 – 2010-06-30 13:18:04

回答

3

系統上的unsigned int有多大?

我能想到的唯一的原因是如果16位位域只構成Timestamp變量的一部分(例如,如果unsigned int是32位寬)。

換句話說,也許編譯器轉向到這一點:

Timestamp = (Timestamp & 0xffff0000) | 12; 

這將導致該問題,如果Timestamp是未初始化。

,適合在與:

  • 使用的是16位的,因爲碼短很可能就在那時成爲Timestamp = 12;
  • 使用:32因爲它將位域擴展到直接分配也是可能的點。

對我而言純粹是推測而已,但貼現腦死亡的編譯器,這是我能拿出最好的(如果這是真的,它可能仍然腦死亡,但以不同的方式)。

FWIW,即使-Wall gcc也不會抱怨。

+0

謝謝,這是一個非常好的解釋! – tanascius 2010-07-01 11:02:26

0

我同意編譯器似乎有點太急於在這種情況下給出這個警告(我想知道這裏錯過的是什麼保留在16位字段中使用的32位字全部是填充)。

我更喜歡從purify這樣的工具中獲得這個。