PC-Lint Misra 10.1 Ошибка в логическом выражении

PC-Lint версии 9.00L смотрит на этот код:

  typedef unsigned char boolean_t; //This is actually in a system header file.
  ...
  /* The rest is in the .c file I'm working on. */
  boolean_t booleanVal
  ...
  uint8_t maskedVal;
  maskedVal = 0; //real code has this assigned based on a bitwise-and
  booleanVal = ( maskedVal != 0U );

И дает эту ошибку:

booleanVal = ( maskedVal != 0U );
                                ^
"LINT: <filename> Note 960: Violates MISRA 2004 
Required Rule 10.1, Implicit conversion of integer to smaller type"

Я объявил boolean_t как сильный логический тип, используя -strong(B, boolean_t ) в моем.lnt файле.

Так почему же PC-Lint жалуется на преобразование целых чисел, когда я назначаю явно булево выражение для явно булевой переменной?

2 ответа

Решение

Результат ( maskedVal != 0U ) является int все же, хотя это 0 или же 1 MISRA жалуется, что его принуждают к unsigned char Ваш доморощенный логический тип.

Не изобретайте свой собственный логический тип. Либо использовать int или формальный логический тип, доступный в современных реализациях C.

MISRA-C:2004 не рассматривал логические типы как особый случай, они были просто еще одним маленьким целочисленным типом, таким как char и т.д. Примечательно, что он не поддерживает bool либо так как он не поддерживает C99.

Все, если бы это было исправлено в MISRA-C:2012, где ваш домашний тип был бы так называемым по сути логическим. В MISRA-C: 2012 нет требования, которое вы должны использовать boolХотя это и рекомендуется, но в руководствах допускается использование "самодельных булевых значений", учитывая, что вы можете как-то сказать своему статическому анализатору, какой он тип.

Но так как вы используете более старую версию MISRA-C, booleanVal = ( maskedVal != 0U ); это назначение для более узкого типа из int, а также от типа со знаком к типу без знака.

Это является нарушением правила 10.1 MISRA-C:2004, но прекрасно в MISRA-C:2012.

Примечательно, что у вас также есть скрытое продвижение от uint8_t в unsigned int, хотя это не должно нарушать никаких правил MISRA.

Другие вопросы по тегам