[rfc][icedtea-web] C++ unit-tests for memory leak w/ simple leak-detecting operator-new, along with fix
Pavel Tisnovsky
ptisnovs at redhat.com
Fri Dec 21 08:47:08 PST 2012
----- Adam Domurad <adomurad at redhat.com> wrote:
> On 12/20/2012 10:13 AM, Pavel Tisnovsky wrote:
> > Hi Adam,
> >
> > this patch looks very good in overall, but I'm not sure (=I'm dumb today) why can't you
> > simply use ::new and ::delete operators to override them in following place:
> >
> > +void* operator new(size_t size) throw (std::bad_alloc) {
> > + if (!__allocations) {
> > + // This uses placement-new, which calls the constructor on a specific memory location
> > + // This is needed because we cannot call 'new' in this context, nor can we rely on static-initialization
> > + // for the set to occur before any call to 'new'!
> > + void* memory = malloc(sizeof(AllocationSet));
> > + __allocations = new (memory) AllocationSet();
> > + }
> > +
> > + void* mem = malloc(size);
> > + if (mem == 0) {
> > + throw std::bad_alloc(); // ANSI/ISO compliant behavior
> > + }
> > + __allocations->insert(mem);
> > + return mem;
> > +
> >
> > Cheers,
> > Pavel
>
> As we discussed, this would be recursive.
>
> http://stackoverflow.com/questions/4134195/how-do-i-call-the-original-operator-new-if-i-have-overloaded-it
>
> indicates that the only approach is to recreate operator-new using malloc.
>
> Thanks, will push as is (as we also discussed off-list),
> -Adam
Yes, please do.
Thank you very much,
Pavel
>
> >
> > ----- Adam Domurad <adomurad at redhat.com> wrote:
> >> The unit test infrastructure + tests:
> >> 2012-12-XX Adam Domurad <adomurad at redhat.com>
> >>
> >> * tests/cpp-unit-tests/browser_mock.cc
> >> (mock_retainobject): New, mocks behaviour of NPAPI retainobject
> >> (mock_releaseobject): New, mocks behaviour of NPAPI releaseobject
> >> * tests/cpp-unit-tests/main.cc: Add warning of memory leak based on
> >> operator-new.
> >> * tests/cpp-unit-tests/IcedTeaScriptablePluginObjectTest.cc: New, tests
> >> for memory leak in (IcedTeaScriptableJavaObject::deAllocate) and
> >> (IcedTeaScriptableJavaPackageObject::deAllocate)
> >> * tests/cpp-unit-tests/checked_allocations.h: Defines set that does not
> >> use operator-new, to prevent recursion in overloaded operator-new
> >> * tests/cpp-unit-tests/checked_allocations.cc: Operator new overload
> >> that has allocation-set for querying live allocations.
> >>
> >> The fix:
> >> 2012-12-XX Adam Domurad <adomurad at redhat.com>
> >>
> >> * plugin/icedteanp/IcedTeaScriptablePluginObject.cc
> >> (IcedTeaScriptableJavaObject::deAllocate): Fix memory leak
> >> (IcedTeaScriptableJavaPackageObject::deAllocate): Fix memory leak
>
More information about the distro-pkg-dev
mailing list