MISRA C 1998共包含17种类别,127条规则,这一节中,我们将详细介绍这17种分类和127条规则,其中R—Request,A—Advisory
1.所有的代码应该遵循ISO 9899标准,不允许扩展(R)
typedef void (*myFptr)();
void foo()
{
void *ptr;
myFptr ptf = (myFptr)ptr; /* 不符合规则1,从能从指针变量向函数指针转换*/
}
#ifdef _MSC_VER
/* MSVC specific part */
void __cdecl bar(); /*不符合规则1,使用了msvc __cdecl 关键字*/
#endif /* _MSC_VER */
2.如过要使用非C语言的编程语言,汇编器和编译器应该同时遵循这两种语言针对对象代码的明确接口标准(A)
3.C语言调用的汇编语言函数应该写在仅包含汇编语言的内联函数中,并且内联汇编语言不能嵌入在普通C代码中(A)
void myCall1() /* OK */
{
__asm{
mov eax, 01h
int 10h
}
}
void myCall2() /* 不符合规则3 */
{
int g = 0;
__asm{
mov eax, 01h
int 10h
}
}
4.应该做一些防备措施在运行时进行有效检测(A)
例如数学检查(除零,溢出),指针,整型左移,数组边界以及函数参数等。
5.仅仅可以使用由ISO C标准定义的字符(R)
void foo() {
int i;
char c='$'; /* 与规则5不符合 */
}
ISO C定义了52个大小写拉丁字符和10个数字字符,还有29个图像字符:
! " # % & ' ( ) * + , - . / : ; < = > ? [ / ] ^ _ { | } ~
详细内容可以参考ISO标准第5.2.1节内容,这里定义了91个字符。
6.字符类型的值应该严格遵循明确的和文档化的ISO 10646-1的子集(R)
void foo() {
const char * s[] = {"a",
"/012" /* 不符合规则6*/
};
}
7.不使用三元符(R)
??= #
??( [
??/ /
??) ]
??' ^
??< {
??! |
??> }
??- ~
8.多字节字符和宽字符串文字不可使用(R)
#include <stddef.h>
void foo()
{
wchar_t * x = L"Fred"; /* 不符合规则 8*/
}
9.注释不能嵌套(R)
#include <stddef.h>
void foo()
{
int a = 0; /* /*不符合规则 9*/ */
}
10.不允许将代码段进行注释掉(A)
如果要将代码段注释掉,推荐使用#if(或者#ifdef)方法。因为采用/* 代码 */这种方式可能引起注释嵌套。
/*不符合规则 10*/
/*
if (dVal==0) {
//...code
}
*/