Skip to content

Commit

Permalink
fix uninitialized memory bug in TParameter::copy
Browse files Browse the repository at this point in the history
  • Loading branch information
lambday committed Feb 25, 2014
1 parent eaa2d2d commit 1d45e03
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 1 deletion.
13 changes: 12 additions & 1 deletion src/shogun/base/Parameter.cpp
Expand Up @@ -4016,7 +4016,12 @@ bool TParameter::copy(TParameter* target)
{
size_t num_bytes=*m_datatype.m_length_y * m_datatype.sizeof_stype();
SG_SDEBUG("allocating %d bytes memory for target vector\n", num_bytes);

*(char**)target->m_parameter=SG_MALLOC(char, num_bytes);
/* check whether ptype is SGOBJECT, if yes we need to initialize
the memory with NULL for the way copy_ptype handles it */
if (m_datatype.m_ptype==PT_SGOBJECT)
memset(*(void**)target->m_parameter, 0, num_bytes);

/* use length of source */
*target->m_datatype.m_length_y=*m_datatype.m_length_y;
Expand Down Expand Up @@ -4074,12 +4079,18 @@ bool TParameter::copy(TParameter* target)
else
num_bytes=*m_datatype.m_length_y *
(*m_datatype.m_length_x) * m_datatype.sizeof_stype();

*(char**)target->m_parameter=SG_MALLOC(char, num_bytes);

/* check whether ptype is SGOBJECT, if yes we need to initialize
the memory with NULL for the way copy_ptype handles it */
if (m_datatype.m_ptype==PT_SGOBJECT)
memset(*(void**)target->m_parameter, 0, num_bytes);

/* use length of source */
*target->m_datatype.m_length_y=*m_datatype.m_length_y;
*target->m_datatype.m_length_x=*m_datatype.m_length_x;

SG_SDEBUG("%d bytes are allocated\n", num_bytes);
}

Expand Down
11 changes: 11 additions & 0 deletions tests/unit/CMakeLists.txt
Expand Up @@ -24,6 +24,17 @@ ADD_CUSTOM_COMMAND(OUTPUT clone_unittest.cc
COMMENT "Generating clone_unittest.cc")
LIST(APPEND TEMPLATE_GENERATED_UNITTEST clone_unittest.cc)

ADD_CUSTOM_COMMAND(OUTPUT DynamicObjectArray_unittest.cc
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/base/clone_unittest.cc.py
${CMAKE_CURRENT_SOURCE_DIR}/base/DynamicObjectArray_unittest.cc.jinja2
DynamicObjectArray_unittest.cc
${LIBSHOGUN_SRC_DIR}/base/class_list.cpp
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/base/clone_unittest.cc.py
${CMAKE_CURRENT_SOURCE_DIR}/base/DynamicObjectArray_unittest.cc.jinja2
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Generating DynamicObjectArray_unittest.cc")
LIST(APPEND TEMPLATE_GENERATED_UNITTEST DynamicObjectArray_unittest.cc)

ADD_CUSTOM_COMMAND(OUTPUT SerializationAscii_unittest.cc
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/base/clone_unittest.cc.py
${CMAKE_CURRENT_SOURCE_DIR}/io/SerializationAscii_unittest.cc.jinja2
Expand Down
65 changes: 65 additions & 0 deletions tests/unit/base/DynamicObjectArray_unittest.cc.jinja2
@@ -0,0 +1,65 @@
/*
* THIS IS A GENERATED FILE! DO NOT CHANGE THIS FILE! CHANGE THE
* CORRESPONDING TEMPLATE FILE, PLEASE!
*/

#include <shogun/lib/DynamicObjectArray.h>
#include <shogun/base/class_list.h>
#include <gtest/gtest.h>

using namespace shogun;

{% set ignores = ['Set', 'ParseBuffer', 'TreeMachine'] %}

{% for class in classes %}
{% if class in ignores or class.startswith('GUI') %}
TEST(DynamicObjectArray,DISABLED_array_{{class}}_clone_equals)
{% else %}
TEST(DynamicObjectArray,array_{{class}}_clone_equals)
{% endif %}
{
const char* class_name="{{class}}";

/* create source array and fill with {{class}} type objects */
index_t length=2;
CDynamicObjectArray* array1=new CDynamicObjectArray();
for (index_t i=0; i<length; ++i)
array1->push_back(new_sgserializable(class_name, PT_NOT_GENERIC));

/* test for clone and equals */
CDynamicObjectArray* array2=dynamic_cast<CDynamicObjectArray*>(array1->clone());
EXPECT_TRUE(array1->equals(array2));

/* cleanup */
SG_UNREF(array1);
SG_UNREF(array2);
}
{% endfor %}

{% for class in template_classes %}
{% for type in types %}
{% if class in ignores %}
TEST(DynamicObjectArray,DISABLED_array_{{class}}_{{type}}_clone_equals)
{% else %}
TEST(DynamicObjectArray,array_{{class}}_{{type}}_clone_equals)
{% endif %}
{
const char* class_name="{{class}}";

/* create source array and fill with {{class}} type objects */
index_t length=2;
CDynamicObjectArray* array1=new CDynamicObjectArray();
for (index_t i=0; i<length; ++i)
array1->push_back(new_sgserializable(class_name, {{type}}));

/* test for clone and equals */
CDynamicObjectArray* array2=dynamic_cast<CDynamicObjectArray*>(array1->clone());
EXPECT_TRUE(array1->equals(array2));

/* cleanup */
SG_UNREF(array1);
SG_UNREF(array2);
}
{% endfor %}
{% endfor %}

0 comments on commit 1d45e03

Please sign in to comment.