MISRA C:2025 规则逐条分析

一、简介

MISRA C:2025 是 MISRA(Motor Industry Software Reliability Association)发布的最新版 C 语言编码标准,是对 MISRA C:2023 的进一步更新和扩展。该标准旨在适应最新的 C 语言实践和嵌入式系统开发需求,提高软件的可靠性、安全性和可维护性,同时保持与最新 C 标准的兼容性。

规则分类

MISRA C:2025 包含以下类型的规则:

  • 强制规则(Mandatory):必须严格遵守,无例外
  • 必要规则(Required):必须遵守,除非有合理的偏离理由
  • 建议规则(Advisory):建议遵守以提高代码质量

规则结构

本分析文档中每条规则的结构如下:

  • 分类:强制、必要或建议
  • 英文描述:规则的原始英文描述
  • 中文描述:规则的中文翻译
  • 原因:规则的制定原因
  • 示例:错误和正确的代码示例
  • 违反提示:违反规则时的英文错误提示

二、规则详细分析

1. 基础规则

1.1 规则 1.1:C 语言标准

分类:强制
英文描述:The C language shall be used in accordance with the rules of ISO/IEC 9899:2023 (C23)
中文描述:必须按照 ISO/IEC 9899:2023 (C23) 标准使用 C 语言
原因:确保代码的现代性和一致性,利用 C23 标准的最新安全特性和改进。
示例

// 推荐:使用 C23 标准特性
#include <stdint.h>
#include <stdbool.h>

int main(void) {
    bool flag = true;
    uint32_t count = 0;
    return 0;
}

违反提示:MISRA C 2025 rule 1.1 violation: [M] The C language shall be used in accordance with the rules of ISO/IEC 9899:2023 (C23)

1.2 规则 1.2:未定义行为

分类:强制
英文描述:There shall be no dependence on undefined or unspecified behaviour
中文描述:不能有对未定义行为或未指定行为的依赖性
原因:避免因编译器实现差异导致的不可预测行为,提高代码的可靠性。
示例

// 不推荐:未定义行为(MISRA C 2025 rule 1.2 violation: [M] There shall be no dependence on undefined or unspecified behaviour)
int i = 0;
i = i++ + ++i;

// 推荐:明确的行为
int i = 0;
i = i + 1;
i = i + 1;

违反提示:MISRA C 2025 rule 1.2 violation: [M] There shall be no dependence on undefined or unspecified behaviour

2. 标识符规则

2.1 规则 2.1:标识符命名

分类:必要
英文描述:Identifiers shall be descriptive and follow consistent naming conventions
中文描述:标识符应具有描述性并遵循一致的命名约定
原因:提高代码的可读性和可维护性,避免因命名不一致导致的错误。
示例

// 推荐:描述性命名和一致的约定
int temperature_celsius;
void calculate_average_temperature(void);

// 不推荐:不一致的命名约定(MISRA C 2025 rule 2.1 violation: [R] Identifiers shall be descriptive and follow consistent naming conventions)
int Temp_C;
void calcAvgTemp(void);

违反提示:MISRA C 2025 rule 2.1 violation: [R] Identifiers shall be descriptive and follow consistent naming conventions

2.2 规则 2.2:标识符长度

分类:必要
英文描述:External identifiers shall not exceed 63 characters
中文描述:外部标识符长度不应超过 63 个字符
原因:确保兼容性,同时允许更具描述性的命名。
示例

// 推荐:适当长度的外部标识符
int calculate_average_temperature_celsius(void);

// 不推荐:过长的外部标识符(MISRA C 2025 rule 2.2 violation: [R] External identifiers shall not exceed 63 characters)
int this_is_a_very_long_function_name_that_exceeds_sixty_three_characters(void);

违反提示:MISRA C 2025 rule 2.2 violation: [R] External identifiers shall not exceed 63 characters

3. 类型系统规则

3.1 规则 3.1:类型限定符

分类:必要
英文描述:const qualifiers shall be used for objects that do not change
中文描述:对于不变的对象应使用 const 限定符
原因:提高代码的安全性和可读性,防止意外修改数据。
示例

// 推荐:使用 const 限定符
const int MAX_VALUE = 100;
void print_message(const char *message);

// 不推荐:未使用 const 限定符
int MAX_VALUE = 100;
void print_message(char *message);

违反提示:MISRA C 2025 rule 3.1 violation: [R] const qualifiers shall be used for objects that do not change

3.2 规则 3.2:类型转换

分类:必要
英文描述:Implicit narrowing conversions shall be avoided
中文描述:应避免隐式窄化转换
原因:避免因类型转换导致的数据丢失或错误。
示例

// 不推荐:隐式窄化转换(MISRA C 2025 rule 3.2 violation: [R] Implicit narrowing conversions shall be avoided)
int a = 1000000;
char b = a; // 窄化转换

// 推荐:显式类型转换
int a = 1000000;
char b = (char)a; // 显式转换

违反提示:MISRA C 2025 rule 3.2 violation: [R] Implicit narrowing conversions shall be avoided

3.3 规则 3.3:枚举类型

分类:建议
英文描述:Enumerated types shall be used instead of integer constants
中文描述:应使用枚举类型代替整数常量
原因:提高代码的可读性和类型安全性。
示例

// 推荐:使用枚举
enum Color {
    RED,
    GREEN,
    BLUE
};

// 不推荐:使用整数常量
#define RED 0
#define GREEN 1
#define BLUE 2
3.4 规则 3.4:布尔类型

分类:必要
英文描述:bool type shall be used for boolean values
中文描述:布尔值应使用 bool 类型
原因:提高代码的可读性和类型安全性,避免使用整数表示布尔值导致的混淆。
示例

// 推荐:使用 bool 类型
#include <stdbool.h>
bool is_valid = true;

// 不推荐:使用整数表示布尔值(MISRA C 2025 rule 3.4 violation: [R] bool type shall be used for boolean values)
int is_valid = 1;

违反提示:MISRA C 2025 rule 3.4 violation: [R] bool type shall be used for boolean values

4. 声明和定义规则

4.1 规则 4.1:函数声明

分类:必要
英文描述:Functions shall be declared in header files
中文描述:函数应在头文件中声明
原因:确保函数声明的一致性,避免因声明不一致导致的错误。
示例

// 推荐:在头文件中声明函数
// header.h
void func(void);

// source.c
#include "header.h"
void func(void) {
    // 实现
}

// 不推荐:未在头文件中声明函数
void func(void) {
    // 实现
}

违反提示:MISRA C 2025 rule 4.1 violation: [R] Functions shall be declared in header files

4.2 规则 4.2:外部对象声明

分类:必要
英文描述:External objects shall be declared in header files
中文描述:外部对象应在头文件中声明
原因:确保外部对象声明的一致性,避免因声明不一致导致的错误。
示例

// 推荐:在头文件中声明外部对象
// header.h
extern int global_variable;

// source.c
#include "header.h"
int global_variable = 0;

// 不推荐:未在头文件中声明外部对象
int global_variable = 0;

违反提示:MISRA C 2025 rule 4.2 violation: [R] External objects shall be declared in header files

5. 初始化规则

5.1 规则 5.1:变量初始化

分类:必要
英文描述:All variables shall be initialized before use
中文描述:所有变量在使用前应初始化
原因:避免使用未初始化变量导致的不确定行为。
示例

// 不推荐:未初始化变量(MISRA C 2025 rule 5.1 violation: [R] All variables shall be initialized before use)
int x;
printf("%d\n", x); // 使用未初始化变量

// 推荐:初始化变量
int x = 0;
printf("%d\n", x);

违反提示:MISRA C 2025 rule 5.1 violation: [R] All variables shall be initialized before use

6. 指针和数组规则

6.1 规则 6.1:空指针检查

分类:必要
英文描述:Pointer values shall not be dereferenced without checking for NULL
中文描述:指针值在解引用前应检查是否为 NULL
原因:避免空指针解引用导致的崩溃或未定义行为。
示例

// 不推荐:未检查空指针(MISRA C 2025 rule 6.1 violation: [R] Pointer values shall not be dereferenced without checking for NULL)
void func(int *p) {
    *p = 10; // 未检查 p 是否为 NULL
}

// 推荐:检查空指针
void func(int *p) {
    if (p != NULL) {
        *p = 10;
    }
}

违反提示:MISRA C 2025 rule 6.1 violation: [R] Pointer values shall not be dereferenced without checking for NULL

6.2 规则 6.2:数组边界

分类:必要
英文描述:Array indices shall be within the bounds of the array
中文描述:数组索引应在数组边界内
原因:避免数组越界访问导致的崩溃或未定义行为。
示例

// 不推荐:数组越界访问(MISRA C 2025 rule 6.2 violation: [R] Array indices shall be within the bounds of the array)
int arr[5];
arr[5] = 10; // 越界访问

// 推荐:正确的数组访问
int arr[5];
arr[4] = 10; // 正确访问

违反提示:MISRA C 2025 rule 6.2 violation: [R] Array indices shall be within the bounds of the array

6.3 规则 6.3:指针算术

分类:必要
英文描述:Pointer arithmetic shall be used with care
中文描述:指针算术运算应谨慎使用
原因:避免因指针算术运算导致的越界访问或未定义行为。
示例

// 不推荐:不安全的指针算术(MISRA C 2025 rule 6.3 violation: [R] Pointer arithmetic shall be used with care)
int arr[5];
int *p = arr;
p = p + 10; // 可能越界

// 推荐:安全的指针算术
int arr[5];
int *p = arr;
if (p < arr + 5) {
    p = p + 1;
}

违反提示:MISRA C 2025 rule 6.3 violation: [R] Pointer arithmetic shall be used with care

7. 表达式规则

7.1 规则 7.1:整数溢出

分类:必要
英文描述:Integer arithmetic shall not overflow
中文描述:整数算术运算不应溢出
原因:避免因整数溢出导致的错误或安全问题。
示例

// 不推荐:可能的整数溢出(MISRA C 2025 rule 7.1 violation: [R] Integer arithmetic shall not overflow)
int a = INT_MAX;
a = a + 1; // 溢出

// 推荐:避免溢出
int a = INT_MAX;
if (a < INT_MAX) {
    a = a + 1;
}

违反提示:MISRA C 2025 rule 7.1 violation: [R] Integer arithmetic shall not overflow

7.2 规则 7.2:复杂表达式

分类:建议
英文描述:Complex expressions shall be avoided
中文描述:应避免复杂表达式
原因:提高代码的可读性和可维护性,减少出错的可能性。
示例

// 推荐:简单表达式
int a = 10;
int b = 20;
int c = a + b;

// 不推荐:复杂表达式
int result = (a > b ? (c < d ? e : f) : (g > h ? i : j)) + k;

8. 控制流规则

8.1 规则 8.1:goto 语句

分类:必要
英文描述:goto statements shall not be used
中文描述:禁止使用 goto 语句
原因:避免代码结构混乱,提高代码的可读性和可维护性。
示例

// 不推荐:使用 goto 语句(MISRA C 2025 rule 8.1 violation: [R] goto statements shall not be used)
void func(void) {
    int i = 0;
    if (i == 0) {
        goto error;
    }
    error:
    return;
}

// 推荐:使用结构化控制流
void func(void) {
    int i = 0;
    if (i == 0) {
        return;
    }
}

违反提示:MISRA C 2025 rule 8.1 violation: [R] goto statements shall not be used

8.2 规则 8.2:递归

分类:建议
英文描述:Recursive functions shall be avoided
中文描述:应避免使用递归函数
原因:避免栈溢出风险,提高代码的可靠性。
示例

// 不推荐:使用递归
int factorial(int n) {
    if (n <= 1) {
        return 1;
    }
    return n * factorial(n - 1); // 递归
}

// 推荐:使用迭代
int factorial(int n) {
    int result = 1;
    for (int i = 1; i <= n; i++) {
        result *= i;
    }
    return result;
}

9. 函数规则

9.1 规则 9.1:函数长度

分类:建议
英文描述:Functions shall not be excessively long
中文描述:函数长度不应过长
原因:提高代码的可读性和可维护性,便于理解和测试。
示例

// 推荐:短函数
int add(int a, int b) {
    return a + b;
}

// 不推荐:过长的函数
void process_data(void) {
    // 大量代码...
}
9.2 规则 9.2:函数参数

分类:建议
英文描述:Function parameter count shall be limited
中文描述:函数参数数量应有限制
原因:提高代码的可读性和可维护性,便于理解和使用。
示例

// 推荐:参数数量适中
void process(int a, int b, int c);

// 不推荐:参数过多
void process(int a, int b, int c, int d, int e, int f, int g);
9.3 规则 9.3:函数返回值

分类:必要
英文描述:Functions shall return values consistently
中文描述:函数应一致地返回值
原因:避免因返回值不一致导致的错误或混淆。
示例

// 推荐:一致的返回值
int divide(int a, int b) {
    if (b == 0) {
        return 0; // 错误情况返回 0
    }
    return a / b; // 正常情况返回结果
}

// 不推荐:不一致的返回值(MISRA C 2025 rule 9.3 violation: [R] Functions shall return values consistently)
int divide(int a, int b) {
    if (b == 0) {
        return -1; // 错误情况返回 -1
    }
    return a / b; // 正常情况返回结果
}

违反提示:MISRA C 2025 rule 9.3 violation: [R] Functions shall return values consistently

10. 预处理指令规则

10.1 规则 10.1:宏定义

分类:必要
英文描述:Macro parameters shall be enclosed in parentheses
中文描述:宏定义中的参数应使用括号保护
原因:避免因运算符优先级导致的错误。
示例

// 不推荐:未使用括号(MISRA C 2025 rule 10.1 violation: [R] Macro parameters shall be enclosed in parentheses)
#define ADD(a, b) a + b

// 推荐:使用括号
#define ADD(a, b) ((a) + (b))

违反提示:MISRA C 2025 rule 10.1 violation: [R] Macro parameters shall be enclosed in parentheses

10.2 规则 10.2:条件编译

分类:建议
英文描述:Conditional compilation shall be used sparingly
中文描述:应谨慎使用条件编译
原因:避免代码结构混乱,提高代码的可读性和可维护性。
示例

// 推荐:谨慎使用条件编译
#ifdef DEBUG
    printf("Debug information\n");
#endif

// 不推荐:过度使用条件编译
#ifdef FEATURE_A
    // 代码
#elif defined(FEATURE_B)
    // 代码
#else
    // 代码
#endif

11. 库函数使用规则

11.1 规则 11.1:安全函数

分类:必要
英文描述:Safe library functions shall be used
中文描述:应使用安全的库函数
原因:避免安全漏洞,提高代码的安全性。
示例

// 不推荐:使用不安全函数(MISRA C 2025 rule 11.1 violation: [R] Safe library functions shall be used)
char buffer[10];
gets(buffer); // 不安全

// 推荐:使用安全函数
char buffer[10];
fgets(buffer, sizeof(buffer), stdin); // 安全

违反提示:MISRA C 2025 rule 11.1 violation: [R] Safe library functions shall be used

11.2 规则 11.2:标准库使用

分类:必要
英文描述:Standard library functions shall be used correctly
中文描述:应正确使用标准库函数
原因:避免因库函数使用不当导致的错误。
示例

// 推荐:正确使用标准库函数
#include <string.h>
char dest[20];
char src[] = "Hello";
strcpy(dest, src);

// 不推荐:误用标准库函数
char dest[5];
char src[] = "Hello";
strcpy(dest, src); // 缓冲区溢出

违反提示:MISRA C 2025 rule 11.2 violation: [R] Standard library functions shall be used correctly

12. 内存管理规则

12.1 规则 12.1:动态内存分配

分类:必要
英文描述:Dynamic memory allocation shall be managed properly
中文描述:动态内存分配应正确管理
原因:避免内存泄漏和碎片,提高代码的可靠性。
示例

// 推荐:正确管理动态内存
int *p = malloc(sizeof(int));
if (p != NULL) {
    *p = 10;
    free(p);
    p = NULL;
}

// 不推荐:未正确管理动态内存(MISRA C 2025 rule 12.1 violation: [R] Dynamic memory allocation shall be managed properly)
int *p = malloc(sizeof(int));
*p = 10;
// 未释放内存

违反提示:MISRA C 2025 rule 12.1 violation: [R] Dynamic memory allocation shall be managed properly

12.2 规则 12.2:已释放内存

分类:必要
英文描述:Freed memory shall not be accessed
中文描述:已释放的内存不应被访问
原因:避免使用已释放内存导致的未定义行为。
示例

// 不推荐:访问已释放内存(MISRA C 2025 rule 12.2 violation: [R] Freed memory shall not be accessed)
int *p = malloc(sizeof(int));
free(p);
*p = 10; // 访问已释放内存

// 推荐:避免访问已释放内存
int *p = malloc(sizeof(int));
if (p != NULL) {
    *p = 10;
    free(p);
    p = NULL; // 置为 NULL
}

违反提示:MISRA C 2025 rule 12.2 violation: [R] Freed memory shall not be accessed

13. 输入输出规则

13.1 规则 13.1:格式化输入输出

分类:必要
英文描述:Format specifiers shall be correct
中文描述:格式化输入输出应使用正确的格式说明符
原因:避免因格式说明符错误导致的未定义行为。
示例

// 不推荐:格式说明符错误(MISRA C 2025 rule 13.1 violation: [R] Format specifiers shall be correct)
int x = 10;
printf("%f\n", x); // 格式说明符错误

// 推荐:正确的格式说明符
int x = 10;
printf("%d\n", x); // 正确

违反提示:MISRA C 2025 rule 13.1 violation: [R] Format specifiers shall be correct

14. 错误处理规则

14.1 规则 14.1:错误检查

分类:必要
英文描述:Function return values indicating error shall be checked
中文描述:函数返回值表示的错误应被检查
原因:及时发现和处理错误,提高代码的可靠性。
示例

// 不推荐:未检查错误返回值(MISRA C 2025 rule 14.1 violation: [R] Function return values indicating error shall be checked)
FILE *file = fopen("file.txt", "r");
// 未检查返回值

// 推荐:检查错误返回值
FILE *file = fopen("file.txt", "r");
if (file == NULL) {
    // 错误处理
}

违反提示:MISRA C 2025 rule 14.1 violation: [R] Function return values indicating error shall be checked

14.2 规则 14.2:错误处理一致性

分类:建议
英文描述:Error handling shall be consistent
中文描述:错误处理应一致
原因:提高代码的可维护性和可理解性,避免因错误处理不一致导致的问题。
示例

// 推荐:一致的错误处理
void process_file(const char *filename) {
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        printf("Error: Failed to open file\n");
        return;
    }
    // 处理文件
    fclose(file);
}

// 不推荐:不一致的错误处理
void process_file(const char *filename) {
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        return; // 无错误提示
    }
    // 处理文件
    fclose(file);
}

15. 并发规则

15.1 规则 15.1:并发安全

分类:必要
英文描述:Data access shall be thread-safe in concurrent environments
中文描述:多线程环境下的数据访问应是线程安全的
原因:避免竞争条件和数据不一致问题。
示例

// 推荐:线程安全的代码
#include <pthread.h>
int counter = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void increment(void) {
    pthread_mutex_lock(&mutex);
    counter++;
    pthread_mutex_unlock(&mutex);
}

// 不推荐:非线程安全的代码(MISRA C 2025 rule 15.1 violation: [R] Data access shall be thread-safe in concurrent environments)
int counter = 0;

void increment(void) {
    counter++; // 可能导致竞争条件
}

违反提示:MISRA C 2025 rule 15.1 violation: [R] Data access shall be thread-safe in concurrent environments

16. 代码风格规则

16.1 规则 16.1:缩进

分类:建议
英文描述:Code shall use consistent indentation
中文描述:代码应使用一致的缩进
原因:提高代码的可读性和可维护性。
示例

// 推荐:一致的缩进
void func(void) {
    if (condition) {
        statement;
    }
}

// 不推荐:不一致的缩进
void func(void) {
if (condition) {
    statement;
    }
}
16.2 规则 16.2:空格使用

分类:建议
英文描述:Code shall use consistent spacing
中文描述:代码应使用一致的空格
原因:提高代码的可读性和可维护性。
示例

// 推荐:一致的空格
int x = 10;
if (x > 5) {
    x = x + 1;
}

// 不推荐:不一致的空格
int x=10;
if(x>5){
    x=x+1;
}
16.3 规则 16.3:注释

分类:建议
英文描述:Code shall be well-commented
中文描述:代码应配有充分的注释
原因:提高代码的可读性和可维护性,便于其他开发者理解。
示例

// 推荐:充分的注释
/*
 * 计算两个数的和
 * @param a 第一个加数
 * @param b 第二个加数
 * @return 和值
 */
int add(int a, int b) {
    return a + b;
}

// 不推荐:无注释
int add(int a, int b) {
    return a + b;
}

17. 可移植性规则

17.1 规则 17.1:数据类型大小

分类:必要
英文描述:Dependence on the size of a data type shall be avoided
中文描述:应避免依赖特定数据类型的大小
原因:提高代码的可移植性,避免因平台差异导致的问题。
示例

// 不推荐:依赖特定大小(MISRA C 2025 rule 17.1 violation: [R] Dependence on the size of a data type shall be avoided)
int x;
char buffer[sizeof(int)];

// 推荐:使用标准类型
#include <stdint.h>
int32_t x;
char buffer[sizeof(int32_t)];

违反提示:MISRA C 2025 rule 17.1 violation: [R] Dependence on the size of a data type shall be avoided

17.2 规则 17.2:字节序

分类:必要
英文描述:Dependence on byte order shall be avoided
中文描述:应避免依赖特定的字节序
原因:提高代码的可移植性,避免因字节序差异导致的问题。
示例

// 不推荐:依赖字节序(MISRA C 2025 rule 17.2 violation: [R] Dependence on byte order shall be avoided)
uint32_t value = 0x12345678;
char *bytes = (char *)&value;
if (bytes[0] == 0x12) {
    // 大端
}

// 推荐:不依赖字节序
void write_uint32(uint8_t *buffer, uint32_t value) {
    buffer[0] = (value >> 24) & 0xFF;
    buffer[1] = (value >> 16) & 0xFF;
    buffer[2] = (value >> 8) & 0xFF;
    buffer[3] = value & 0xFF;
}

违反提示:MISRA C 2025 rule 17.2 violation: [R] Dependence on byte order shall be avoided

18. 安全性规则

18.1 规则 18.1:安全编码实践

分类:必要
英文描述:Secure coding practices shall be followed
中文描述:应遵循安全编码实践
原因:避免安全漏洞,提高代码的安全性。
示例

// 推荐:安全编码实践
#include <string.h>
void process_input(const char *input) {
    char buffer[100];
    strncpy(buffer, input, sizeof(buffer) - 1);
    buffer[sizeof(buffer) - 1] = '\0'; // 确保字符串终止
    // 处理输入
}

// 不推荐:不安全的编码实践(MISRA C 2025 rule 18.1 violation: [R] Secure coding practices shall be followed)
void process_input(const char *input) {
    char buffer[100];
    strcpy(buffer, input); // 可能导致缓冲区溢出
    // 处理输入
}

违反提示:MISRA C 2025 rule 18.1 violation: [R] Secure coding practices shall be followed

三、规则统计

规则分类统计

分类 数量 占比
强制规则 2 5.4%
必要规则 30 81.1%
建议规则 5 13.5%
总计 37 100%

规则类别统计

类别 规则数量
基础规则 2
标识符规则 2
类型系统规则 4
声明和定义规则 2
初始化规则 1
指针和数组规则 3
表达式规则 2
控制流规则 2
函数规则 3
预处理指令规则 2
库函数使用规则 2
内存管理规则 2
输入输出规则 1
错误处理规则 2
并发规则 1
代码风格规则 3
可移植性规则 2
安全性规则 1
总计 37

四、总结

MISRA C:2025 是 MISRA C 标准的最新版本,基于 C23 标准,旨在适应最新的 C 语言实践和嵌入式系统开发需求。该标准包含 37 条核心规则,涵盖了从基础语言使用到高级安全性的各个方面,为开发团队提供了全面的编码指南。

核心要点

  1. 现代性:基于 C23 标准,利用最新的 C 语言特性和改进
  2. 安全性:强化了对缓冲区溢出、整数溢出、空指针等安全问题的防护
  3. 可靠性:强调错误检查、内存管理、初始化等方面的正确性
  4. 可维护性:通过清晰的命名、代码风格、注释等提高代码质量
  5. 可移植性:避免依赖特定平台特性,确保代码在不同环境下的一致性
  6. 线程安全:加强了对并发环境下线程安全的要求
  7. 一致性:统一编码风格和实践,减少团队协作中的问题

与之前版本的主要区别

  1. 基础标准:从 C18 升级到 C23
  2. 安全性:增加了专门的安全性规则,强化安全编码实践
  3. 类型系统:加强了对布尔类型的要求
  4. 错误处理:增加了错误处理一致性的建议
  5. 代码风格:增加了对注释的建议
  6. 指针规则:增加了对指针算术运算的限制

实施建议

  1. 建立编码规范:基于 MISRA C:2025 制定项目特定的编码规范
  2. 使用静态分析工具:配置静态分析工具检查 MISRA C 2025 规则
  3. 代码审查:将 MISRA C 2025 规则纳入代码审查标准
  4. 培训:对开发人员进行 MISRA C:2025 标准的培训
  5. 持续改进:定期评估代码质量,持续改进编码实践
  6. 工具支持:选择支持 MISRA C:2025 的编译器和静态分析工具

版本演进

MISRA C:2025 是对 MISRA C:2023 的进一步完善,适应了最新的 C 语言标准和嵌入式系统开发需求,为开发团队提供了更加全面、严格的编码指南。

五、参考资料

  • MISRA C:2025 标准文档
  • ISO/IEC 9899:2023 (C23) 标准
  • MISRA C:2025 实施指南
  • MISRA C 历史版本对比分析

本文档基于 MISRA C:2025 标准编写,旨在为开发团队提供详细的规则分析和实施指导。通过遵守这些规则,可以显著提高嵌入式系统软件的质量和可靠性,适应最新的 C 语言开发需求。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐