[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[mdds] 48/62: Imported Upstream version 0.11.1



This is an automated email from the git hooks/post-receive script.

rene pushed a commit to branch master
in repository mdds.

commit 1c0e8a4317f3bae10a2f5e06234ce920a281a494
Author: Rene Engelhard <rene@debian.org>
Date:   Thu Apr 21 14:50:53 2016 +0200

    Imported Upstream version 0.11.1
---
 NEWS                                              |  12 ++
 configure                                         |  32 ++---
 configure.ac                                      |   2 +-
 include/mdds/flat_segment_tree.hpp                |  12 ++
 include/mdds/mixed_type_matrix_flag_storage.hpp   |   2 +
 include/mdds/mixed_type_matrix_storage_sparse.inl |   4 +-
 include/mdds/multi_type_matrix_def.inl            |  18 +--
 include/mdds/multi_type_vector_def.inl            |   4 +-
 include/mdds/point_quad_tree.hpp                  |   4 -
 include/mdds/quad_node.hpp                        |  15 +-
 include/mdds/segment_tree.hpp                     |  12 +-
 misc/sorted_string_map_perf.cpp                   | 166 ++++++++++++++++++++++
 src/flat_segment_tree_test.cpp                    | 112 ++++++++-------
 src/mixed_type_matrix_test.cpp                    |  82 ++++++-----
 src/multi_type_matrix_test.cpp                    |  58 ++++----
 src/multi_type_vector_test_custom.cpp             |  94 ++++++++++--
 src/multi_type_vector_test_default.cpp            |  78 +++++-----
 src/point_quad_tree_test.cpp                      |  30 ++--
 src/rectangle_set_test.cpp                        |  38 +++--
 src/segment_tree_test.cpp                         |  59 ++++----
 20 files changed, 581 insertions(+), 253 deletions(-)

diff --git a/NEWS b/NEWS
index 65287d3..b00d0d0 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,15 @@
+mdds 0.11.1
+
+* all
+
+  * fixed a large number of outstanding defects reported by Coverity
+    Scan.
+
+* multi_type_vector
+
+  * fixed 2 cases of double-free bug in the variant of swap() that
+    allows segmented swapping.
+
 mdds 0.11.0
 
 * sorted_string_map (new)
diff --git a/configure b/configure
index 46d9ba5..caa8c78 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for mdds 0.11.0.
+# Generated by GNU Autoconf 2.69 for mdds 0.11.1.
 #
 # Report bugs to <kohei.yoshida@gmail.com>.
 #
@@ -579,8 +579,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='mdds'
 PACKAGE_TARNAME='mdds'
-PACKAGE_VERSION='0.11.0'
-PACKAGE_STRING='mdds 0.11.0'
+PACKAGE_VERSION='0.11.1'
+PACKAGE_STRING='mdds 0.11.1'
 PACKAGE_BUGREPORT='kohei.yoshida@gmail.com'
 PACKAGE_URL=''
 
@@ -1181,7 +1181,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures mdds 0.11.0 to adapt to many kinds of systems.
+\`configure' configures mdds 0.11.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1242,7 +1242,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of mdds 0.11.0:";;
+     short | recursive ) echo "Configuration of mdds 0.11.1:";;
    esac
   cat <<\_ACEOF
 
@@ -1335,7 +1335,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-mdds configure 0.11.0
+mdds configure 0.11.1
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1352,7 +1352,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by mdds $as_me 0.11.0, which was
+It was created by mdds $as_me 0.11.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -1701,7 +1701,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
-VERSION=0.11.0
+VERSION=0.11.1
 
 
 PACKAGE_TARNAME=mdds
@@ -2298,7 +2298,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by mdds $as_me 0.11.0, which was
+This file was extended by mdds $as_me 0.11.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -2351,7 +2351,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-mdds config.status 0.11.0
+mdds config.status 0.11.1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -3455,7 +3455,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by mdds $as_me 0.11.0, which was
+This file was extended by mdds $as_me 0.11.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -3508,7 +3508,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-mdds config.status 0.11.0
+mdds config.status 0.11.1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -4613,7 +4613,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by mdds $as_me 0.11.0, which was
+This file was extended by mdds $as_me 0.11.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -4666,7 +4666,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-mdds config.status 0.11.0
+mdds config.status 0.11.1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -5772,7 +5772,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by mdds $as_me 0.11.0, which was
+This file was extended by mdds $as_me 0.11.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -5825,7 +5825,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-mdds config.status 0.11.0
+mdds config.status 0.11.1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff --git a/configure.ac b/configure.ac
index 25e597b..c56e41e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,4 +1,4 @@
-AC_INIT(mdds, 0.11.0, kohei.yoshida@gmail.com)
+AC_INIT(mdds, 0.11.1, kohei.yoshida@gmail.com)
 
 VERSION=AC_PACKAGE_VERSION
 AC_SUBST(VERSION)
diff --git a/include/mdds/flat_segment_tree.hpp b/include/mdds/flat_segment_tree.hpp
index 184ca34..3630c40 100644
--- a/include/mdds/flat_segment_tree.hpp
+++ b/include/mdds/flat_segment_tree.hpp
@@ -61,6 +61,12 @@ public:
         {
             return low == r.low && high == r.high;
         }
+    
+        nonleaf_value_type()
+            : low(0)
+            , high(0)
+        {
+        }
     };
 
     struct leaf_value_type
@@ -72,6 +78,12 @@ public:
         {
             return key == r.key && value == r.value;
         }
+
+        leaf_value_type()
+            : key(0)
+            , value(0)
+        {
+        }
     };
 
     // Handlers required by the node template class.
diff --git a/include/mdds/mixed_type_matrix_flag_storage.hpp b/include/mdds/mixed_type_matrix_flag_storage.hpp
index 380557c..768a136 100644
--- a/include/mdds/mixed_type_matrix_flag_storage.hpp
+++ b/include/mdds/mixed_type_matrix_flag_storage.hpp
@@ -27,6 +27,7 @@
 
 #ifdef MDDS_UNIT_TEST
 #include <iostream>
+#include <boost/io/ios_state.hpp>
 #endif
 
 #include "mdds/hash_container/map.hpp"
@@ -85,6 +86,7 @@ public:
         }
 
         cout << "flags stored:" << endl;
+        boost::io::ios_flags_saver ifs(cout);
         typename flag_store_type::const_iterator itr = m_flags.begin(), itr_end = m_flags.end();
         for (; itr != itr_end; ++itr)
         {
diff --git a/include/mdds/mixed_type_matrix_storage_sparse.inl b/include/mdds/mixed_type_matrix_storage_sparse.inl
index a8d79eb..80b8012 100644
--- a/include/mdds/mixed_type_matrix_storage_sparse.inl
+++ b/include/mdds/mixed_type_matrix_storage_sparse.inl
@@ -79,7 +79,9 @@ public:
         m_rows(r.m_rows),
         m_empty_elem(r.m_empty_elem),
         m_row_size(r.m_row_size),
-        m_col_size(r.m_col_size) {}
+        m_col_size(r.m_col_size),
+        m_numeric(r.m_numeric),
+        m_valid(r.m_valid) {}
 
     ~storage_sparse() {}
 
diff --git a/include/mdds/multi_type_matrix_def.inl b/include/mdds/multi_type_matrix_def.inl
index 36f5448..c3b713a 100644
--- a/include/mdds/multi_type_matrix_def.inl
+++ b/include/mdds/multi_type_matrix_def.inl
@@ -366,31 +366,31 @@ multi_type_matrix<_String>&
 multi_type_matrix<_String>::transpose()
 {
     multi_type_matrix tmp(m_size.column, m_size.row);
-    for (size_type row = 0; row < m_size.row; ++row)
+    for (size_type old_row_new_col = 0; old_row_new_col < m_size.row; ++old_row_new_col)
     {
-        for (size_type col = 0; col < m_size.column; ++col)
+        for (size_type old_col_new_row = 0; old_col_new_row < m_size.column; ++old_col_new_row)
         {
-            switch (get_type(row,col))
+            switch (get_type(old_row_new_col,old_col_new_row))
             {
                 case mtm::element_numeric:
                 {
                     double val;
-                    m_store.get(get_pos(row,col), val);
-                    tmp.set(col, row, val);
+                    m_store.get(get_pos(old_row_new_col,old_col_new_row), val);
+                    tmp.set(old_col_new_row, old_row_new_col, val);
                 }
                 break;
                 case mtm::element_boolean:
                 {
                     bool val;
-                    m_store.get(get_pos(row,col), val);
-                    tmp.set(col, row, val);
+                    m_store.get(get_pos(old_row_new_col,old_col_new_row), val);
+                    tmp.set(old_col_new_row, old_row_new_col, val);
                 }
                 break;
                 case mtm::element_string:
                 {
                     string_type val;
-                    m_store.get(get_pos(row,col), val);
-                    tmp.set(col, row, val);
+                    m_store.get(get_pos(old_row_new_col,old_col_new_row), val);
+                    tmp.set(old_col_new_row, old_row_new_col, val);
                 }
                 break;
                 case mtm::element_empty:
diff --git a/include/mdds/multi_type_vector_def.inl b/include/mdds/multi_type_vector_def.inl
index ba2cfeb..f1f4104 100644
--- a/include/mdds/multi_type_vector_def.inl
+++ b/include/mdds/multi_type_vector_def.inl
@@ -2009,6 +2009,7 @@ void multi_type_vector<_CellBlockFunc>::swap_single_blocks(
         {
             // Append the new elements to the previous block.
             element_block_func::append_values_from_block(*blk_prev->mp_data, *dst_data);
+            element_block_func::resize_block(*dst_data, 0); // prevent double-delete.
             blk_prev->m_size += len;
         }
         else
@@ -2038,6 +2039,7 @@ void multi_type_vector<_CellBlockFunc>::swap_single_blocks(
         {
             // Merge with the next block.
             element_block_func::prepend_values_from_block(*blk_next->mp_data, *dst_data, 0, len);
+            element_block_func::resize_block(*dst_data, 0); // prevent double-delete.
             blk_next->m_size += len;
         }
         else
@@ -2913,7 +2915,7 @@ multi_type_vector<_CellBlockFunc>::exchange_elements(
     if (dst_end_pos == blk->m_size)
     {
         // The new elements will replace the lower part of the block.
-
+        assert(blk->mp_data && "NULL block mp_data");
         element_block_func::resize_block(*blk->mp_data, dst_offset);
         blk->m_size = dst_offset;
 
diff --git a/include/mdds/point_quad_tree.hpp b/include/mdds/point_quad_tree.hpp
index 4ac8f61..ce445b9 100644
--- a/include/mdds/point_quad_tree.hpp
+++ b/include/mdds/point_quad_tree.hpp
@@ -804,7 +804,6 @@ void point_quad_tree<_Key,_Data>::remove(key_type x, key_type y)
             adjust_quad(xrange, yrange, delete_node->southeast, dir_north, insert_list);
             set_new_root(xrange, yrange, delete_node->southwest, quad_northeast, insert_list);
             break;
-        case quad_unspecified:
         default:
             throw general_error("quadrant for the replacement node is unspecified.");
     }
@@ -837,7 +836,6 @@ void point_quad_tree<_Key,_Data>::remove(key_type x, key_type y)
             reinsert_tree(delete_node, quad_southwest, root);
         }
         break;
-        case quad_unspecified:
         default:
             throw general_error("quadrant for the replacement node is unspecified.");
     }
@@ -869,7 +867,6 @@ void point_quad_tree<_Key,_Data>::remove(key_type x, key_type y)
             delete_node->southwest = repl_node->southwest;
             repl_node->southwest.reset();
             break;
-        case quad_unspecified:
         default:
             throw general_error("quadrant for the replacement node is unspecified.");
     }
@@ -1533,7 +1530,6 @@ void point_quad_tree<_Key,_Data>::reinsert_tree(node_ptr& dest, node_quadrant_t
                 root->parent = dest;
             }
             break;
-        case quad_unspecified:
         default:
             throw general_error("reinsert_tree: quadrant unspecified");
     }
diff --git a/include/mdds/quad_node.hpp b/include/mdds/quad_node.hpp
index 30cd9f4..4ece659 100644
--- a/include/mdds/quad_node.hpp
+++ b/include/mdds/quad_node.hpp
@@ -232,20 +232,25 @@ struct quad_node_base
 
     node_ptr get_quadrant_node(node_quadrant_t quad) const
     {
+        node_ptr ret;
         switch (quad)
         {
             case quad_northeast:
-                return northeast;
+                ret = northeast;
+                break;
             case quad_northwest:
-                return northwest;
+                ret = northwest;
+                break;
             case quad_southeast:
-                return southeast;
+                ret = southeast;
+                break;
             case quad_southwest:
-                return southwest;
+                ret = southwest;
+                break;
             default:
                 throw general_error("unknown quadrant type");
         }
-        return node_ptr();
+        return ret;
     }
 };
 
diff --git a/include/mdds/segment_tree.hpp b/include/mdds/segment_tree.hpp
index 303630c..b5c5868 100644
--- a/include/mdds/segment_tree.hpp
+++ b/include/mdds/segment_tree.hpp
@@ -771,15 +771,17 @@ private:
 };
 
 template<typename _Key, typename _Data>
-segment_tree<_Key, _Data>::segment_tree() :
-    m_valid_tree(false)
+segment_tree<_Key, _Data>::segment_tree()
+    : m_root_node(NULL)
+    , m_valid_tree(false)
 {
 }
 
 template<typename _Key, typename _Data>
-segment_tree<_Key, _Data>::segment_tree(const segment_tree& r) :
-    m_segment_data(r.m_segment_data),
-    m_valid_tree(r.m_valid_tree)
+segment_tree<_Key, _Data>::segment_tree(const segment_tree& r)
+    : m_segment_data(r.m_segment_data)
+    , m_root_node(NULL)
+    , m_valid_tree(r.m_valid_tree)
 {
     if (m_valid_tree)
         build_tree();
diff --git a/misc/sorted_string_map_perf.cpp b/misc/sorted_string_map_perf.cpp
new file mode 100644
index 0000000..1fd3234
--- /dev/null
+++ b/misc/sorted_string_map_perf.cpp
@@ -0,0 +1,166 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * Copyright (c) 2014 Kohei Yoshida
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ ************************************************************************/
+
+#include "../include/mdds/sorted_string_map.hpp"
+
+#include <cstdlib>
+#include <iostream>
+#include <cstring>
+
+#include <boost/unordered_map.hpp>
+
+using namespace std;
+
+#include <stdio.h>
+#include <string>
+#include <sys/time.h>
+
+namespace {
+
+class stack_printer
+{
+public:
+    explicit stack_printer(const char* msg) :
+        m_msg(msg)
+    {
+        fprintf(stdout, "%s: --begin\n", m_msg.c_str());
+        m_start_time = getTime();
+    }
+
+    ~stack_printer()
+    {
+        double end_time = getTime();
+        fprintf(stdout, "%s: --end (duration: %g sec)\n", m_msg.c_str(), (end_time - m_start_time));
+    }
+
+    void printTime(int line) const
+    {
+        double fEndTime = getTime();
+        fprintf(stdout, "%s: --(%d) (duration: %g sec)\n", m_msg.c_str(), line, (fEndTime - m_start_time));
+    }
+
+private:
+    double getTime() const
+    {
+        timeval tv;
+        gettimeofday(&tv, NULL);
+        return tv.tv_sec + tv.tv_usec / 1000000.0;
+    }
+
+    ::std::string m_msg;
+    double m_start_time;
+};
+
+}
+
+enum name_type {
+    name_none = 0,
+    name_andy,
+    name_bruce,
+    name_charlie,
+    name_david
+};
+
+typedef mdds::sorted_string_map<name_type> map_type;
+
+map_type::entry entries[] =
+{
+    { "andy", name_andy },
+    { "andy1", name_andy },
+    { "andy13", name_andy },
+    { "bruce", name_bruce },
+    { "charlie", name_charlie },
+    { "david", name_david },
+};
+
+typedef boost::unordered_map<std::string, name_type> hashmap_type;
+
+void init_hash_map(hashmap_type& hm)
+{
+    size_t n = sizeof(entries) / sizeof(entries[0]);
+    const map_type::entry* p = entries;
+    const map_type::entry* pend = p + n;
+    for (; p != pend; ++p)
+        hm.insert(hashmap_type::value_type(p->key, p->value));
+}
+
+void run(map_type& sm, const char* input)
+{
+    name_type type = sm.find(input, strlen(input));
+}
+
+void run_hash(hashmap_type& hm, const char* input)
+{
+    name_type type = name_none;
+    hashmap_type::const_iterator it = hm.find(input);
+    if (it != hm.end())
+        type = it->second;
+}
+
+const char* tests[] = {
+    "andy",
+    "david",
+    "charlie",
+    "andy1",
+    "bruce",
+    "blah",
+    "andy13"
+};
+
+int main()
+{
+    static const size_t repeat_count = 10000000;
+
+    map_type sorted_map(entries, sizeof(entries)/sizeof(entries[0]), name_none);
+    size_t n = sorted_map.size();
+    cout << "entry count = " << n << endl;
+
+    {
+        stack_printer __stack_printer__("sorted entry");
+        for (size_t rep = 0; rep < repeat_count; ++rep)
+        {
+            for (size_t i = 0; i < n; ++i)
+                run(sorted_map, tests[i]);
+        }
+    }
+
+    hashmap_type hm;
+    init_hash_map(hm);
+    {
+        stack_printer __stack_printer__("hash map");
+        for (size_t rep = 0; rep < repeat_count; ++rep)
+        {
+            for (size_t i = 0; i < n; ++i)
+                run_hash(hm, tests[i]);
+        }
+    }
+
+    return EXIT_SUCCESS;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/src/flat_segment_tree_test.cpp b/src/flat_segment_tree_test.cpp
index 0373187..cb1601c 100644
--- a/src/flat_segment_tree_test.cpp
+++ b/src/flat_segment_tree_test.cpp
@@ -1930,65 +1930,73 @@ void fst_test_assignment()
 
 int main (int argc, char **argv)
 {
-    cmd_options opt;
-    if (!parse_cmd_options(argc, argv, opt))
-        return EXIT_FAILURE;
-
-    if (opt.test_func)
+    try
     {
-        fst_test_equality();
-        fst_test_copy_ctor();
-        fst_test_back_insert();
-        {
-            typedef unsigned int   key_type;
-            typedef unsigned short value_type;
-            for (value_type i = 0; i <= 100; ++i)
-                fst_test_insert_front_back<key_type, value_type>(0, 100, i);
-        }
+        cmd_options opt;
+        if (!parse_cmd_options(argc, argv, opt))
+            return EXIT_FAILURE;
 
+        if (opt.test_func)
         {
-            typedef int   key_type;
-            typedef short value_type;
-            for (value_type i = 0; i <= 100; ++i)
-                fst_test_insert_front_back<key_type, value_type>(0, 100, i);
+            fst_test_equality();
+            fst_test_copy_ctor();
+            fst_test_back_insert();
+            {
+                typedef unsigned int   key_type;
+                typedef unsigned short value_type;
+                for (value_type i = 0; i <= 100; ++i)
+                    fst_test_insert_front_back<key_type, value_type>(0, 100, i);
+            }
+
+            {
+                typedef int   key_type;
+                typedef short value_type;
+                for (value_type i = 0; i <= 100; ++i)
+                    fst_test_insert_front_back<key_type, value_type>(0, 100, i);
+            }
+
+            {
+                typedef long         key_type;
+                typedef unsigned int value_type;
+                for (value_type i = 0; i <= 100; ++i)
+                    fst_test_insert_front_back<key_type, value_type>(0, 100, i);
+            }
+
+            fst_test_leaf_search();
+            fst_test_tree_build();
+            fst_test_tree_search();
+            fst_test_insert_search_mix();
+            fst_test_shift_left();
+            fst_test_shift_left_right_edge();
+            fst_test_shift_left_append_new_segment();
+            fst_test_shift_right_init0();
+            fst_test_shift_right_init999();
+            fst_test_shift_right_bool();
+            fst_test_shift_right_skip_start_node();
+            fst_test_shift_right_all_nodes();
+            fst_test_const_iterator();
+            fst_test_insert_iterator();
+            fst_test_insert_state_changed();
+            fst_test_position_search();
+            fst_test_min_max_default();
+            fst_test_swap();
+            fst_test_clear();
+            fst_test_assignment();
         }
 
+        if (opt.test_perf)
         {
-            typedef long         key_type;
-            typedef unsigned int value_type;
-            for (value_type i = 0; i <= 100; ++i)
-                fst_test_insert_front_back<key_type, value_type>(0, 100, i);
+            fst_perf_test_search_leaf();
+            fst_perf_test_search_tree();
+            fst_perf_test_insert_front_back();
+            fst_perf_test_insert_position();
+            fst_perf_test_position_search();
         }
-
-        fst_test_leaf_search();
-        fst_test_tree_build();
-        fst_test_tree_search();
-        fst_test_insert_search_mix();
-        fst_test_shift_left();
-        fst_test_shift_left_right_edge();
-        fst_test_shift_left_append_new_segment();
-        fst_test_shift_right_init0();
-        fst_test_shift_right_init999();
-        fst_test_shift_right_bool();
-        fst_test_shift_right_skip_start_node();
-        fst_test_shift_right_all_nodes();
-        fst_test_const_iterator();
-        fst_test_insert_iterator();
-        fst_test_insert_state_changed();
-        fst_test_position_search();
-        fst_test_min_max_default();
-        fst_test_swap();
-        fst_test_clear();
-        fst_test_assignment();
-    }
-
-    if (opt.test_perf)
-    {
-        fst_perf_test_search_leaf();
-        fst_perf_test_search_tree();
-        fst_perf_test_insert_front_back();
-        fst_perf_test_insert_position();
-        fst_perf_test_position_search();
+    }
+    catch (const std::exception& e)
+    {
+        fprintf(stdout, "Test failed: %s\n", e.what());
+        return EXIT_FAILURE;
     }
 
     fprintf(stdout, "Test finished successfully!\n");
diff --git a/src/mixed_type_matrix_test.cpp b/src/mixed_type_matrix_test.cpp
index edcf40a..e478231 100644
--- a/src/mixed_type_matrix_test.cpp
+++ b/src/mixed_type_matrix_test.cpp
@@ -947,48 +947,56 @@ void mtm_perf_test_iterate_elements()
 
 int main(int argc, char** argv)
 {
-    cmd_options opt;
-    if (!parse_cmd_options(argc, argv, opt))
-        return EXIT_FAILURE;
-
-    if (opt.test_func)
+    try
     {
-        run_tests_on_all_density_types(mtm_test_resize);
-        run_tests_on_all_density_types(mtm_test_value_store);
-        run_tests_on_all_density_types(mtm_test_transpose);
-        run_tests_on_all_density_types(mtm_test_assignment);
-
-        mtm_test_initial_elements();
-        mtm_test_numeric_matrix();
-        mtm_test_assign(matrix_density_filled_zero, matrix_density_filled_zero);
-        mtm_test_assign(matrix_density_filled_empty, matrix_density_filled_zero);
-        mtm_test_assign(matrix_density_filled_zero, matrix_density_filled_empty);
-        mtm_test_assign(matrix_density_filled_empty, matrix_density_filled_empty);
-
-        run_tests_on_all_density_types(mtm_test_flag_storage);
-
-        mtm_test_iterator_access_filled<mx_type::filled_storage_type>(1, 1);
-        mtm_test_iterator_access_filled<mx_type::filled_storage_type>(3, 1);
-        mtm_test_iterator_access_filled<mx_type::filled_storage_type>(1, 3);
-        mtm_test_iterator_access_filled<mx_type::filled_storage_type>(3, 3);
-        mtm_test_iterator_access_filled<mx_type::filled_storage_type>(0, 0);
-
-        mtm_test_iterator_access_filled<mx_type::filled_storage_zero_type>(1, 1);
-        mtm_test_iterator_access_filled<mx_type::filled_storage_zero_type>(3, 1);
-        mtm_test_iterator_access_filled<mx_type::filled_storage_zero_type>(1, 3);
-        mtm_test_iterator_access_filled<mx_type::filled_storage_zero_type>(3, 3);
-        mtm_test_iterator_access_filled<mx_type::filled_storage_zero_type>(0, 0);
+        cmd_options opt;
+        if (!parse_cmd_options(argc, argv, opt))
+            return EXIT_FAILURE;
 
-        mtm_test_iterator_access_sparse();
+        if (opt.test_func)
+        {
+            run_tests_on_all_density_types(mtm_test_resize);
+            run_tests_on_all_density_types(mtm_test_value_store);
+            run_tests_on_all_density_types(mtm_test_transpose);
+            run_tests_on_all_density_types(mtm_test_assignment);
+    
+            mtm_test_initial_elements();
+            mtm_test_numeric_matrix();
+            mtm_test_assign(matrix_density_filled_zero, matrix_density_filled_zero);
+            mtm_test_assign(matrix_density_filled_empty, matrix_density_filled_zero);
+            mtm_test_assign(matrix_density_filled_zero, matrix_density_filled_empty);
+            mtm_test_assign(matrix_density_filled_empty, matrix_density_filled_empty);
+
+            run_tests_on_all_density_types(mtm_test_flag_storage);
+
+            mtm_test_iterator_access_filled<mx_type::filled_storage_type>(1, 1);
+            mtm_test_iterator_access_filled<mx_type::filled_storage_type>(3, 1);
+            mtm_test_iterator_access_filled<mx_type::filled_storage_type>(1, 3);
+            mtm_test_iterator_access_filled<mx_type::filled_storage_type>(3, 3);
+            mtm_test_iterator_access_filled<mx_type::filled_storage_type>(0, 0);
+
+            mtm_test_iterator_access_filled<mx_type::filled_storage_zero_type>(1, 1);
+            mtm_test_iterator_access_filled<mx_type::filled_storage_zero_type>(3, 1);
+            mtm_test_iterator_access_filled<mx_type::filled_storage_zero_type>(1, 3);
+            mtm_test_iterator_access_filled<mx_type::filled_storage_zero_type>(3, 3);
+            mtm_test_iterator_access_filled<mx_type::filled_storage_zero_type>(0, 0);
+
+            mtm_test_iterator_access_sparse();
+
+            mtm_test_const_iterator();
+        }
 
-        mtm_test_const_iterator();
+        if (opt.test_perf)
+        {
+            mtm_perf_test_storage_creation();
+            mtm_perf_test_storage_set_numeric();
+            mtm_perf_test_iterate_elements();
+        }
     }
-
-    if (opt.test_perf)
+    catch (const std::exception& e)
     {
-        mtm_perf_test_storage_creation();
-        mtm_perf_test_storage_set_numeric();
-        mtm_perf_test_iterate_elements();
+        cout << "Test failed: " << e.what() << endl;
+        return EXIT_FAILURE;
     }
 
     cout << "Test finished successfully!" << endl;
diff --git a/src/multi_type_matrix_test.cpp b/src/multi_type_matrix_test.cpp
index 2037ef5..ebba21e 100644
--- a/src/multi_type_matrix_test.cpp
+++ b/src/multi_type_matrix_test.cpp
@@ -969,34 +969,42 @@ void mtm_perf_test_insert_via_position_object()
 
 int main (int argc, char **argv)
 {
-    cmd_options opt;
-    if (!parse_cmd_options(argc, argv, opt))
-        return EXIT_FAILURE;
-
-    if (opt.test_func)
+    try
     {
-        mtm_test_construction();
-        mtm_test_data_insertion();
-        mtm_test_data_insertion_multiple();
-        mtm_test_set_empty();
-        mtm_test_swap();
-        mtm_test_transpose();
-        mtm_test_resize();
-        mtm_test_copy();
-        mtm_test_assignment();
-        mtm_test_numeric();
-        mtm_test_walk();
-        mtm_test_custom_string();
-        mtm_test_position();
-        mtm_test_set_data_via_position();
-    }
+        cmd_options opt;
+        if (!parse_cmd_options(argc, argv, opt))
+            return EXIT_FAILURE;
+
+        if (opt.test_func)
+        {
+            mtm_test_construction();
+            mtm_test_data_insertion();
+            mtm_test_data_insertion_multiple();
+            mtm_test_set_empty();
+            mtm_test_swap();
+            mtm_test_transpose();
+            mtm_test_resize();
+            mtm_test_copy();
+            mtm_test_assignment();
+            mtm_test_numeric();
+            mtm_test_walk();
+            mtm_test_custom_string();
+            mtm_test_position();
+            mtm_test_set_data_via_position();
+        }
 
-    if (opt.test_perf)
+        if (opt.test_perf)
+        {
+            mtm_perf_test_storage_creation();
+            mtm_perf_test_storage_set_numeric();
+            mtm_perf_test_iterate_elements();
+            mtm_perf_test_insert_via_position_object();
+        }
+    }
+    catch (const std::exception& e)
     {
-        mtm_perf_test_storage_creation();
-        mtm_perf_test_storage_set_numeric();
-        mtm_perf_test_iterate_elements();
-        mtm_perf_test_insert_via_position_object();
+        fprintf(stdout, "Test failed: %s\n", e.what());
+        return EXIT_FAILURE;
     }
 
     cout << "Test finished successfully!" << endl;
diff --git a/src/multi_type_vector_test_custom.cpp b/src/multi_type_vector_test_custom.cpp
index 96b61ee..2ceaad5 100644
--- a/src/multi_type_vector_test_custom.cpp
+++ b/src/multi_type_vector_test_custom.cpp
@@ -76,6 +76,7 @@ struct muser_cell
     muser_cell() : value(0.0) {}
     muser_cell(const muser_cell& r) : value(r.value) {}
     muser_cell(double _v) : value(_v) {}
+    ~muser_cell() {}
 };
 
 struct date
@@ -1449,6 +1450,69 @@ void mtv_test_swap()
     db2.set(5, new muser_cell(3.3));
 
     db2.swap(3, 4, db1, 3);
+
+    // Another scenario that used to crash on double delete.
+
+    db1.clear();
+    db1.resize(10);
+    db2.clear();
+    db2.resize(10);
+
+    db1.set(2, new muser_cell(4.1));
+    db1.set(3, 4.2);
+    db1.set(4, new muser_cell(4.3));
+
+    db2.set(3, new muser_cell(6.1));
+    db2.set(4, 6.2);
+    db2.set(5, 6.3);
+
+    assert(db1.get<muser_cell*>(2)->value == 4.1);
+    assert(db1.get<double>(3) == 4.2);
+    assert(db1.get<muser_cell*>(4)->value == 4.3);
+
+    assert(db2.get<muser_cell*>(3)->value == 6.1);
+    assert(db2.get<double>(4) == 6.2);
+    assert(db2.get<double>(5) == 6.3);
+
+    db2.swap(4, 4, db1, 4);
+
+    assert(db1.get<muser_cell*>(2)->value == 4.1);
+    assert(db1.get<double>(3) == 4.2);
+    assert(db1.get<double>(4) == 6.2);
+
+    assert(db2.get<muser_cell*>(3)->value == 6.1);
+    assert(db2.get<muser_cell*>(4)->value == 4.3);
+    assert(db2.get<double>(5) == 6.3);
+
+    // One more on double deletion...
+
+    db1.clear();
+    db1.resize(10);
+    db2.clear();
+    db2.resize(10);
+
+    db1.set(0, 2.1);
+    db1.set(1, 2.2);
+    db1.set(2, 2.3);
+    db1.set(3, new muser_cell(4.5));
+
+    db2.set(2, new muser_cell(3.1));
+    db2.set(3, new muser_cell(3.2));
+    db2.set(4, new muser_cell(3.3));
+
+    db1.swap(2, 2, db2, 3);
+
+    assert(db1.get<double>(0) == 2.1);
+    assert(db1.get<double>(1) == 2.2);
+    assert(db1.get<muser_cell*>(2)->value == 3.2);
+    assert(db1.get<muser_cell*>(3)->value == 4.5);
+
+    assert(db2.get<muser_cell*>(2)->value == 3.1);
+    assert(db2.get<double>(3) == 2.3);
+    assert(db2.get<muser_cell*>(4)->value == 3.3);
+
+    assert(db1.check_block_integrity());
+    assert(db2.check_block_integrity());
 }
 
 void mtv_test_custom_block_func3()
@@ -1569,17 +1633,25 @@ void mtv_test_construction_with_array()
 
 int main (int argc, char **argv)
 {
-    mtv_test_types();
-    mtv_test_block_identifier();
-    mtv_test_basic();
-    mtv_test_equality();
-    mtv_test_managed_block();
-    mtv_test_custom_block_func1();
-    mtv_test_transfer();
-    mtv_test_swap();
-    mtv_test_custom_block_func3();
-    mtv_test_release();
-    mtv_test_construction_with_array();
+    try
+    {
+        mtv_test_types();
+        mtv_test_block_identifier();
+        mtv_test_basic();
+        mtv_test_equality();
+        mtv_test_managed_block();
+        mtv_test_custom_block_func1();
+        mtv_test_transfer();
+        mtv_test_swap();
+        mtv_test_custom_block_func3();
+        mtv_test_release();
+        mtv_test_construction_with_array();
+    }
+    catch (const std::exception& e)
+    {
+        cout << "Test failed: " << e.what() << endl;
+        return EXIT_FAILURE;
+    }
 
     cout << "Test finished successfully!" << endl;
     return EXIT_SUCCESS;
diff --git a/src/multi_type_vector_test_default.cpp b/src/multi_type_vector_test_default.cpp
index 28ff59e..70ee958 100644
--- a/src/multi_type_vector_test_default.cpp
+++ b/src/multi_type_vector_test_default.cpp
@@ -2964,7 +2964,7 @@ void mtv_test_set_return_iterator()
     it = db.set(6, string("text"));
     assert(it->size == 1);
     assert(it->type == mtv::element_type_string);
-    assert(it->position = 6);
+    assert(it->position == 6);
     check = db.begin();
     std::advance(check, 2);
     assert(it == check);
@@ -5071,40 +5071,48 @@ void mtv_test_capacity()
 
 int main (int argc, char **argv)
 {
-    mtv_test_types();
-    mtv_test_construction();
-    mtv_test_basic();
-    mtv_test_empty_cells();
-    mtv_test_swap();
-    mtv_test_equality();
-    mtv_test_clone();
-    mtv_test_resize();
-    mtv_test_erase();
-    mtv_test_insert_empty();
-    mtv_test_set_cells();
-    mtv_test_insert_cells();
-    mtv_test_iterators();
-    mtv_test_data_iterators();
-    mtv_test_non_const_data_iterators();
-    mtv_test_iterator_private_data();
-    mtv_test_set_return_iterator();
-    mtv_test_set2_return_iterator();
-    mtv_test_insert_cells_return_iterator();
-    mtv_test_set_empty_return_iterator();
-    mtv_test_insert_empty_return_iterator();
-    mtv_test_set_with_position();
-    mtv_test_set_cells_with_position();
-    mtv_test_insert_cells_with_position();
-    mtv_test_set_empty_with_position();
-    mtv_test_insert_empty_with_position();
-    mtv_test_position();
-    mtv_test_next_position();
-    mtv_test_swap_range();
-    mtv_test_value_type();
-    mtv_test_block_identifier();
-    mtv_test_transfer();
-    mtv_test_push_back();
-    mtv_test_capacity();
+    try
+    {
+        mtv_test_types();
+        mtv_test_construction();
+        mtv_test_basic();
+        mtv_test_empty_cells();
+        mtv_test_swap();
+        mtv_test_equality();
+        mtv_test_clone();
+        mtv_test_resize();
+        mtv_test_erase();
+        mtv_test_insert_empty();
+        mtv_test_set_cells();
+        mtv_test_insert_cells();
+        mtv_test_iterators();
+        mtv_test_data_iterators();
+        mtv_test_non_const_data_iterators();
+        mtv_test_iterator_private_data();
+        mtv_test_set_return_iterator();
+        mtv_test_set2_return_iterator();
+        mtv_test_insert_cells_return_iterator();
+        mtv_test_set_empty_return_iterator();
+        mtv_test_insert_empty_return_iterator();
+        mtv_test_set_with_position();
+        mtv_test_set_cells_with_position();
+        mtv_test_insert_cells_with_position();
+        mtv_test_set_empty_with_position();
+        mtv_test_insert_empty_with_position();
+        mtv_test_position();
+        mtv_test_next_position();
+        mtv_test_swap_range();
+        mtv_test_value_type();
+        mtv_test_block_identifier();
+        mtv_test_transfer();
+        mtv_test_push_back();
+        mtv_test_capacity();
+    }
+    catch (const std::exception& e)
+    {
+        cout << "Test failed: " << e.what() << endl;
+        return EXIT_FAILURE;
+    }
 
     cout << "Test finished successfully!" << endl;
     return EXIT_SUCCESS;
diff --git a/src/point_quad_tree_test.cpp b/src/point_quad_tree_test.cpp
index 9d8bb0c..dae82d2 100644
--- a/src/point_quad_tree_test.cpp
+++ b/src/point_quad_tree_test.cpp
@@ -188,7 +188,8 @@ void pqt_test_insertion_removal()
             db.remove(x, y);
             size_t n = db.size();
             cout << "removing node at (" << x << "," << y << ")  " << "size after removal: " << n << endl;
-            assert(--node_count == n);
+            --node_count;
+            assert(node_count == n);
         }
     }
 }
@@ -454,15 +455,24 @@ void pqt_test_node_access()
 
 int main()
 {
-    pqt_test_basic();
-    pqt_test_insertion_removal();
-    pqt_test_remove_root();
-    pqt_test_equality();
-    pqt_test_assignment();
-    pqt_test_swap();
-    pqt_test_find();
-    pqt_test_node_access();
-    assert(get_node_instance_count() == 0);
+    try
+    {
+        pqt_test_basic();
+        pqt_test_insertion_removal();
+        pqt_test_remove_root();
+        pqt_test_equality();
+        pqt_test_assignment();
+        pqt_test_swap();
+        pqt_test_find();
+        pqt_test_node_access();
+        assert(get_node_instance_count() == 0);
+    }
+    catch (const std::exception& e)
+    {
+        cout << "Test failed: " << e.what() << endl;
+        return EXIT_FAILURE;
+    }
+
     cout << "Test finished successfully!" << endl;
     return EXIT_SUCCESS;
 }
diff --git a/src/rectangle_set_test.cpp b/src/rectangle_set_test.cpp
index 85aa88c..aa56c82 100644
--- a/src/rectangle_set_test.cpp
+++ b/src/rectangle_set_test.cpp
@@ -943,24 +943,32 @@ void rect_test_invalid_range()
 
 int main(int argc, char** argv)
 {
-    cmd_options opt;
-    if (!parse_cmd_options(argc, argv, opt))
-        return EXIT_FAILURE;
-    if (opt.test_func)
+    try
     {
-        rect_test_insertion_removal();
-        rect_test_search();
-        rect_test_copy_constructor();
-        rect_test_assignment();
-        rect_test_equality();
-        rect_test_search_result_iterator();
-        rect_test_invalid_range();
-    }
+        cmd_options opt;
+        if (!parse_cmd_options(argc, argv, opt))
+            return EXIT_FAILURE;
+        if (opt.test_func)
+        {
+            rect_test_insertion_removal();
+            rect_test_search();
+            rect_test_copy_constructor();
+            rect_test_assignment();
+            rect_test_equality();
+            rect_test_search_result_iterator();
+            rect_test_invalid_range();
+        }
 
-    if (opt.test_perf)
+        if (opt.test_perf)
+        {
+            rect_test_perf_insertion_fixed_x();
+            rect_test_perf_insertion_fixed_y();
+        }
+    }
+    catch (const std::exception& e)
     {
-        rect_test_perf_insertion_fixed_x();
-        rect_test_perf_insertion_fixed_y();
+        fprintf(stdout, "Test failed: %s\n", e.what());
+        return EXIT_FAILURE;
     }
 
     fprintf(stdout, "Test finished successfully!\n");
diff --git a/src/segment_tree_test.cpp b/src/segment_tree_test.cpp
index 455b568..f1d7df1 100644
--- a/src/segment_tree_test.cpp
+++ b/src/segment_tree_test.cpp
@@ -1084,36 +1084,43 @@ void st_test_empty_result_set()
 
 int main(int argc, char** argv)
 {
-    cmd_options opt;
-    if (!parse_cmd_options(argc, argv, opt))
-        return EXIT_FAILURE;
-
-    if (opt.test_func)
+    try
     {
-        st_test_insert_search_removal();
-        st_test_copy_constructor();
-        st_test_equality();
-        st_test_clear();
-        st_test_duplicate_insertion();
-        st_test_search_on_uneven_tree();
-        st_test_aggregated_search_results();
-        st_test_dense_tree_search();
-        st_test_search_on_empty_set();
-        st_test_search_iterator_basic();
-        st_test_search_iterator_result_check();
-        st_test_empty_result_set();
-    }
+        cmd_options opt;
+        if (!parse_cmd_options(argc, argv, opt))
+            return EXIT_FAILURE;
 
-    if (opt.test_perf)
-    {
-        st_test_perf_insertion();
-    }
+        if (opt.test_func)
+        {
+            st_test_insert_search_removal();
+            st_test_copy_constructor();
+            st_test_equality();
+            st_test_clear();
+            st_test_duplicate_insertion();
+            st_test_search_on_uneven_tree();
+            st_test_aggregated_search_results();
+            st_test_dense_tree_search();
+            st_test_search_on_empty_set();
+            st_test_search_iterator_basic();
+            st_test_search_iterator_result_check();
+            st_test_empty_result_set();
+        }
 
-    // At this point, all of the nodes created during the test run should have
-    // been destroyed.  If not, we are leaking memory.
-    typedef segment_tree<uint32_t, void> db_type;
-    assert(db_type::node::get_instance_count() == 0);
+        if (opt.test_perf)
+        {
+            st_test_perf_insertion();
+        }
 
+        // At this point, all of the nodes created during the test run should have
+        // been destroyed.  If not, we are leaking memory.
+        typedef segment_tree<uint32_t, void> db_type;
+        assert(db_type::node::get_instance_count() == 0);
+    }
+    catch (const std::exception& e)
+    {
+        fprintf(stdout, "Test failed: %s\n", e.what());
+        return EXIT_FAILURE;
+    }
     fprintf(stdout, "Test finished successfully!\n");
     return EXIT_SUCCESS;
 }

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-openoffice/mdds.git


Reply to: