关于Null的分析及强转出现的bug

概要

  这里对NULL做一个简单的技术分析以及对项目中出现的bug做一个校验。

技术名词解释

  NULL是一个表示空指针的预定义常量,通常在C/C++等编程语言中使用。在技术上,NULL的类型为void*,即空指针的类型是通用指针类型。
用途:在编写程序的时候,可以使用NULL来标记一个未被初始化的指针或者表示函数的返回值为空。

  名词扩展(nullptr):和NULL相比,nullptr有以下优势:
更明确的类型信息:nullptr的类型是std::nullptr_t,它只能转换为指针类型,因此更加明确。
避免了某些隐式转换:NULL在一些情况下会被隐式转换为整数0,导致出现编译错误或者隐藏的语义错误,而nullptr避免了这种问题。

技术细节及bug分析

  出现的项目bug:

 case SET_FEATURE_CFG_AWB_LIB_INIT:
    {
        pstAwbResult = (IspAwbmTable_t *)IspAwbCfg;
        // 这里直接用指针传入其实存在风险,因为isp_awb_init函数需要传入一个有效的地址。
        RetAwbLib = isp_awb_init(IspCntxt->DevIsp.DevId, pstAwbResult);
        if (RetAwbLib)
        {
            ELOG_ERR("Isp_awb_init Error");
            Ret = ERROR_GENERIC;
        }
        Ret = SUCCESS;
        break;

  应该如何修复?通过对指针进行NULL的检查,避免空指针类型的出现。 为了程序的健壮性,因为调用接口不知道传进来的是什么,实际项目中就出现了传进来NULL的情况

case SET_FEATURE_CFG_AWB_LIB_INIT:
    {
        pstAwbResult = (IspAwbmTable_t *)IspAwbCfg;
		if (IspAwbCfg == NULL)
		{
			ELOG_ERR("IspAwbCfg is NULL");
			Ret = ERROR_GENERIC;
			break;
		}
        RetAwbLib = isp_awb_init(IspCntxt->DevIsp.DevId, pstAwbResult);
        if (RetAwbLib)
        {
            ELOG_ERR("Isp_awb_init Error");
            Ret = ERROR_GENERIC;
        }
        Ret = SUCCESS;
        break;

小结

  在使用NULL时,需要注意以下几点:

  1. 使用前需要包含相关头文件,如stdlib.h或stddef.h等。
  2. 不能将NULL与其他类型直接比较,如不能将NULL与0或者’\0’进行比较,应该使用指针类型进行比较。
  3. 在使用指针时,应该始终检查指针是否为NULL,避免访问非法内存引起程序崩溃或者安全漏洞。
  4. 在C++11及之后版本中,建议使用nullptr代替NULL,nullptr是一个C++11的关键字,它明确了指向空指针的类型,并避免了一些可能会出现的问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值