1206_MISRA_C规范学习笔记_Rule 10.1 Rule 10.2

213 篇文章 6 订阅

全部学习汇总: GitHub - GreyZhang/misra_c_hacking: MISRA C, I'm coming! Happy hacking!

这两条规则都是关于数据类型转换的,其中10.1是针整形的,而10.2主要是针对浮点类型的。两条规则的要求其实是有相似之处的,都是关于禁止隐式数据类型转换,换言之是必须显式强制数据类型转换确认的要求。什么时候不可进行隐式的数据类型转换呢?下面几点:

1,可能出现信息丢失的时候;

2, 复杂表达式的时候;

3, 作为函数的参数的时候;

4, 作为函数的返回值的时候。

针对上面的小结,有一个概念叫做复杂表达式。那么,什么是复杂表达式呢?

这里有一个定义说明,只要不是常量表达式、左值、函数返回值中的一个都是复杂表达式。对应也给出了一些例子,从例子看,其实这个复杂表达式还有一个较为共性的特征:结果的获取需要有一定的运算处理。

上面的两条规则要求也可以有一定的组合派生,因此下面的情况中不允许有隐式的数据类型转换:

1,有符号以及无符号之间的转换;

2,整形和浮点类型之间的转换;

3,从广值类型到窄值类型的转换;

4,函数的参数表达式数据类型转换;

5, 返回值表达式数据类型转换;

6, 复杂表达式数据类型转换;

这里还有一系列的例子可以辅助对此规则进行理解,如果按照上面扩展出来的6条规则来逐个去遍历分析一遍也很容易分析清楚。

这两条规则是我看这个MISRA C规范以来所看到的较为复杂的两条规则了,规则的阐述也用了很大的篇幅。自然,这么大力气来说明这个问题很大的一个原因也是这个规则相关的bug在各种项目中应该也是层出不穷的。印象中,之前看《C专家编程》的时候这个也是一个重要的篇幅,里面有一个章节的名称似乎叫做《安静的转换》?我记不准确具体的名字,但是应该是一个类似的信息。

这么多情况出现,走马观花看过之后也不见得一定会有立竿见影的收效。这样的规范度,肯定得依靠一个人反复训练而保持的良好习惯。另外,从这些问题风险存在的角度考虑,引入工具性的检查的确是有必要的了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值