static_cast非空指针返回空?是GCC Bug还是存在未定义行为?
GCC
static_cast非空指针被判定可能返回nullptr的案例分析 我遇到一个GCC编译警告问题:编译器认为static_cast对非空指针操作可能返回nullptr,进而触发potential null pointer dereference警告。排查后未发现代码存在常见的未定义行为,但无法确定原因。
编译使用的选项:-O1 -fPIC -Wnull-dereference -Werror
对应的代码如下:
struct IR { virtual ~IR() = default; }; struct IF { virtual ~IF() = default; virtual void get() {}; }; struct SC : IR, IF { bool h(); // { return true; }; }; struct HD : public IR { virtual void g() { if (r_ && r_->h()) { static_cast<IF*>(r_)->get(); } } SC* r_ = nullptr; }; bool SC::h() { return true; } HD hd;
满足以下任一条件即可消除该警告:
- 将
SC::h()改为内联函数; - 将
IF::get()改为非虚函数; - 优化等级从
-O1改为-O0; - 移除
-fPIC选项;
现在的疑问是:这是GCC的Bug,还是代码仍存在未定义行为,或是static_cast对非空指针操作确实可能返回nullptr?
内容的提问来源于stack exchange,提问作者αλεχολυτ
相关产品推荐
相关产品推荐

