forked from OSchip/llvm-project
[analyzer] InnerPointerChecker: fix displayed checker name.
For InnerPointerChecker to function properly, both the checker itself and parts of MallocChecker that handle relevant use-after-free problems need to be turned on. So far, the latter part has been developed within MallocChecker's NewDelete sub-checker, often causing warnings to appear under that name. This patch defines a new CheckKind within MallocChecker for the inner pointer checking functionality, so that the correct name is displayed in warnings and in the ExplodedGraph. Tested on clang-tidy. Differential Review: https://reviews.llvm.org/D50211 llvm-svn: 339067
This commit is contained in:
parent
69dd7cd45e
commit
d9f66ba340
|
@ -15,6 +15,7 @@
|
|||
|
||||
#include "AllocationState.h"
|
||||
#include "ClangSACheckers.h"
|
||||
#include "InterCheckerAPI.h"
|
||||
#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
|
||||
#include "clang/StaticAnalyzer/Core/BugReporter/CommonBugCategories.h"
|
||||
#include "clang/StaticAnalyzer/Core/Checker.h"
|
||||
|
@ -313,6 +314,6 @@ std::unique_ptr<BugReporterVisitor> getInnerPointerBRVisitor(SymbolRef Sym) {
|
|||
} // end namespace clang
|
||||
|
||||
void ento::registerInnerPointerChecker(CheckerManager &Mgr) {
|
||||
registerNewDeleteChecker(Mgr);
|
||||
registerInnerPointerCheckerAux(Mgr);
|
||||
Mgr.registerChecker<InnerPointerChecker>();
|
||||
}
|
||||
|
|
|
@ -20,5 +20,8 @@ namespace ento {
|
|||
/// Register the checker which evaluates CString API calls.
|
||||
void registerCStringCheckerBasic(CheckerManager &Mgr);
|
||||
|
||||
/// Register the part of MallocChecker connected to InnerPointerChecker.
|
||||
void registerInnerPointerCheckerAux(CheckerManager &Mgr);
|
||||
|
||||
}}
|
||||
#endif /* INTERCHECKERAPI_H_ */
|
||||
|
|
|
@ -194,6 +194,7 @@ public:
|
|||
CK_NewDeleteChecker,
|
||||
CK_NewDeleteLeaksChecker,
|
||||
CK_MismatchedDeallocatorChecker,
|
||||
CK_InnerPointerChecker,
|
||||
CK_NumCheckKinds
|
||||
};
|
||||
|
||||
|
@ -1662,13 +1663,10 @@ MallocChecker::getCheckIfTracked(AllocationFamily Family,
|
|||
case AF_IfNameIndex: {
|
||||
if (ChecksEnabled[CK_MallocChecker])
|
||||
return CK_MallocChecker;
|
||||
|
||||
return Optional<MallocChecker::CheckKind>();
|
||||
return None;
|
||||
}
|
||||
case AF_CXXNew:
|
||||
case AF_CXXNewArray:
|
||||
// FIXME: Add new CheckKind for AF_InnerBuffer.
|
||||
case AF_InnerBuffer: {
|
||||
case AF_CXXNewArray: {
|
||||
if (IsALeakCheck) {
|
||||
if (ChecksEnabled[CK_NewDeleteLeaksChecker])
|
||||
return CK_NewDeleteLeaksChecker;
|
||||
|
@ -1677,7 +1675,12 @@ MallocChecker::getCheckIfTracked(AllocationFamily Family,
|
|||
if (ChecksEnabled[CK_NewDeleteChecker])
|
||||
return CK_NewDeleteChecker;
|
||||
}
|
||||
return Optional<MallocChecker::CheckKind>();
|
||||
return None;
|
||||
}
|
||||
case AF_InnerBuffer: {
|
||||
if (ChecksEnabled[CK_InnerPointerChecker])
|
||||
return CK_InnerPointerChecker;
|
||||
return None;
|
||||
}
|
||||
case AF_None: {
|
||||
llvm_unreachable("no family");
|
||||
|
@ -1980,7 +1983,8 @@ void MallocChecker::ReportUseAfterFree(CheckerContext &C, SourceRange Range,
|
|||
SymbolRef Sym) const {
|
||||
|
||||
if (!ChecksEnabled[CK_MallocChecker] &&
|
||||
!ChecksEnabled[CK_NewDeleteChecker])
|
||||
!ChecksEnabled[CK_NewDeleteChecker] &&
|
||||
!ChecksEnabled[CK_InnerPointerChecker])
|
||||
return;
|
||||
|
||||
Optional<MallocChecker::CheckKind> CheckKind = getCheckIfTracked(C, Sym);
|
||||
|
@ -3109,6 +3113,18 @@ void ento::registerNewDeleteLeaksChecker(CheckerManager &mgr) {
|
|||
}
|
||||
}
|
||||
|
||||
// Intended to be used in InnerPointerChecker to register the part of
|
||||
// MallocChecker connected to it.
|
||||
void ento::registerInnerPointerCheckerAux(CheckerManager &mgr) {
|
||||
registerCStringCheckerBasic(mgr);
|
||||
MallocChecker *checker = mgr.registerChecker<MallocChecker>();
|
||||
checker->IsOptimistic = mgr.getAnalyzerOptions().getBooleanOption(
|
||||
"Optimistic", false, checker);
|
||||
checker->ChecksEnabled[MallocChecker::CK_InnerPointerChecker] = true;
|
||||
checker->CheckNames[MallocChecker::CK_InnerPointerChecker] =
|
||||
mgr.getCurrentCheckName();
|
||||
}
|
||||
|
||||
#define REGISTER_CHECKER(name) \
|
||||
void ento::register##name(CheckerManager &mgr) { \
|
||||
registerCStringCheckerBasic(mgr); \
|
||||
|
|
Loading…
Reference in New Issue