Opened 12 years ago
Closed 12 years ago
#4368 closed Bugs (fixed)
boost::recursive_mutex constructor potential resource leak
Reported by: | Owned by: | Anthony Williams | |
---|---|---|---|
Milestone: | Boost 1.44.0 | Component: | thread |
Version: | Boost Development Trunk | Severity: | Problem |
Keywords: | recursive_mutex | Cc: |
Description
When running the Klocwork static code analysis tool on some code that uses Boost.Thread, Klocwork reported the following potential issue (note that this is for boost 1_36_0, but the latest trunk code appears to have the same issue):
boost-1_36/boost/thread/pthread/recursive_mutex.hpp: 50
Resource acquired to 'attr' at line 42 may be lost here. Also there is one similar error on line 56.
recursive_mutex.hpp#1:42: Resource is acquired: 'attr' is accessed via 1 argument of the call to function 'pthread_mutexattr_init'
recursive_mutex.hpp#1:43: init_attr_res is false
recursive_mutex.hpp#1:47: 'attr' might be changed
recursive_mutex.hpp#1:48: set_attr_res is true
recursive_mutex.hpp#1:50: Resource is lost: 'attr'
I'm not absolutely certain this is the issue Klocwork is attempting to report, but in the boost/thread/pthread/recursive_mutex.hpp header file the mutex attribute object is not destroyed if an exception is thrown due to pthread_mutexattr_settype() failure. I see that pthread_mutexattr_destroy() has been added since 1_36_0 for the case where pthread_mutex_init() fails. A similar call is needed if pthread_mutexattr_settype() fails.
recursive_mutex() { #ifdef BOOST_PTHREAD_HAS_MUTEXATTR_SETTYPE pthread_mutexattr_t attr; int const init_attr_res=pthread_mutexattr_init(&attr); if(init_attr_res) { boost::throw_exception(thread_resource_error()); } int const set_attr_res=pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE); if(set_attr_res) { // Shouldn't the following line be added here? // BOOST_VERIFY(!pthread_mutexattr_destroy(&attr)); boost::throw_exception(thread_resource_error()); } int const res=pthread_mutex_init(&m,&attr); if(res) { BOOST_VERIFY(!pthread_mutexattr_destroy(&attr)); boost::throw_exception(thread_resource_error()); } BOOST_VERIFY(!pthread_mutexattr_destroy(&attr));
Fixed on trunk