вот код:
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]
Почему? и как этого избежать?
вот код:
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]
Почему? и как этого избежать?
Вы сравниваете x
, который равен unsigned short
, и 1
, который по умолчанию равен int
. Следовательно, вы получили неявное двоичное преобразование.
Дайте вашему компилятору подсказку, что вы действительно хотите сравнить x
с другим значением unsigned
:
if ((x==1U) && y)
попробуй это
if ( ( static_cast<unsigned int>(1) == x ) && y)
потому что 1 рассматривается как целое число. Использовать
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
Изучите расширение целых чисел и обычные арифметические преобразования.
if ((x==1u)&& y)
, если это не сработает, вам нужно будет предоставить полный пример (который вы все равно должны были сделать в первую очередь). - person user657267   schedule 01.02.2016