提问者:小点点

MISRA 2008:无法理解5-0-13规则


我无法理解5-0-13规则本身:

规则5-0-13:if语句的条件和iteration语句的条件应该具有bool类型。

原理:如果在if-statement或iteration-statement的条件中使用了非bool类型的表达式,则其结果将隐式转换为bool。 条件表达式应包含显式测试(产生bool类型的结果),以便阐明开发人员的意图。

异常:表单type-specifier-seq声明符的条件不需要具有bool类型。 之所以引入这个例外,是因为实现相同效果的替代机制繁琐且容易出错。

extern int32_t * fn ( );
extern int32_t fn2 ( );
extern bool fn3 ( );
while ( int32_t * p = fn ( ) ) // Compliant by exception
{
 // Code
}
// The following is a cumbersome but compliant example
do
{
 int32_t * p = fn ( );
 if ( NULL == p )
 {
 break;
 }
 // Code...
}
while ( true ); // Compliant
while ( int32_t length = fn2 ( ) ) // Compliant by exception
{
 // Code
}
while ( bool flag = fn3 ( ) ) // Compliant
{
 // Code
}
if ( int32_t * p = fn ( ) ) // Compliant by exception
if ( int32_t length = fn2 ( ) ) // Compliant by exception
if ( bool flag = fn3 ( ) ) // Compliant
if ( u8 ) // Non-compliant
if ( u8 && ( bool_1 <= bool_2 ) ) // Non-compliant
for ( int32_t x = 10; x; --x ) // Non-compliant

。。。它和

规则5-3-1:! 运算符,逻辑&&P; 或者逻辑运算符的类型应为bool

原理:在这些运算符中使用除bool以外的类型的操作数不太可能有意义(或有意)。 此规则允许检测此类使用,因为逻辑运算符(&&&,和!) 很容易与按位运算符(&;,和~)混淆。

if ( ( a < b ) && ( c < d ) ) // Compliant
if ( 1 && ( c < d ) ) // Non-compliant
if ( ( a < b ) && ( c + d ) ) // Non-compliant
if ( u8_a && ( c + d ) ) // Non-compliant
if ( !0 ) // Non-compliant –
 // also breaks other rules
if ( !ptr ) // Non-compliant
if ( !false ) // Compliant with this rule,
 // but breaks others

共1个答案

匿名用户

规则5-3-1还适用于ifwhilefor之外的情况,例如。

extern void set_flag(bool);

set_flag( ( a < b ) && ( c < d ) ); // Compliant
set_flag( 1 && ( c < d ) ); // Non-compliant
set_flag( ( a < b ) && ( c + d ) ); // Non-compliant
set_flag( u8_a && ( c + d ) ); // Non-compliant
set_flag( !0 ) // Non-compliant –
 // also breaks other rules
set_flag( !ptr ); // Non-compliant
set_flag( !false ); // Compliant with this rule,
 // but breaks others

bool one = ( ( a < b ) && ( c < d ) ); // Compliant
bool two = ( 1 && ( c < d ) ); // Non-compliant
bool three = ( ( a < b ) && ( c + d ) ); // Non-compliant
bool four = ( u8_a && ( c + d ) ); // Non-compliant
bool five = ( !0 ); // Non-compliant –
 // also breaks other rules
bool six = ( !ptr ); // Non-compliant
bool seven = ( !false ); // Compliant with this rule,
 // but breaks others