16-битное битовое поле приводит к * чтению из неинициализированной памяти * предупреждению - PullRequest
0 голосов
/ 30 июня 2010

У меня есть этот typedef:

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;

Я не уверен, что думать об этом предупреждении - я не понимаю его. Не задействована неинициализированная память и операция read тоже. ИМХО компилятор ( VisualDSP ++ 5.0 C / C ++ Compiler ) здесь не так. Предупреждение также исчезает, когда я использую :32 битовое поле для отметка времени .

Есть что-то, чего я не осознавал? Могу ли я безопасно проигнорировать это предупреждение?

Ответы [ 2 ]

3 голосов
/ 30 июня 2010

Насколько велика unsigned int в вашей системе?

Единственное, о чем я могу подумать, это может быть вызвано тем, что 16-битное битовое поле образует только часть переменной Timestamp (если, например, unsigned int имеет ширину 32 бита).

Другими словами, может быть, компилятор превращает это в:

Timestamp = (Timestamp & 0xffff0000) | 12;

, который вызвал бы эту проблему, если бы Timestamp были неинициализированы.

Это соответствует:

  • с использованием 16-битного короткого кода, поскольку код, вероятно, просто тогда станет Timestamp = 12;.
  • с использованием :32, поскольку он расширяет битовое поле до точки, где также возможно прямое назначение.

Чистое предположение с моей стороны, но, исключая компилятор с мертвым мозгом, это лучшее, что я могу придумать (если это правда, это, вероятно, все еще мертвый мозг, но по-другому). 1026 *

FWIW, gcc не жалуется даже с -Wall.

0 голосов
/ 30 июня 2010

Я согласен, что компилятор, похоже, слишком стремится выдать это предупреждение в этом случае (интересно, что здесь упущено, так это то, что все, что осталось от 32-битного слова, используемого для 16-битного поля, - это все заполнение).

Я больше пользуюсь для получения таких инструментов, как очистка.

...