У меня есть масса подобных проблем, о которых сообщил SonarQube:
m_buffer[0] = static_cast<uint32_t>(headerByte0 << 8);
Где m_buffer — это массив uint32_t, headerByte0 — это uint8_t. SonarQube пишет:
Добавьте явное приведение к результату оператора «<<».
Есть ссылка на MISRA C 2004 10.5 и MISRA C++ 2008 5-0-10. Почему SonarQube не распознает static_cast? Как это решить?
Я думаю, так и должно быть static_cast<uint32_t>(headerByte0) << 8
мч, kiner_shah: похоже ты прав, это решает проблему. пожалуйста. напишите ответ, подробно описав, зачем это нужно





В линии
m_buffer[0] = static_cast<uint32_t>(headerByte0 << 8);
headerByte0 как uint8_t повышается до int (подписанная версия), затем сдвигается влево на 8 как int, в результате чего получается int, а затем преобразуется в uint32_t. Сдвиг int влево может быть проблематичным, вам следует сдвигать только целочисленные типы данных без знака.
В сообщении Sonarqube говорится, что вам следует привести операнды сдвига. Вы приводите результат, а не операнды.
m_buffer[0] = static_cast<uint32_t>(headerByte0) << 8u;
должно быть правильно. Вы приводите headerByte0 к uint32_t, а затем сдвигаете его на 8u (u означает, что это беззнаковая константа), в результате чего получается uint32_t, идеально подходящий для присвоения m_buffer[0], а также uint32_t.
Спасибо за ответ! но в сообщении гидролокатора говорится: я должен привести результат оператора. правила мисра также гласят, что я должен немедленно привести результат оператора. никто из них не говорит, что я должен сначала привести операнд...
Вам следует привести
headerByte0кuint32_t. В этом выраженииuint8_tповышается доint, и ему не нравятся сдвиги целых чисел со знаком.