[tao-bugs] Memory leak in Any_Impl::marshal
Dan Kempenich
plainhamburger at hotmail.com
Tue Jun 26 14:37:44 CDT 2018
I'm looking at what looks to me to be a memory leak when using the any type and looking for some help resolving.
TAO VERSION: 2.2a_p14
HOST MACHINE and OPERATING SYSTEM: Should be an issue on all platforms. I found on RHEL 7.5 using valgrind/gdb.
TARGET MACHINE and OPERATING SYSTEM, if different from HOST: Nope
COMPILER NAME AND VERSION (AND PATCHLEVEL): gcc version 4.4.7 20120313 (Red Hat 4.4.7-17)
CONTENTS OF $ACE_ROOT/ace/config.h [if you use a link to a platform-
specific file, simply state which one]:
CONTENTS OF $ACE_ROOT/include/makeinclude/platform_macros.GNU [if you
use a link to a platform-specific file, simply state which one
(unless this isn't used in this case, e.g., with Microsoft Visual
C++)]:
CONTENTS OF $ACE_ROOT/bin/MakeProjectCreator/config/default.features
(used by MPC when you generate your own makefiles):
LEVEL OF URGENCY (LOW, MEDIUM, or HIGH): MEDIUM
AREA/CLASS/EXAMPLE AFFECTED:
AnyTypeCode
DOES THE PROBLEM AFFECT:
COMPILATION? Nope
LINKING? Nope
On Unix systems, did you run make realclean first?
EXECUTION? Yes, memory leak found during execution
OTHER (please specify)?
SYNOPSIS:
Memory/reference leaked in Any_Impl::marshal. ValueBase pointer is set via to_value() function and never freed or decremented in the function or any function called by Any_Impl::marshal.
DESCRIPTION:
TAO::Any_Impl::marshal calls the to_value function with a ValueBase pointer. This function can allocate memory using a factory or increment a reference count. Neither the marshal or the to_value function appear to have any current means to clean-up the reference.
CORBA::Boolean
TAO::Any_Impl::marshal (TAO_OutputCDR &cdr)
{
CORBA::ValueBase * vb = 0;
if (this->to_value (vb) && vb)
{
// Since we ARE a value type, we need to
// send the ACTUAL derived typecode for
// the type we are marshaling NOT the
// typecode of the base pointer that may
// have been inserted into the any.
if ((cdr << TAO_ORB_Core_instance ()
->valuetype_adapter()
->derived_type (vb)) == 0)
{
return false;
}
}
// Otherwise send the typecode of the inserted type.
else if ((cdr << this->type_) == 0)
{
return false;
}
// Once the typecode has been marshaled send the actual
// value (this is polymorphic for valuetypes)
return this->marshal_value (cdr);
}
The to_value function as generated here: be/be_visitor_valuetype/any_op_cs.cpp:48 show the reference count is incremented
*os << be_nl_2
<< "namespace TAO" << be_nl
<< "{" << be_idt_nl
<< "template<>" << be_nl
<< "::CORBA::Boolean" << be_nl
<< "Any_Impl_T<" << node->name () << ">::to_value ("
<< be_idt << be_idt_nl
<< "::CORBA::ValueBase *&_tao_elem) const" << be_uidt
<< be_uidt_nl
<< "{" << be_idt_nl
<< "::CORBA::add_ref (this->value_);" << be_nl
<< "_tao_elem = this->value_;" << be_nl
<< "return true;" << be_uidt_nl
<< "}" << be_uidt_nl
<< "}" << be_nl_2;
and I believe via the TAO::Unknown_IDL_Type::to_value() we can also get a new object via a factory method. In my case I found the issue via the generated to_value function in my idl generated C.cpp file implementation which incremented the reference count.
REPEAT BY:
I can work on providing a small sample test case if needed.
SAMPLE FIX/WORKAROUND:
I would propose a fix of modifying the ::marshal function to use a ValueBase_var type to track the reference count:
--CORBA::ValueBase * vb = 0;
++CORBA::ValueBase_var vb;
--if (this->to_value (vb) && vb)
++if (this->to_value(vb.out())) && (0 != vb.ptr()))
{
// Since we ARE a value type, we need to
// send the ACTUAL derived typecode for
// the type we are marshaling NOT the
// typecode of the base pointer that may
// have been inserted into the any.
if ((cdr << TAO_ORB_Core_instance ()
->valuetype_adapter()
-- ->derived_type (vb)) == 0)
++ ->derived_type(vb.in())) == 0)
However, this introduces a new dependency on TAO_ValueType for TAO_AnyTypeCode and this would create a circular dependency between the two libraries.
I'm looking for some advice on how best to resolve;
Do I look to separate library creation steps on windows to create the import library/export file as a separate step from the link and keep the AnyTypeCode/ValueType structure (I'm not quite sure how to do that yet with MPC)?
Or do I look to combine the two into a single dll and eliminate the circular dependency?
Or is there some other solution that resolves the memory leak while avoiding circular dependency that I haven't been able to see or a work-around that others have used to avoid leaking memory here?
Thanks,
Dan Kempenich.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://list.isis.vanderbilt.edu/pipermail/tao-bugs/attachments/20180626/10d35ba7/attachment-0001.html>
More information about the tao-bugs
mailing list