MISRA C-2012准则之指针类型转换
目录
一、MISRA C简介
二、指针类型转换
错误示例 1:函数指针与其他类型间转换
错误示例 2:指向不完整类型的指针转换
错误示例 3:不同类型指针间转换
错误示例 4:指针转换为整形变量
错误示例 5:直接void指针转对象指针
错误示例 6:void指针与数值类型转换
错误示例 7:对象指针与算术类型转换
错误示例 8:删除const/volatile限定
错误示例 9:非NULL整数转指针
三、注意事项
相关文章如下:
1、《MISRA C-2012准则之标准C环境准则》
2、《MISRA C-2012准则之未使用的代码的处理》
3、《MISRA C-2012准则之注释》
4、《MISRA C-2012准则之标识符》
5、《MISRA C-2012准则之常量》
6、《MISRA C-2012准则之声明与定义》
7、《MISRA C-2012准则之初始化》
8、《MISRA C-2012准则之基本数据类型》
9、《MISRA C-2012准则之指针类型转换》
10、《MISRA C-2012准则之表达式》
一、MISRA C简介
MISRA C是由汽车产业软件可靠性协会(MISRA)提出的C语言开发标准。其目的是在增进嵌入式系统的安全性及可移植性。
MISRA C一开始主要是针对汽车产业,不过其它产业也逐渐开始使用MISRA C:包括航天、电信、 国防、医疗设备、铁路等领域中都已有厂商使用MISRA C。
MISRA C的第一版是在1998年发行,一般称为MISRA-C:1998。在2004年时发行了第二版的MISRA C,称作MISRA-C:2004。2012年发布第三版,为当前最新有效的C语言规范版本,称为MISRA-C:2012。 MISRA C不能100%保证程序不出问题,但是能尽可能的预防,总结一下,基本上使用MISRA C具有以下五个维度的优势:
1、提升可靠性
2、提升可读性
3、提升可移植性
4、提升可维护性
5、提升安全性
二、指针类型转换
错误示例 1:函数指针与其他类型间转换
int func()
{ return 0;
}int (*func_ptr)() = func; // 正确
int var = 5;
int (*wrong_func_ptr)() = (int(*)())var; // 错误:整型转函数指针
错误示例 2:指向不完整类型的指针转换
struct Incomplete; // 不完整类型
int var;
struct Incomplete *ptr_incomplete;
int *wrong_int_ptr = (int*)ptr_incomplete; // 错误:不完整类型指针转整型指针
错误示例 3:不同类型指针间转换
int arr[10];
char *wrong_char_ptr = (char*)arr; // 错误:不同类型指针转换(除非是字符数组)
错误示例 4:指针转换为整形变量
int *ptr;
long value = (long)ptr; // 建议:避免指针转整形
错误示例 5:直接void指针转对象指针
void *void_ptr;
int *int_ptr = (int*)void_ptr; // 建议:避免直接转换,应检查类型
错误示例 6:void指针与数值类型转换
void *void_ptr;
int value = (int)void_ptr; // 错误:void指针转数值类型
错误示例 7:对象指针与算术类型转换
int *int_ptr;
double value = (double)int_ptr; // 错误:指针转算术类型
错误示例 8:删除const/volatile限定
const int *const_ptr;
int *wrong_ptr = (int*)const_ptr; // 错误:删除const限定
错误示例 9:非NULL整数转指针
int zero = 0;
int *ptr = (int*)zero; // 错误:非NULL整数转指针(除非是NULL)
三、注意事项
- 例外情况:空指针(NULL)可以安全转换为函数指针,函数指针也可以转换为void。
- 在C语言中,字符指针(char)与void之间的转换通常是允许的,但其他类型指针间的转换应避免。
- 强制转换时,应保留const/volatile限定符,否则可能导致未定义行为。