空指针访问的陷阱
背景
之前用AddressSanitizer工具验证阿里云短视频SDK的稳定性时出现了一个崩溃问题,报错堆栈在一个空指针对象访问其成员函数处,但是从整体代码执行流程分析发现其对象指针一直是空的,诡异的是不使用工具运行时无论如何都不会崩溃。
ASAN工具报错发生在如下行,此处mAudioRenderServicePtr为NULL。
this->OnStop(false, mAudioRenderServicePtr->GetAddr());
下面对正常运行和工具调试出现的结果一致进行分析,以及延伸的讨论一下关于空指针访问的一些陷阱。
分析
空指针即未指向任何对象,于是从语言层面来讲在访问空指针时应该一定发生崩溃,但在多函数调用及参数传递过程中,以及C++语言的封装特性、编译器是否优化的情况下,则不一定发生崩溃或者崩溃延迟。
先看看Ge