вот код:
test.cpp
unsigned short x;
bool y;
if ((x==1)&& y)
{
...
}
else
{
...
}
Я получил сообщение ворса:
Note 912 Implicit binary conversion from int
to unsigned int [MISRA Rule 48]
Зачем? и как этого избежать?
Вы сравниваете x
который unsigned short
а также 1
который int
по умолчанию. Следовательно, вы получили неявное двоичное преобразование.
Дайте вашему компилятору подсказку, которую вы действительно хотите сравнить x
с другим unsigned
значение:
if ((x==1U) && y)
попробуй это
if ( ( static_cast<unsigned int>(1) == x ) && y)
потому что 1 рассматривается как int. использование
unsigned int x
или бросить
Не ясно, какую версию MISRA вы используете. Вы должны использовать MISRA-C ++ при написании кода на C ++, все остальное будет нарушением правил MISRA. Соответствие MISRA-C ++, очевидно, нельзя проверить с помощью средства проверки MISRA-C.
В любом случае, если у вас есть система с 32-битными целыми числами, это должно решить проблему независимо от версии MISRA:
if ( ( static_cast<uint32_t>(x) == 1u ) && y) // compliant
Важно понять, как работают неявные рекламные акции и как их избежать:
Кастинг 1
буквально unsigned short
ничего не решит. Такое приведение совершенно излишне, так как операнд немедленно получит целое число int
тем не мение.
if ( ( x == static_cast<unsigned short>(1) ) && y) // not compliant
unsigned short ushort=1u; if ( ( x == ushort ) && y) // not compliant
Кастинг 1
буквально unsigned int
или просто петь его 1u
(то же самое) заставит программу вести себя так, как ожидалось, но не устранит предупреждение MISRA. Потому что у вас все еще есть неявное продвижение типа x
операнд, который является нарушением MISRA.
if ( ( x == 1u ) && y) // not compliant
if ( ( static_cast<unsigned int>(1) == x ) && y) // not compliant
Изучение целочисленное продвижение а также обычные арифметические преобразования.