Opened 11 years ago

Closed 11 years ago

Last modified 7 years ago

#5582 closed Bugs (fixed)

There is a memory leak in the BOOST_AUTO_TEST_CASE_TEMPLATE

Reported by: Anton Matosov <anton.matosov@…> Owned by: Gennadiy Rozental
Milestone: Boost 1.59.0 Component: test
Version: Boost 1.46.1 Severity: Problem
Keywords: test unit_test memory leak Cc:

Description

There is memory leak in the boost::unit_test::ut_detail::generate_test_case_4_type::operator() which is used by boost::unit_test::ut_detail::template_test_case_gen which in its turn is used by BOOST_AUTO_TEST_CASE_TEMPLATE

The problematic code is provided below. The test_case created here never gets deleted.

template<typename TestType>
void        operator()( mpl::identity<TestType> )
{
  ...
  m_holder.m_test_cases.push_back( 
     new test_case( full_name, test_case_template_invoker<TestCaseTemplate,TestType>() ) );
}

Below is the code that can be used to reproduce the issue:

#define BOOST_TEST_MAIN
#include <boost/test/auto_unit_test.hpp>
#include <boost/test/test_tools.hpp>
#include <boost/test/test_case_template.hpp>
#include <boost/mpl/list.hpp>

BOOST_AUTO_TEST_SUITE( TestMemLeak )

BOOST_AUTO_TEST_CASE_TEMPLATE( TestCase, Type, boost::mpl::list<int> )
{
}

BOOST_AUTO_TEST_SUITE_END()

Note: This leak is detected only when application is linked with C runtime statically. Configured test application can be found in the attachment

Execution output:

Running 1 test case...

*** No errors detected
Detected memory leaks!
Dumping objects ->
{103} normal block at 0x00808D50, 4 bytes long.
 Data: <int > 69 6E 74 00
{102} normal block at 0x00808D18, 8 bytes long.
 Data: <P       > 50 8D 80 00 00 00 00 00
Object dump complete.

Attachments (1)

BoostTestMemoryLeak.zip (2.4 KB ) - added by Anton Matosov <anton.matosov@…> 11 years ago.
Configured VS2008 test application which reproduces the memory leak in boost::test library

Download all attachments as: .zip

Change History (5)

by Anton Matosov <anton.matosov@…>, 11 years ago

Attachment: BoostTestMemoryLeak.zip added

Configured VS2008 test application which reproduces the memory leak in boost::test library

comment:1 by harningt@…, 11 years ago

Any status change on this? If there is a workaround that I can put in place to alleviate this problem before it is put in a release, that would be great.

comment:2 by Anton Matosov <anton.matosov@…>, 11 years ago

It seems that issue is not in boost test library, but with memory leaks detection itself. The leak detected is a memory allocated for type_info (typeid) but not yet freed.

Here is the MSDN page related to the issue: http://connect.microsoft.com/VisualStudio/feedback/details/106937/memory-leaks-reported-by-debug-crt-inside-typeinfo-name

Here is the smallest code that reproduces the "leak":

#include <crtdbg.h>
#include <typeinfo> // for typeid

int main()
{
   _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
   _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
   _CrtSetDbgFlag(_CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ) | _CRTDBG_LEAK_CHECK_DF);

   typeid(int).name();

   return 0;
}

The good news here is that there is a workaround for this issue provided on the MSDN page specified above. Minimum code that worked in my case is:

void free_typeinfo_memory()
{
   __type_info_node *pNode = __type_info_root_node.next;
   __type_info_node *tmpNode = &__type_info_root_node;

   for( ; pNode!=NULL; pNode = tmpNode )
   {
      tmpNode = pNode->next;
      delete pNode->memPtr;
      delete pNode;
   }
}

I have placed the call to free_typeinfo_memory() at the very last line of the main() and leaks didn't come up again :)

comment:3 by Gennadiy Rozental, 11 years ago

Resolution: fixed
Status: newclosed

(In [74958]) Introduces notion of framework shutdown Fixes #5582

comment:4 by Raffi Enficiaud, 7 years ago

Milestone: Boost 1.47.0Boost 1.59.0
Note: See TracTickets for help on using tickets.