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.