Don't abuse new to do a reinterpret_cast
authorLars Knoll <lars.knoll@digia.com>
Thu, 12 Jun 2014 08:52:32 +0000 (10:52 +0200)
committerSimon Hausmann <simon.hausmann@digia.com>
Sun, 24 Aug 2014 11:38:25 +0000 (13:38 +0200)
Using new to do a reinterpret_cast is rather confusing.
Also protect the list model case against self-assignment
which could lead to memory corruption.

Change-Id: I10b81644d0004d4a50a5a74e5b8c58e27cbe6934
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/qml/types/qqmllistmodel.cpp

index be49b6e..f4c32ce 100644 (file)
@@ -810,7 +810,7 @@ int ListElement::setDoubleProperty(const ListLayout::Role &role, double d)
 
     if (role.type == ListLayout::Role::Number) {
         char *mem = getPropertyMemory(role);
-        double *value = new (mem) double;
+        double *value = reinterpret_cast<double *>(mem);
         bool changed = *value != d;
         *value = d;
         if (changed)
@@ -826,7 +826,7 @@ int ListElement::setBoolProperty(const ListLayout::Role &role, bool b)
 
     if (role.type == ListLayout::Role::Bool) {
         char *mem = getPropertyMemory(role);
-        bool *value = new (mem) bool;
+        bool *value = reinterpret_cast<bool *>(mem);
         bool changed = *value != b;
         *value = b;
         if (changed)
@@ -842,8 +842,8 @@ int ListElement::setListProperty(const ListLayout::Role &role, ListModel *m)
 
     if (role.type == ListLayout::Role::List) {
         char *mem = getPropertyMemory(role);
-        ListModel **value = new (mem) ListModel *;
-        if (*value) {
+        ListModel **value = reinterpret_cast<ListModel **>(mem);
+        if (*value && *value != m) {
             (*value)->destroy();
             delete *value;
         }