Как решить это предупреждение lint & quot; Неявное двоичное преобразование из int в unsigned int & quot;

вот код:

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]

Зачем? и как этого избежать?

2

Решение

Вы сравниваете x который unsigned short а также 1 который int по умолчанию. Следовательно, вы получили неявное двоичное преобразование.

Дайте вашему компилятору подсказку, которую вы действительно хотите сравнить x с другим unsigned значение:

if ((x==1U) && y)

2

Другие решения

попробуй это

if ( ( static_cast<unsigned int>(1) == x ) && y)
0

потому что 1 рассматривается как int. использование

unsigned int x

или бросить

0

Не ясно, какую версию 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

Изучение целочисленное продвижение а также обычные арифметические преобразования.

0
По вопросам рекламы [email protected]