インターネットにアクセスするQtアプリがクラッシュする不具合
インターネットにアクセスするQtアプリがクラッシュする不具合が報告されています。- webbrowser-app crashed with SIGSEGV in QNetworkConfiguration::~QNetworkConfiguration()
- Crash at shutdown in ~QNetworkConfiguration
Qtで作られたアプリがインターネットにアクセスした後、そのアプリを終了すると、アプリ終了時にアプリがクラッシュします。
不具合報告でこの問題が発生しているアプリは「webbrowser-app」ですが、この問題は「Qt」の不具合であるため、他のQtアプリでも発生します。
ただ再現性は確実ではありません。
スタックトレース
適当なアプリで現象を再現させ「Qt Creator」でスタックトレースを見ると、以下のようになりました。「QNetworkConfiguration」クラスのデストラクタ―で問題が発生していることが分かります。
main関数のスコープを抜ける直前に「QApplication」インスタンスのデストラクタ―が呼ばれ、そこから「QNetworkConfiguration」インスタンスのデストラクタ―が呼ばれています。
この問題に対応したパッチのコメントを見ると、以下の記述があります。
+QPluginLoader hasn't unloaded in its destructor since Qt 5.0, but we
+missed the equivalent code in QFactoryLoader (which bypasses
+QPluginLoader). Besides, QPluginLoader::unload() was still doing
+unloading, which it won't anymore.
+
+Not unloading plugins is Qt's policy, as decided during the 5.0
+development process and reaffirmed now in 5.6. This is due to static
+data in plugins leaking out and remaining in use past the unloading of
+the plugin, causing crashes.
+
+This does not affect QLibrary and QLibrary::unload(). Those are meant
+for non-Qt loadable modules, so unloading them may be safe.
+missed the equivalent code in QFactoryLoader (which bypasses
+QPluginLoader). Besides, QPluginLoader::unload() was still doing
+unloading, which it won't anymore.
+
+Not unloading plugins is Qt's policy, as decided during the 5.0
+development process and reaffirmed now in 5.6. This is due to static
+data in plugins leaking out and remaining in use past the unloading of
+the plugin, causing crashes.
+
+This does not affect QLibrary and QLibrary::unload(). Those are meant
+for non-Qt loadable modules, so unloading them may be safe.
Qt 5.0の開発過程でプラグインのアンロードは行わない方針になったが、その方針に追従していない処理が原因であるとのことです。