Skip to content

Mac ビルドエラー(null-dereference) #22

Description

@zbdk

Mac環境にてビルドエラーが発生しています。
発生個所はサードパーティ製のライブラリ内のようですが詳しくは下記文章をご確認ください。
別途お送りしているプルリクの影響で行数は変動している可能性があります。
軽く調べてみましたがBuild.csにエラー回避できるオプションは用意されていないようです。
ローカルでは修正案Aの変更でビルドが通ることを確認していますが、実行時に問題が出ないかの確認はできていません。

UE5.8 Mac ビルドエラー報告: null-dereference (-Werror,-Wnull-dereference)

■ 概要
UE 5.8 の Mac ビルドで使用される Clang 21.x (Xcode 26) では、
-Wnull-dereference 警告が -Werror によりエラーに昇格されるようになった。
babel.cpp 内の get_null_object テンプレート関数で、NULLポインタを参照に
バインドする未定義動作がエラーとして検出される。

■ 環境

  • Unreal Engine 5.8
  • Xcode 26.6 (Apple clang version 21.0.0, clang-2100.1.1.101)
  • macOS 26.5, arm64

================================================================================

【1】babel.cpp
パス: Source/SpriteStudio6Ed/Private/Loader/babel/babel.cpp

エラー: -Werror,-Wnull-dereference
該当箇所: L2993
発生回数: 19回(テンプレートインスタンス化ごとに1回)

エラーメッセージ:
    binding dereferenced null pointer to reference has undefined behavior

該当コード:
    template<class T> inline T & get_null_object() { return *((T*)NULL); }

原因:
NULLポインタをデリファレンスして参照にバインドしており、C++標準では
未定義動作(UB)となる。従来のコンパイラでは警告なしまたは警告のみで
通過していたが、UE 5.8のClang設定で-Werrorに含まれるようになった。

テンプレートインスタンス化の呼び出しチェーン:
    babel.cpp:3700 call_method_ss(create_engine<bbl_translater_type>(...))
      → babel.cpp:3209 get_method_selector(...)
        → babel.cpp:3196 get_null_object<method_selector_binarable<T>>()
          → babel.cpp:2993 return *((T*)NULL);  ← ここでエラー

修正案A (推奨): 静的オブジェクトを返す方式に変更
    template<class T> inline T & get_null_object() {
        static T obj{};
        return obj;
    }

修正案B: reinterpret_castでコンパイラの警告を回避
    template<class T> inline T & get_null_object() {
        static T* ptr = nullptr;
        return *reinterpret_cast<T*>(ptr);
    }
    ※ 未定義動作は残るが、一部コンパイラで警告を抑制できる場合がある。
      根本解決にはならないため非推奨。

修正案C: プラグマで局所的に警告を抑制
    #if defined(__clang__)
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wnull-dereference"
    #endif
    template<class T> inline T & get_null_object() { return *((T*)NULL); }
    #if defined(__clang__)
    #pragma clang diagnostic pop
    #endif
    ※ 未定義動作は残るが、ビルドは通るようになる。

================================================================================

■ 備考

  • Windows ビルド (MSVC) ではこの警告は発生しないため問題なくビルドできる。
  • UE 5.7 以前の Mac ビルドでも -Wnull-dereference が -Werror に含まれて
    いなかったため問題にならなかった。
  • babel.cpp はサードパーティの文字コード変換ライブラリであり、
    get_null_object は型推論のためのトリック(実際にはNULL参照を使用しない
    コードパスで使われている可能性がある)として実装されている。
  • 修正案Aが最も安全だが、get_null_objectの使われ方によっては動作が
    変わる可能性があるため、実際のコードパスの確認が必要。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions