This one comes up when running a program that was built with the address sanitizer and made me curious.
The gperftools source code contains the following function:
void MallocExtension::Register(MallocExtension* implementation) {
InitModule();
// When running under valgrind, our custom malloc is replaced with
// valgrind's one and malloc extensions will not work. (Note:
// callers should be responsible for checking that they are the
// malloc that is really being run, before calling Register. This
// is just here as an extra sanity check.)
if (!RunningOnValgrind()) {
current_instance = implementation;
}
}
With InitModule
defined as follows
static void InitModule() {
if (current_instance != NULL) {
return;
}
current_instance = new MallocExtension; // pointless?
#ifndef NO_HEAP_CHECK
HeapLeakChecker::IgnoreObject(current_instance);
#endif
}
Our address sanitizer (not valgrind, of course) complains about a memory leak for the MallocExtension
object. Apparently, it is right. But why is this allocation in there in the first place?
I refuse to think that people developing their own memory allocator would make such a trivial mistake. There is also an explicit check against valgrind. So what is the purpose of the allocation?