forked from OSchip/llvm-project
Require that all static analyzer issues have a category. As part of this change,
consolidate some commonly used category strings into global references (more of this can be done, I just did a few). Fixes <rdar://problem/11191537>. llvm-svn: 154121
This commit is contained in:
parent
aec8a82694
commit
b45d198b6f
|
@ -0,0 +1,24 @@
|
|||
//=--- CommonBugCategories.h - Provides common issue categories -*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CLANG_STATIC_ANALYZER_CHECKER_CATEGORIES_H
|
||||
#define LLVM_CLANG_STATIC_ANALYZER_CHECKER_CATEGORIES_H
|
||||
|
||||
// Common strings used for the "category" of many static analyzer issues.
|
||||
namespace clang {
|
||||
namespace ento {
|
||||
namespace categories {
|
||||
extern const char *CoreFoundationObjectiveC;
|
||||
extern const char *MemoryCoreFoundationObjectiveC;
|
||||
extern const char *UnixAPI;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
@ -357,36 +357,17 @@ public:
|
|||
/// reports.
|
||||
void EmitReport(BugReport *R);
|
||||
|
||||
void EmitBasicReport(const Decl *DeclWithIssue,
|
||||
StringRef BugName, StringRef BugStr,
|
||||
PathDiagnosticLocation Loc,
|
||||
SourceRange* RangeBeg, unsigned NumRanges);
|
||||
|
||||
void EmitBasicReport(const Decl *DeclWithIssue,
|
||||
StringRef BugName, StringRef BugCategory,
|
||||
StringRef BugStr, PathDiagnosticLocation Loc,
|
||||
SourceRange* RangeBeg, unsigned NumRanges);
|
||||
|
||||
|
||||
void EmitBasicReport(const Decl *DeclWithIssue,
|
||||
StringRef BugName, StringRef BugStr,
|
||||
PathDiagnosticLocation Loc) {
|
||||
EmitBasicReport(DeclWithIssue, BugName, BugStr, Loc, 0, 0);
|
||||
}
|
||||
|
||||
void EmitBasicReport(const Decl *DeclWithIssue,
|
||||
StringRef BugName, StringRef BugCategory,
|
||||
StringRef BugStr, PathDiagnosticLocation Loc) {
|
||||
EmitBasicReport(DeclWithIssue, BugName, BugCategory, BugStr, Loc, 0, 0);
|
||||
}
|
||||
|
||||
void EmitBasicReport(const Decl *DeclWithIssue,
|
||||
StringRef BugName, StringRef BugStr,
|
||||
PathDiagnosticLocation Loc,
|
||||
SourceRange R) {
|
||||
EmitBasicReport(DeclWithIssue, BugName, BugStr, Loc, &R, 1);
|
||||
}
|
||||
|
||||
void EmitBasicReport(const Decl *DeclWithIssue,
|
||||
StringRef BugName, StringRef Category,
|
||||
StringRef BugStr, PathDiagnosticLocation Loc,
|
||||
|
|
|
@ -26,6 +26,7 @@ add_clang_library(clangStaticAnalyzerCheckers
|
|||
CheckerDocumentation.cpp
|
||||
ChrootChecker.cpp
|
||||
ClangCheckers.cpp
|
||||
CommonBugCategories.cpp
|
||||
DeadStoresChecker.cpp
|
||||
DebugCheckers.cpp
|
||||
DereferenceChecker.cpp
|
||||
|
|
|
@ -179,7 +179,8 @@ static void checkObjCDealloc(const ObjCImplementationDecl *D,
|
|||
llvm::raw_string_ostream os(buf);
|
||||
os << "Objective-C class '" << *D << "' lacks a 'dealloc' instance method";
|
||||
|
||||
BR.EmitBasicReport(D, name, os.str(), DLoc);
|
||||
BR.EmitBasicReport(D, name, categories::CoreFoundationObjectiveC,
|
||||
os.str(), DLoc);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -196,7 +197,8 @@ static void checkObjCDealloc(const ObjCImplementationDecl *D,
|
|||
<< "' does not send a 'dealloc' message to its super class"
|
||||
" (missing [super dealloc])";
|
||||
|
||||
BR.EmitBasicReport(MD, name, os.str(), DLoc);
|
||||
BR.EmitBasicReport(MD, name, categories::CoreFoundationObjectiveC,
|
||||
os.str(), DLoc);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -236,9 +238,7 @@ static void checkObjCDealloc(const ObjCImplementationDecl *D,
|
|||
bool requiresRelease = PD->getSetterKind() != ObjCPropertyDecl::Assign;
|
||||
if (scan_ivar_release(MD->getBody(), ID, PD, RS, SelfII, Ctx)
|
||||
!= requiresRelease) {
|
||||
const char *name;
|
||||
const char* category = "Memory (Core Foundation/Objective-C)";
|
||||
|
||||
const char *name = 0;
|
||||
std::string buf;
|
||||
llvm::raw_string_ostream os(buf);
|
||||
|
||||
|
@ -263,7 +263,8 @@ static void checkObjCDealloc(const ObjCImplementationDecl *D,
|
|||
PathDiagnosticLocation SDLoc =
|
||||
PathDiagnosticLocation::createBegin((*I), BR.getSourceManager());
|
||||
|
||||
BR.EmitBasicReport(MD, name, category, os.str(), SDLoc);
|
||||
BR.EmitBasicReport(MD, name, categories::CoreFoundationObjectiveC,
|
||||
os.str(), SDLoc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -72,6 +72,7 @@ static void CompareReturnTypes(const ObjCMethodDecl *MethDerived,
|
|||
|
||||
BR.EmitBasicReport(MethDerived,
|
||||
"Incompatible instance method return type",
|
||||
categories::CoreFoundationObjectiveC,
|
||||
os.str(), MethDLoc);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "clang/StaticAnalyzer/Checkers/CommonBugCategories.h"
|
||||
|
||||
#ifndef LLVM_CLANG_SA_LIB_CHECKERS_CLANGSACHECKERS_H
|
||||
#define LLVM_CLANG_SA_LIB_CHECKERS_CLANGSACHECKERS_H
|
||||
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
//=--- CommonBugCategories.cpp - Provides common issue categories -*- C++ -*-=//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// Common strings used for the "category" of many static analyzer issues.
|
||||
namespace clang { namespace ento { namespace categories {
|
||||
|
||||
const char *CoreFoundationObjectiveC = "Core Foundation/Objective-C";
|
||||
const char *MemoryCoreFoundationObjectiveC =
|
||||
"Memory (Core Foundation/Objective-C)";
|
||||
const char *UnixAPI = "Unix API";
|
||||
}}}
|
||||
|
|
@ -214,7 +214,7 @@ void MallocOverflowSecurityChecker::OutputPossibleOverflows(
|
|||
i != e;
|
||||
++i) {
|
||||
SourceRange R = i->mulop->getSourceRange();
|
||||
BR.EmitBasicReport(D, "malloc() size overflow",
|
||||
BR.EmitBasicReport(D, "malloc() size overflow", categories::UnixAPI,
|
||||
"the computation of the size of the memory allocation may overflow",
|
||||
PathDiagnosticLocation::createOperatorLoc(i->mulop,
|
||||
BR.getSourceManager()), &R, 1);
|
||||
|
|
|
@ -194,7 +194,9 @@ public:
|
|||
PathDiagnosticLocation::createBegin(i->AllocCall->getCallee(),
|
||||
BR.getSourceManager(), ADC);
|
||||
|
||||
BR.EmitBasicReport(D, "allocator sizeof operand mismatch", OS.str(),
|
||||
BR.EmitBasicReport(D, "allocator sizeof operand mismatch",
|
||||
categories::UnixAPI,
|
||||
OS.str(),
|
||||
L, Ranges.data(), Ranges.size());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -143,7 +143,7 @@ void WalkAST::VisitCallExpr(CallExpr *CE) {
|
|||
PathDiagnosticLocation CELoc =
|
||||
PathDiagnosticLocation::createBegin(CE, BR.getSourceManager(), AC);
|
||||
BR.EmitBasicReport(AC->getDecl(),
|
||||
OsName.str(), "Core Foundation/Objective-C",
|
||||
OsName.str(), categories::CoreFoundationObjectiveC,
|
||||
Os.str(), CELoc, &R, 1);
|
||||
}
|
||||
|
||||
|
|
|
@ -34,7 +34,8 @@ class ObjCContainersChecker : public Checker< check::PreStmt<CallExpr>,
|
|||
mutable OwningPtr<BugType> BT;
|
||||
inline void initBugType() const {
|
||||
if (!BT)
|
||||
BT.reset(new BugType("CFArray API", "Core Foundation/Objective-C"));
|
||||
BT.reset(new BugType("CFArray API",
|
||||
categories::CoreFoundationObjectiveC));
|
||||
}
|
||||
|
||||
inline SymbolRef getArraySym(const Expr *E, CheckerContext &C) const {
|
||||
|
|
|
@ -83,7 +83,7 @@ class InitSelfBug : public BugType {
|
|||
const std::string desc;
|
||||
public:
|
||||
InitSelfBug() : BugType("Missing \"self = [(super or self) init...]\"",
|
||||
"Core Foundation/Objective-C") {}
|
||||
categories::CoreFoundationObjectiveC) {}
|
||||
};
|
||||
|
||||
} // end anonymous namespace
|
||||
|
|
|
@ -1620,7 +1620,7 @@ namespace {
|
|||
class CFRefBug : public BugType {
|
||||
protected:
|
||||
CFRefBug(StringRef name)
|
||||
: BugType(name, "Memory (Core Foundation/Objective-C)") {}
|
||||
: BugType(name, categories::MemoryCoreFoundationObjectiveC) {}
|
||||
public:
|
||||
|
||||
// FIXME: Eventually remove.
|
||||
|
|
|
@ -67,7 +67,7 @@ static inline void LazyInitialize(OwningPtr<BugType> &BT,
|
|||
const char *name) {
|
||||
if (BT)
|
||||
return;
|
||||
BT.reset(new BugType(name, "Unix API"));
|
||||
BT.reset(new BugType(name, categories::UnixAPI));
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -2027,13 +2027,6 @@ void BugReporter::FlushReport(BugReportEquivClass& EQ) {
|
|||
PD->HandlePathDiagnostic(D.take());
|
||||
}
|
||||
|
||||
void BugReporter::EmitBasicReport(const Decl *DeclWithIssue,
|
||||
StringRef name, StringRef str,
|
||||
PathDiagnosticLocation Loc,
|
||||
SourceRange* RBeg, unsigned NumRanges) {
|
||||
EmitBasicReport(DeclWithIssue, name, "", str, Loc, RBeg, NumRanges);
|
||||
}
|
||||
|
||||
void BugReporter::EmitBasicReport(const Decl *DeclWithIssue,
|
||||
StringRef name,
|
||||
StringRef category,
|
||||
|
|
Loading…
Reference in New Issue