c语言风格注意事项(misra c)

最近接触了代码静态检查工具QAC以及PolySpace,在使用过程中积累了一些经验,在此记录。

 

一、类型问题

      可以说是最多的一类问题。

      1、常量需要注明类型

uint32 i = 0;
/*i是无符号数,与它比较的0要明确申明为无符号数0u*/
if( i > 0u){
    func1();
}

   

  2、enum(包括其他自定义类型)不能与数据类型(uint8 uint16 uint32 sint8 sint16 sint32等)互相转换

typedef enum{
    ENUM0,
    ENUM1
}TempEnum;

TempEnum e = ENUM0;
uint8 i = 0;
/*以下行为都禁止*/ i = e; i = (uint8)e; e = i; e = (TempEnum)i;

   

  3、赋值操作时右值要强制转换成与左值相同的类型。

         

二、控制流问题

       1、所有 if else 最后都需要一个 else 处理其他情况,哪怕什么都不做也要在语义上说明自己“考虑”到了其他情况;

1 if(xxx){
2     func1();
3 }else if(xx){
4     func2();
5 }else{
6     /*nothing*/    
7 }

 

三、关键字问题

  1、不允许使用union

 

四、指针问题

       1、在指针操作数上由算术运算得到的指针应指向与指针操作数相同的数组的元素。

while(len > 0u){
    /*bad*/
    *dest++ = *src++;    
}

for(i = 0; i<len; i++){
    /*good*/   
    dest[i] = src[i];
}

   2、禁止使用指针操作结构体连续内存

struct TempStruct {
    uint8 byte1;
    uint8 byte2;
}testStruct;

uint8 *p = &testStruct->byte1;
/*禁止*/
for(i = 0u; i < 2u; i++){
    p[i] = 0;
}

 

未解之谜?

       1、PolySpace下返回枚举类型的函数与枚举变量类型比较会判断为类型不匹配,需要对枚举变量做强制类型转换

typedef enum{
    ENUM0,
    ENUM1
}TempEnum;

TempEnum func1(void);

/*ENUM0的强制类型转换不可少*/
if(func1() == (TempEnum)ENUM0)

    2、PolySpace会把switch分支里的default标号下的代码判为不可达

转载于:https://www.cnblogs.com/jozochen/p/8893549.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值