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

Вот код:

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]

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

4 ответа

Вы сравниваете 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

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

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