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

вот код:

test.cpp

unsigned short x;
bool y;
if ((x==1)&& y)
{
  ...
}
else
{
  ...
}

Я получил сообщение lint:

Note 912 Implicit binary conversion from int
to unsigned int [MISRA Rule 48]

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


person HeyJoy    schedule 01.02.2016    source источник
comment
if ((x==1u)&& y), если это не сработает, вам нужно будет предоставить полный пример (который вы все равно должны были сделать в первую очередь).   -  person user657267    schedule 01.02.2016
comment
Обратите внимание на MISRA-C:1998, это C++. Это нормально в MISRA-C++:2008.   -  person Veriloud    schedule 09.02.2016


Ответы (4)


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

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

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

person DennisS    schedule 01.02.2016
comment
Это не устраняет предупреждение, MISRA запрещает неявные преобразования. - person Lundin; 09.02.2016

попробуй это

if ( ( static_cast<unsigned int>(1) == x ) && y)
person sanjay    schedule 01.02.2016
comment
получить новую ошибку: Примечание 970 Использование модификатора или типа «без знака» вне определения типа [Правило 13 MISRA] - person HeyJoy; 01.02.2016
comment
если ((unsigned short)(1)==x) && y) это работает, спасибо, но почему? - person HeyJoy; 01.02.2016
comment
Потому что каким-то образом инструмент статического анализа здесь жалуется на буквальное преобразование int в беззнаковое, а не на приведение в стиле C, которое выбросило всю вашу безопасность типов в окно. - person TBBle; 01.02.2016
comment
MISRA C++ 2008 запрещает использование приведения типов C (5-2-2, 5-2-7/8/9). Я предполагаю, что MISRA C++, поскольку @HeyJoy цитирует правила MISRA. MISRA C не будет жаловаться. - person graham.reeds; 01.02.2016
comment
@HeyJoy, если ((unsigned short)(1)==x) && y) не совместим с MISRA, это не должно работать. Оба операнда неявно повышаются. - person Lundin; 09.02.2016

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

unsigned int x 

или литье

person Стефан Стефанов    schedule 01.02.2016

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

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

person Lundin    schedule 09.02.2016