You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者αλεχολυτ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 09:45:31