【关注我,后续持续新增专题博文,谢谢!!!】
上一篇我们讲了:
这一篇我们开始讲: 高效C/C++之七:Coverity修复问题:判定非空指针变量后使用 和 打印函数切记对应类型
目录
【关注我,后续持续新增专题博文,谢谢!!!】
一、背景
二、:判定非空指针变量后使用
2.1:问题描述
2.2 :风险及影响
2.3 :优化建议
2.4 :关于 NULL 和 nullptr
【关注我,后续持续新增专题博文,谢谢!!!】
一、打印函数切记对应类型
1.1 :风险及影响
.在处理coverity问题过程中,一半都是此问题,这个没什么好说的,按照规范处理。。
1.2 :优化建议类型符号表
类型
含义
%d
十进制有符号整数
%ld
long int
%lld
long long int
%u
十进制无符号整数
%lu
32 位无符号整数
%llu
64 位无符号整数
%f
浮点数
%s
字符串
%c
单个字符
%e
指数形式的浮点数
%x, %X
无符号以十六进制表示的整数
%o
无符号以八进制表示的整数
%g
把输出的值按照 %e 或者 %f 类型中输出长度较小的方式输出
%p
输出地址符
二、:判定非空指针变量后使用
2.1:问题描述
直接使用未判空的指针,存在空指针引用风险。
static int open(const struct hw_module_t* pHwModuleAPI,const char* pCameraIdAPI,struct hw_device_t** ppHwDeviceAPI)
{int resultOut = 0;CAMX_ENTRY_SCOPE(CamxLogGroupHAL, SCOPEEventHAL3Open);CamxResult result = CamxResultSuccess;//宏定义,如果参数是NULL,都直接returnCAMX_ASSERT(NULL != pHwModuleAPI);CAMX_ASSERT(NULL != pHwModuleAPI->id);CAMX_ASSERT(NULL != pHwModuleAPI->name);CAMX_ASSERT(NULL != pHwModuleAPI->author);CAMX_ASSERT(NULL != pHwModuleAPI->methods);CAMX_ASSERT('\0' != pCameraIdAPI[0]);CAMX_ASSERT(NULL != pCameraIdAPI);CAMX_ASSERT(NULL != ppHwDeviceAPI);//都需要判断是否NULL指针if ((NULL != pHwModuleAPI) &&(NULL != pHwModuleAPI->id) &&(NULL != pHwModuleAPI->name) &&(NULL != pHwModuleAPI->author) &&(NULL != pHwModuleAPI->methods) &&(NULL != pCameraIdAPI) &&('\0' != pCameraIdAPI[0]) &&(NULL != ppHwDeviceAPI)){
2.2 :风险及影响
.直接使用指针,当其为空的时候,会造成空指针应用导致程序崩溃crash。
2.3 :优化建议
引用指针前最好进行非空判断,判空出错也最好添加出错log,方便一步定位,切勿再应用后再做非空判段,本末倒置。 .
2.4 :关于 NULL 和 nullptr
为什么在 C++11 中使用 nullptr?为什么 NULL 还不够?
假设有以下两个函数声明:
void func(int n); void func(char *s);func函数被重载,我们在调用func(NULL);会调用上面哪个函数?
func( NULL );虽然看起来第二个函数会被调用,毕竟你是在传递一个看起来像指针的东西,但它确实是第一个被调用的函数!问题是因为 NULL 是 0,而 0 是整数,所以会调用第一个版本的 func。这种事情不会一直发生,但是当它发生时,会非常令人沮丧和困惑。如果你不知道发生了什么的细节,它很可能看起来像一个编译器错误。看起来像编译器错误的语言功能并不是您想要的输入空指针。
在 C++11 中,nullptr 是一个新关键字,可以用于表示 NULL 指针;换句话说,无论以前在哪里写 NULL,都应该使用 nullptr。
【关注我,后续持续新增专题博文,谢谢!!!】
下一篇讲解: