簡體   English   中英

如果表達式為布爾類型,則使用Misra-C 2012規則10.1布爾操作數

[英]Misra-C 2012 rule 10.1 boolean operand to be used in case where expression is of boolean type

以下幾行產生違反misra的行為。

unsigned int u16_a;
unsigned char u8_b;  
if (u16_a && u8_b) // Generates Misra-C 10.1 violation. 
(u16_a) ? 2 : 1 //Generates Misra-C 10.1 violation.

違反規定操作數是必需的帶符號類型,但應為布爾類型。

對於第一次違反,如果我將類型強制轉換為_Bool類型,則不會導致溢出,因為我記得bool數據類型的大小為1個字節。

對於第二次違規,請嘗試以下操作:

(u16_a == 0)? 1 :2 // does this work

我在處理MISRA違規方面還很新,並且與大多數違規混為一談。 提前致謝。

基本上,MISRA-C希望我們將邏輯/關系運算符視為返回布爾類型(就像在C ++中一樣),並且通常“假裝” C具有與整數分開的獨特布爾類型。 使用靜態分析工具時,這可以提高類型安全性。

這意味着您必須明確檢查零:

if ( (u16_a!=0u) && (u8_b!=0u) )

(u16_a!=0) ? 2u : 1u

或者最好是更易讀的東西:

bool b_a = u16_a!=0u;
bool b_b = u8_b!=0u;

if(b_a && b_b) // MISRA compliant, operands are essentially boolean types

在第一個示例中使用if ( (u16_a !=0u) && (u8_b != 0u) )代替if (u16_a && u8_b)

對於后者: (u16_a == 0)? 1 :2 (u16_a == 0)? 1 :2對我來說似乎還可以。

最重要的是,此MISRA要求的重點是:“在與值進行比較時明確指定,而不要依賴默認值”。

C標准說:

6.3.1.2布爾類型

1當任何標量值轉換為_Bool時,如果該值比較等於0,則結果為0;否則,結果為0。 否則,結果為1。

因此,強制轉換為_Bool是正確的事情。 (x != 0)可能比((_Bool)x)更具可讀性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM