Detect and abort if an object is deleted during signal handling
authorKent Hansen <kent.hansen@nokia.com>
Wed, 16 May 2012 06:58:37 +0000 (08:58 +0200)
committerQt by Nokia <qt-info@nokia.com>
Mon, 21 May 2012 06:40:41 +0000 (08:40 +0200)
commit65500896a05344bdfd5fcbfa9a6456f48cd4e4a4
tree4bbda8dbc6db22d48ef7e93b343effb941d76244
parentb2f9a9a48e805133f49ff0a4491a93f12f770dc0
Detect and abort if an object is deleted during signal handling

If an object gets deleted while one of its own signal handler
expressions is being evaluated, a subsequent crash is inevitable.

While we could introduce guards/checks in the signal handler kernel
(QMetaObject::activate(), QQmlNotifier::emitNotify() and friends) to
detect and mask the sender deletion, this arguably isn't helpful; the
code that emitted the signal is likely to access member variables
directly after emitting the signal, causing semi-random crashes.

This situation is a symptom of misbehaving application code. Catch it
early rather than later, and issue a qFatal() with a helpful message.
Coupled with a backtrace, this should make it easier to track down
the flawed C++ application logic.

Change-Id: I8c77800e49c475def613224f208181c2d0af60e6
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
Reviewed-by: Aaron Kennedy <aaron.kennedy@nokia.com>
src/qml/qml/qqmlboundsignal_p.h
src/qml/qml/qqmlengine.cpp