当前位置: 首页 > news >正文

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; // 建议:避免直接转换,应检查类型

错误示例 6void指针与数值类型转

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限定符,否则可能导致未定义行为

http://www.dtcms.com/a/285837.html

相关文章:

  • build.log中的is not a subdirectory of和ScanSourceDirectories函数的关系
  • 「Java案例」方法重装求不同类型数的立方
  • MySql:索引,结构
  • Leetcode 04 java
  • cocosCreator2.4 Android 输入法遮挡
  • JAVA中StringBuilder类,StringJoiner类构造函数方法简单介绍
  • C语言基础:数组练习题
  • Zabbix安装-Server
  • 【JS笔记】Java Script学习笔记
  • 【C语言进阶】题目练习(2)
  • react控制react Popover组件显示隐藏
  • Vue3 中使用 Element Plus 实现自定义按钮的 ElNotification 提示框
  • WAF 能防御哪些攻击?
  • logback日志控制服务器日志输出
  • Leetcode刷题营第三十三题:对称二叉树
  • Gitee 远程库多人如何协作?
  • gitlab-runner配置问题记录
  • hive分区表临时加载日批数据文件
  • TapData 出席 2025 MongoDB 用户大会新加坡站,分享构建实时统一数据平台最佳实践
  • day24 力扣93.复原IP地址 力扣78.子集 力扣90.子集II
  • 【基座模型】Qwen3报告总结
  • 告别 addEventListener
  • effective python 条款11 学会对序列做切片
  • 人脸检测算法——SCRFD
  • 智能Agent场景实战指南 Day 16:Agent记忆系统设计
  • 解决 Selenium 页面跳转过快导致的内容获取问题:从原理到实践
  • 基于ROS2进行相机标定,并通过测试相机到棋盘格之间的距离进行验证
  • 大模型格式
  • (一)Eshop(异常处理中间件)
  • 工业数据集成中间件工具OPC Router详细介绍