您的位置:首页 > 其它

MISRA-C 2004 规则解读(101S-120S)

2016-04-17 11:46 281 查看
101 S:Function return type inconsistent. 函数的实际返回值类型与定义的返回值类型不同:

UINT32_t static_101( UINT32_t par_1)
{
switch (par_1)
{
case 0:
return (-1);     /* not compliant */
break;
case 1:
return (1U);
break;
case 2:
return (1L);    /* not compliant */
break;
case 3:
return (1.0f);  /* not compliant */
break;
default:
break;
}
}


102 S:Function and prototype return inconsistent (MR). 函数声明时的返回值类型与实际使用时的返回值类型不同:

UINT32_t static_102(UINT32_t p_1, UINT16_t p_2);

/**************************************************************
* Standard 102 S : Function and prototype return inconsistent.
**************************************************************/

SINT32_t static_102(UINT32_t p_1, UINT16_t p_2) /* not compliant */
{
SINT32_t result = 0;
/* ... */
return result;
}


103 S:Function and prototype param inconsistent (MR). 函数声明时的参数类型与实际使用时的参数类型不同:

BOOL static_103(FLOAT32_t up_1);

/***************************************************************
* Standard 103 S : Function and prototype param inconsistent.
***************************************************************/
BOOL static_103(UINT32_t up_1)
{
BOOL ret = FALSE;
/* ... */
return ret;
}


104 S:Struct field initialisation incorrect. 结构体初始化赋值的类型与定义的类型不符:

struct s_type_a { SINT32_t xs; FLOAT32_t fs;};

/********************************************************
* Standard 104 S : Struct field initialisation incorrect.
********************************************************/

void static_104(void)
{
struct s_type_a sta = {3.14F, 0.0f}; /* not compliant */
/* ... */
}


105 S:Initialisation brace { } fault. 初始化结构体忘记使用大括号会出错:

struct pixel{ UINT32_t colour; struct {UINT32_t x, y;} coords; };

/***********************************************************
* Standard 105 S : Struct field initialisation brace fault.
***********************************************************/

void static_105(void)
{
UINT32_t xs = 0;
UINT32_t ys = 0;

struct pixel spot = {1u, xs, ys }; /* not compliant */

/* ... */
}


106 S:Volatile declaration.避免使用Volatile修饰变量,Volatile可以在应用程序外被改变,容易造成逻辑混淆。

void static_106(void)
{
volatile UINT32_t v = 1U; /* not compliant */
UINT32_t x = 0;

x = v;
/* ... */
}


107 S:Type mismatch in ternary expression. 使用三目运算符时类型不匹配:

static void static_107( BOOL flag )
{
UINT32_t  x = 0U;
FLOAT32_t f = 0.0F;

x = (flag ? f : x);

}


108 S:Assignment types do not match. 变量赋值时类型不匹配:

void static_108(void)
{
FLOAT32_t fl = 2.0F;
FLOAT_64 dbl = 3.0;

fl = dbl; /* not compliant */
}


109 S:Array subscript is not integral. 数组的索引必须为正数。

110 S:Use of single line comment //. 由于使用双斜杠标记注释的做法不是对所用的编译器通用,建议对注释段使用/**/的方式。

111 S:Label is not part of switch statement . 只有在switch语句中使用标签语法是安全的。

112 S:Typedef name redeclared.使用typedef 时某个名称被重复使用是危险的:

typedef SINT32_t mytype;

/*******************************************
* Standard 112 S : Typedef name redeclared.
********************************************/

void static_112(void)
{
typedef FLOAT32_t mytype; /* not compliant */

/* ... */
}


113 S:Non standard character in source.源文件中出现非法字符,合法的字符如下:

3***** The lines of permissible characters,(80A1),those NOT changed
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
()[].!~+-*/%<>=& ^|?:;,0123456789_{}'"#\$@<space><tab>


114 S:Expression is not Boolean. 表达式类型不为BOOl类型,或者表达式的运算对象都为BOOL类型:

void static_114(BOOL bl, UINT32_t a)
{
UINT32_t x;
BOOL flag;

flag = bl + bl; /* not compliant */

if (a) /* not compliant */
{
; /* ... */
}
if (a == 1) /*compliant */
{
; /* ... */
}

x = ( a && bl ? 1U : 0U ); /* not compliant */

}


115 S:String incorrectly terminated. string类型换行时需要使用反斜杠,否则在某些编译器中造成string类型结尾异常的错误:

/*******************************************************
* Standard 115 S : String incorrectly terminated.
*******************************************************/
void static_115(void)
{
CHAR* str1 = "string\
literal";   /* compliant */

CHAR* str2 = "string
literal";  /* not compliant */
}


116 S:Boolean comparison with 0 preferred. 与一个已知值的变量进行比较时,使用不等号来判断FALSE比使用等号判断TRUE安全:

void static_116 (void)
{
UINT32_t x = 2u;

if ( x == 1u ) /* not compliant */
{
/* ... */ ;
}
if ( x != 1u )
{
/* ... */ ;
}
}


117 S:Logical negation of constant value. 对const变量取反是危险的:

void static_117(void)
{
BOOL flag = FALSE;

if (flag == (BOOL)!1) /* not compliant */
{
/* ... */
}
}


118 S:main must be int (void) or int (int,char* []).C语言Main函数的格式必须是int (void) 或者 int (int,char* [])。

119 S:Nested comment found.避免在注释中出现子注释:

void static_119(void)
{

/*  This is the Outer Comment
/* This is the Inner Comment - not compliant
*/
}


120 S:Use of bit operator on signed type. 避免对有符号类型进行位运算:

void static_120(void)
{
SINT32_t b = 1;

b = b | 1; /* not compliant */

/* ... */
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MISRA-C