16位位域导致*从未初始化的内存中读取*警告

时间:2010-06-30 11:07:31

标签: c compiler-warnings bit-fields

我有这种typedef:

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

并获得此编译器警告:

BITFIELD bitfield;

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

现在,当我使用short而不是bitfield时,警告消失了:

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

我不确定该怎么想这个警告 - 我不明白。没有未初始化的内存,也没有读取操作。恕我直言,编译器( VisualDSP ++ 5.0 C / C ++编译器)在这里是错误的。当我为时间戳使用:32位域时,警告也会消失。

有什么我没有意识到的吗?我可以安全地忽略此警告吗?

2 个答案:

答案 0 :(得分:3)

您系统上的unsigned int有多大?

我能想到的唯一可能导致这种情况的是,如果16位位域只构成Timestamp变量的一部分(例如,如果unsigned int是32位宽)。 / p>

换句话说,也许编译器正在将其转化为:

Timestamp = (Timestamp & 0xffff0000) | 12;
如果Timestamp未初始化,

会导致该问题。

适合:

  • 使用16位短片,因为代码可能会变成Timestamp = 12;
  • 使用:32,因此,它会将位域扩展到可以直接分配的位置。

对我来说纯粹的假设,但是,对于脑死亡编译器的折扣,这是我能想到的最好的(如果它是真的,它可能仍然脑死亡但以不同的方式)。

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

答案 1 :(得分:0)

我同意编译器似乎有点过于急于在这种情况下给出这个警告(我想知道这里错过的是用于16位字段的32位字的剩余部分是否都是填充)。

我更习惯从purify等工具中获取它。