我的靜態分析器是投擲以下警告:MISRA C++規則5-0-3假陽性警告
MCPP規則5-0-3:該複合物的表達隱式轉換爲 不同必不可少類型
爲以下代碼:
void func(const uint32_t arg)
{
//32U has underlying type uint8_t
const uint32_t u32a = arg % 32U; //warning issued in this line
const uint32_t u32b = (arg % static_cast<uint32_t>(32U)); //same warning issued in this line
const uint32_t u32c = static_cast<uint32_t>(arg % 32U); //compliant
}
根據MISRA底層類型轉換規則:
否則,如果兩個運算數均爲整數類型,基礎類型的 的表達可以使用以下發現:
- 如果類型 操作數具有相同的尺寸,並且或者是無符號的,結果是 未簽名。
- 否則,結果的類型是較大的 類型。
我認爲這種警告可能是假陽性,因爲,儘管32U
是一個uint8_t
,表達式應該採取的基礎類型的較大型的,在這種情況下,uint32_t
,從而使爲static_cast
不必要的需要。
您是否同意這是一個誤報?或者我看着這一切都錯了?
編輯: 的MISRA標準指出:
基礎類型的整數常量表達式的因此是 定義如下:
如果表達式的實際類型是有符號的積分,底層類型被定義爲 能夠表示其值的最小有符號整數類型。
如果表達式的實際類型是無符號整數,基礎類型被定義爲最小無符號整數類型 是能夠代表其值的。
在所有其他情況下,表達式的基礎類型被定義爲與其實際類型相同。
2號就是爲什麼我一直假設32U
具有基礎類型的uint8_t
的原因。
在你的架構,'32U'可能是64位。你爲什麼說「_32U有基礎類型uint8_t_」? – YSC
如果你的int是比'uint32_t'越大,則'ARG%32U'是類型'無符號int'而不是'uint32_t'的。 – Jarod42
要檢查,只是'的std ::法院<<的sizeof(unsigned int類型)<< 「\ n」;'。 – YSC