関数渡しの qmlRegisterSingletonType() で QObject * 型の返り値が nullptr の際のクラッシュを改善しました

Qt Quick の Singleton 型を C++ から登録するには、QJSValue を返す関数を登録するもの と、QObject * を返す関数を登録するものQUrl と名前を指定するもの の3通りの方法があります。

このうち2番目の方法で登録する際に、設定した関数が(誤って)nullptr を返してしまうと Qt Quick のエンジンの内部でわけのわからないエラーになって落ちる問題を改善しました。

変更は add null check for qmlRegisterSingletonType() で、nullptr の場合に、「qmlRegisterSingletonType() に渡したコールバック関数が null pointer を返したから○○型はシングルトンとして扱えないよ」というエラーメッセージを出してアプリケーションを強制終了するというものです。

落ちるのは一緒ですが、原因をとてもわかりやすく表示して落ちるのでだいぶ改善されたと思います。

警告にとどめて動作は継続するというパターンも書いたのですが(パッチセット1)意図した動作ではない以上、無理やり動かしたところであまり意味がないので強制終了をするようにしました。

こんなマヌケな?バグを踏む人は年に一人いるかいないかのような気もしますが、うっかりこんな状況に陥って Qt の中の奥深くでクラッシュすると、内部にあまり馴染みのない人であれば問題を特定するのに1日とか2日とかかかったりするので、とても親切になったと思います。

おすすめ