文章目录
概要
这里对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时,需要注意以下几点:
- 使用前需要包含相关头文件,如stdlib.h或stddef.h等。
- 不能将NULL与其他类型直接比较,如不能将NULL与0或者’\0’进行比较,应该使用指针类型进行比较。
- 在使用指针时,应该始终检查指针是否为NULL,避免访问非法内存引起程序崩溃或者安全漏洞。
- 在C++11及之后版本中,建议使用nullptr代替NULL,nullptr是一个C++11的关键字,它明确了指向空指针的类型,并避免了一些可能会出现的问题。