type
status
date
slug
summary
tags
category
icon
password
以下是按照上述清单为每条规则提供的错误用法和正确用法的示例代码:
语言使用相关
规则2.1:源文件中只应包含实现当前模块功能所必需的头文件
规则5.1:标识符(变量名、函数名等)的命名应该具有描述性,能够清晰表达其用途
规则6.3:结构体和联合体的成员应该具有一致的访问级别
类型和表达式相关
规则10.1:表达式中的操作数的类型应能隐式转换为该操作符所需的类型,并且不应该发生精度损失
规则11.3:指针类型的强制转换应该仅用于相关的指针类型之间
规则13.1:表达式中不应该包含副作用和值计算顺序不确定的操作
控制流相关
规则12.1:每个 switch 语句都应该有一个 default 标签,除非所有可能的情况都已经被 case 标签覆盖
规则14.1:if、while、for 语句的控制表达式应该具有布尔类型的结果
规则15.1:每个 do - while 语句都应该使用大括号将循环体括起来
函数相关
规则16.1:函数不应该直接或间接地调用自身(禁止递归调用)
规则4.12:函数原型应该与函数定义的参数和返回类型完全匹配
内存管理相关
规则21.1:应避免使用动态内存分配(如 malloc、calloc、realloc 和 free)
预处理器相关
规则20.1:应避免使用预处理器指令创建新的关键字或改变现有关键字的含义
补充常见出事的规则
以下是补充的MISRA C规则的解释、错误用法和正确用法示例:
规则10.3:整型表达式的值不应被隐式转换为不同基本类型的表达式
规则解释
在C语言中,不同整型之间的隐式转换可能会导致数据丢失或产生意外结果。MISRA C规则要求避免这种隐式转换,应显式进行类型转换以确保代码的可预测性。
错误用法
正确用法
规则8.4:外部变量和函数的声明应使用 extern 关键字
规则解释
当需要在多个源文件中使用同一个变量或函数时,为了明确其外部链接属性,应使用
extern 关键字进行声明,避免产生混淆和重复定义。错误用法
// file1.c
// file2.c
正确用法
// file1.c
// file2.c
规则17.7:禁止使用可变长度数组(VLA)
规则解释
可变长度数组是C99引入的特性,其长度在运行时确定。在嵌入式系统中,这可能导致栈空间的不可预测使用,增加栈溢出的风险,因此MISRA C禁止使用。
错误用法
正确用法
规则21.2:避免使用 alloca 函数进行栈上动态内存分配
规则解释
alloca 函数用于在栈上动态分配内存,但其使用可能会导致栈溢出,且不同编译器对其实现可能存在差异,所以MISRA C建议避免使用。错误用法
正确用法
规则3.1:源文件应使用统一的字符编码(通常为 ASCII 或 UTF - 8)
规则解释
统一的字符编码可以确保代码在不同的开发环境和工具中正确显示和处理,避免因编码不一致导致的字符显示错误或编译问题。
错误用法
在一个项目中,部分源文件使用 GBK 编码,部分使用 UTF - 8 编码,当在不同环境中打开或编译时可能出现乱码或编译错误。
正确用法
确保所有源文件都使用 UTF - 8 编码保存,大多数现代文本编辑器都可以设置文件编码。例如,在 Visual Studio Code 中可以通过右下角的编码标识进行设置。
规则12.2:switch 语句中的 case 标签的值应该是唯一的
规则解释
switch 语句根据表达式的值来匹配 case 标签,如果 case 标签的值不唯一,会导致逻辑混乱,编译器可能给出未定义的行为。错误用法
正确用法
规则15.6:for 语句的初始化、条件和迭代表达式应该只用于控制循环,不应该包含复杂的操作
规则解释
for 循环的三个部分(初始化、条件、迭代)应该主要用于控制循环的执行次数和流程,包含复杂操作会降低代码的可读性和可维护性。错误用法
正确用法
规则16.4:函数的参数数量应该是固定的,避免使用可变参数函数(如 printf 系列)
规则解释
可变参数函数的参数数量和类型在编译时不确定,这可能导致类型不匹配和运行时错误,在安全关键系统中应尽量避免使用。
错误用法
正确用法
有文字内容详情不解或业务合作的可以通过以下方式联系本人:微信号:kmkadagarm(请注明称呼与来意)
- 作者:Knight
- 链接:https://www.ale-tech.cn//article/misra%20c
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。









