Bury leaked pointers in a global array to silence a leak detector in --disable-free mode
Summary: This is an alternative to http://llvm-reviews.chandlerc.com/D2475 suggested by Chandler. Reviewers: chandlerc, rnk, dblaikie CC: cfe-commits, earthdok Differential Revision: http://llvm-reviews.chandlerc.com/D2478 llvm-svn: 198073
This commit is contained in:
@@ -28,6 +28,7 @@
|
||||
#include "llvm/Option/ArgList.h"
|
||||
#include "llvm/Option/OptTable.h"
|
||||
#include "llvm/Option/Option.h"
|
||||
#include "llvm/Support/Atomic.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/FileSystem.h"
|
||||
#include "llvm/Support/Host.h"
|
||||
@@ -1827,4 +1828,19 @@ int getLastArgIntValue(const ArgList &Args, OptSpecifier Id, int Default,
|
||||
}
|
||||
return Res;
|
||||
}
|
||||
|
||||
void BuryPointer(const void *Ptr) {
|
||||
// This function may be called only a small fixed amount of times per each
|
||||
// invocation, otherwise we do actually have a leak which we want to report.
|
||||
// If this function is called more than kGraveYardMaxSize times, the pointers
|
||||
// will not be properly buried and a leak detector will report a leak, which
|
||||
// is what we want in such case.
|
||||
static const size_t kGraveYardMaxSize = 16;
|
||||
static const void *GraveYard[kGraveYardMaxSize];
|
||||
static llvm::sys::cas_flag GraveYardSize;
|
||||
llvm::sys::cas_flag Idx = llvm::sys::AtomicIncrement(&GraveYardSize) - 1;
|
||||
if (Idx >= kGraveYardMaxSize)
|
||||
return;
|
||||
GraveYard[Idx] = Ptr;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user