ОШИБКА MISRA: тип поля должен быть int, unsigned int или signed int

Я использовал следующий код в своей программе, и при запуске PC-Lint он выдает следующую ошибку: несколько маркеров в этой строке - (lint: 46) тип поля должен быть int, unsigned int или signed int [MISRA 2004 Правило 6.4, обязательно] - (lint:960) Нарушает MISRA 2004 Required Rule 6.4, битовое поле должно быть явно подписанным целым числом или беззнаковым целым числом.

typedef struct{
  boolean ch8 :1;
  boolean Ch7 :1;
  boolean Ch6 :1;
  boolean Ch5 :1;
  boolean Ch4 :1;
  boolean Ch3 :1;
  boolean Ch2 :1;
  boolean Ch1 :1;
} Channel;

Может ли кто-нибудь сказать мне, как это исправить?


person abhay agrawal    schedule 01.11.2014    source источник
comment
Что такое boolean? В C нет типа boolean.   -  person P.P    schedule 01.11.2014
comment
Скорее всего, ваш компилятор определяет логическое значение как тип символа размером 1 байт. Решите это, никогда не используя битовые поля ни в какой ситуации, они опасны, не переносимы и на 100% лишние.   -  person Lundin    schedule 10.11.2014


Ответы (2)


Вы должны сделать это следующим образом:

typedef struct{
  unsigned int ch8 :1;
  unsigned int Ch7 :1;
  unsigned int Ch6 :1;
  unsigned int Ch5 :1;
  unsigned int Ch4 :1;
  unsigned int Ch3 :1;
  unsigned int Ch2 :1;
  unsigned int Ch1 :1;
} Channel;

Битовое поле принимает только целые типы.

person Vincent    schedule 01.11.2014
comment
Обратите внимание, что при этом биты могут оказаться практически любым случайным образом. см. это. - person Lundin; 10.11.2014

MISRA-C:2004 совместим с C:90, который не имеет типа boolean.

Чтобы быть полностью совместимыми, битовые поля должны быть unsigned int или signed int

В качестве альтернативы вы можете задокументировать отклонение (от правила 1.1), чтобы разрешить использование логического типа C99 — обоснование будет простым, поскольку соответствующее правило MISRA C: 2012 (R 6.1) разрешает использование логического значения для битовых полей.

[Обратите внимание на отказ от ответственности в профиле]

person Andrew    schedule 06.11.2014
comment
Дано: struct { bool flag:1; uint8_t x:7; } foo; можно ли разместить поля в одном и том же байте памяти? Будет ли foo.flag = 2; устанавливать значение равным нулю или отличному от нуля? Предполагается, что правила MISRA способствуют переносимости, но я не уверен, что реализации будут обрабатывать вышеизложенное последовательно. - person supercat; 25.06.2016
comment
Помещение значения 2 в переменную размером 1 бит является условием переполнения, независимо от того, является ли bool знаковым или беззнаковым. Это основная ошибка кодирования! Инстинкт подсказывает, что значение должно быть 0 (младший бит равен нулю) - person Andrew; 04.07.2016
comment
Сохранение любого ненулевого значения в C99 bool эквивалентно сохранению значения 1; Я не знаю никаких преимуществ, которые этот тип имел бы перед любым другим, если бы кто-то не собирался этим воспользоваться. - person supercat; 04.07.2016
comment
Я бы не стал делать такое предположение, особенно если вы используете битовые поля. - person Andrew; 05.07.2016
comment
Я бы тоже не стал, но я не могу придумать никакой другой причины для использования bool в качестве типа битового поля, я бы не хотел предполагать, что кто-то, кто это сделал, не полагался на такое поведение. Лично я думаю, что C99 было бы лучше, если бы чтение bool, в котором было сохранено значение, отличное от 0 или 1, давало бы результат Unspecified (избегая необходимости, чтобы компилятор генерировал код для принуждения значений, которые, как знал программист, всегда будут 0 или 1). - person supercat; 05.07.2016
comment
Я согласен с тобой. Реализация _Bool в C99 настолько сломана... Я подозреваю, что bool x:1 = 2 и bool x:1 = (bool)(2) могут дать разные результаты! - person Andrew; 12.07.2016