forked from OSchip/llvm-project
[analyzer] ArrayRef-ize BugReporter::EmitBasicReport.
No functionality change. llvm-svn: 192114
This commit is contained in:
parent
7741132f47
commit
42b4248f05
|
@ -466,20 +466,7 @@ public:
|
|||
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 BugCategory,
|
||||
StringRef BugStr, PathDiagnosticLocation Loc) {
|
||||
EmitBasicReport(DeclWithIssue, BugName, BugCategory, BugStr, Loc, 0, 0);
|
||||
}
|
||||
|
||||
void EmitBasicReport(const Decl *DeclWithIssue,
|
||||
StringRef BugName, StringRef Category,
|
||||
StringRef BugStr, PathDiagnosticLocation Loc,
|
||||
SourceRange R) {
|
||||
EmitBasicReport(DeclWithIssue, BugName, Category, BugStr, Loc, &R, 1);
|
||||
}
|
||||
ArrayRef<SourceRange> Ranges = None);
|
||||
|
||||
private:
|
||||
llvm::StringMap<BugType *> StrBugTypes;
|
||||
|
|
|
@ -141,7 +141,6 @@ void WalkAST::VisitCallExpr(CallExpr *CE) {
|
|||
if (containsBadStrncatPattern(CE)) {
|
||||
const Expr *DstArg = CE->getArg(0);
|
||||
const Expr *LenArg = CE->getArg(2);
|
||||
SourceRange R = LenArg->getSourceRange();
|
||||
PathDiagnosticLocation Loc =
|
||||
PathDiagnosticLocation::createBegin(LenArg, BR.getSourceManager(), AC);
|
||||
|
||||
|
@ -159,7 +158,7 @@ void WalkAST::VisitCallExpr(CallExpr *CE) {
|
|||
os << "se a safer 'strlcat' API";
|
||||
|
||||
BR.EmitBasicReport(FD, "Anti-pattern in the argument", "C String API",
|
||||
os.str(), Loc, &R, 1);
|
||||
os.str(), Loc, LenArg->getSourceRange());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -283,7 +283,7 @@ void WalkAST::checkLoopConditionForFloat(const ForStmt *FS) {
|
|||
PathDiagnosticLocation::createBegin(FS, BR.getSourceManager(), AC);
|
||||
BR.EmitBasicReport(AC->getDecl(),
|
||||
bugType, "Security", os.str(),
|
||||
FSLoc, ranges.data(), ranges.size());
|
||||
FSLoc, ranges);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -314,7 +314,6 @@ void WalkAST::checkCall_gets(const CallExpr *CE, const FunctionDecl *FD) {
|
|||
return;
|
||||
|
||||
// Issue a warning.
|
||||
SourceRange R = CE->getCallee()->getSourceRange();
|
||||
PathDiagnosticLocation CELoc =
|
||||
PathDiagnosticLocation::createBegin(CE, BR.getSourceManager(), AC);
|
||||
BR.EmitBasicReport(AC->getDecl(),
|
||||
|
@ -322,7 +321,7 @@ void WalkAST::checkCall_gets(const CallExpr *CE, const FunctionDecl *FD) {
|
|||
"Security",
|
||||
"Call to function 'gets' is extremely insecure as it can "
|
||||
"always result in a buffer overflow",
|
||||
CELoc, &R, 1);
|
||||
CELoc, CE->getCallee()->getSourceRange());
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -355,7 +354,6 @@ void WalkAST::checkCall_getpw(const CallExpr *CE, const FunctionDecl *FD) {
|
|||
return;
|
||||
|
||||
// Issue a warning.
|
||||
SourceRange R = CE->getCallee()->getSourceRange();
|
||||
PathDiagnosticLocation CELoc =
|
||||
PathDiagnosticLocation::createBegin(CE, BR.getSourceManager(), AC);
|
||||
BR.EmitBasicReport(AC->getDecl(),
|
||||
|
@ -363,7 +361,7 @@ void WalkAST::checkCall_getpw(const CallExpr *CE, const FunctionDecl *FD) {
|
|||
"Security",
|
||||
"The getpw() function is dangerous as it may overflow the "
|
||||
"provided buffer. It is obsoleted by getpwuid().",
|
||||
CELoc, &R, 1);
|
||||
CELoc, CE->getCallee()->getSourceRange());
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -397,7 +395,6 @@ void WalkAST::checkCall_mktemp(const CallExpr *CE, const FunctionDecl *FD) {
|
|||
return;
|
||||
|
||||
// Issue a waring.
|
||||
SourceRange R = CE->getCallee()->getSourceRange();
|
||||
PathDiagnosticLocation CELoc =
|
||||
PathDiagnosticLocation::createBegin(CE, BR.getSourceManager(), AC);
|
||||
BR.EmitBasicReport(AC->getDecl(),
|
||||
|
@ -406,7 +403,7 @@ void WalkAST::checkCall_mktemp(const CallExpr *CE, const FunctionDecl *FD) {
|
|||
"Call to function 'mktemp' is insecure as it always "
|
||||
"creates or uses insecure temporary file. Use 'mkstemp' "
|
||||
"instead",
|
||||
CELoc, &R, 1);
|
||||
CELoc, CE->getCallee()->getSourceRange());
|
||||
}
|
||||
|
||||
|
||||
|
@ -470,7 +467,6 @@ void WalkAST::checkCall_mkstemp(const CallExpr *CE, const FunctionDecl *FD) {
|
|||
return;
|
||||
|
||||
// Issue a warning.
|
||||
SourceRange R = strArg->getSourceRange();
|
||||
PathDiagnosticLocation CELoc =
|
||||
PathDiagnosticLocation::createBegin(CE, BR.getSourceManager(), AC);
|
||||
SmallString<512> buf;
|
||||
|
@ -489,7 +485,7 @@ void WalkAST::checkCall_mkstemp(const CallExpr *CE, const FunctionDecl *FD) {
|
|||
out << ')';
|
||||
BR.EmitBasicReport(AC->getDecl(),
|
||||
"Insecure temporary file creation", "Security",
|
||||
out.str(), CELoc, &R, 1);
|
||||
out.str(), CELoc, strArg->getSourceRange());
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -506,7 +502,6 @@ void WalkAST::checkCall_strcpy(const CallExpr *CE, const FunctionDecl *FD) {
|
|||
return;
|
||||
|
||||
// Issue a warning.
|
||||
SourceRange R = CE->getCallee()->getSourceRange();
|
||||
PathDiagnosticLocation CELoc =
|
||||
PathDiagnosticLocation::createBegin(CE, BR.getSourceManager(), AC);
|
||||
BR.EmitBasicReport(AC->getDecl(),
|
||||
|
@ -517,7 +512,7 @@ void WalkAST::checkCall_strcpy(const CallExpr *CE, const FunctionDecl *FD) {
|
|||
"provide bounding of the memory buffer. Replace "
|
||||
"unbounded copy functions with analogous functions that "
|
||||
"support length arguments such as 'strlcpy'. CWE-119.",
|
||||
CELoc, &R, 1);
|
||||
CELoc, CE->getCallee()->getSourceRange());
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -534,7 +529,6 @@ void WalkAST::checkCall_strcat(const CallExpr *CE, const FunctionDecl *FD) {
|
|||
return;
|
||||
|
||||
// Issue a warning.
|
||||
SourceRange R = CE->getCallee()->getSourceRange();
|
||||
PathDiagnosticLocation CELoc =
|
||||
PathDiagnosticLocation::createBegin(CE, BR.getSourceManager(), AC);
|
||||
BR.EmitBasicReport(AC->getDecl(),
|
||||
|
@ -545,7 +539,7 @@ void WalkAST::checkCall_strcat(const CallExpr *CE, const FunctionDecl *FD) {
|
|||
"provide bounding of the memory buffer. Replace "
|
||||
"unbounded copy functions with analogous functions that "
|
||||
"support length arguments such as 'strlcat'. CWE-119.",
|
||||
CELoc, &R, 1);
|
||||
CELoc, CE->getCallee()->getSourceRange());
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -614,11 +608,10 @@ void WalkAST::checkCall_rand(const CallExpr *CE, const FunctionDecl *FD) {
|
|||
<< "' is obsolete because it implements a poor random number generator."
|
||||
<< " Use 'arc4random' instead";
|
||||
|
||||
SourceRange R = CE->getCallee()->getSourceRange();
|
||||
PathDiagnosticLocation CELoc =
|
||||
PathDiagnosticLocation::createBegin(CE, BR.getSourceManager(), AC);
|
||||
BR.EmitBasicReport(AC->getDecl(), os1.str(), "Security", os2.str(),
|
||||
CELoc, &R, 1);
|
||||
CELoc, CE->getCallee()->getSourceRange());
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -639,7 +632,6 @@ void WalkAST::checkCall_random(const CallExpr *CE, const FunctionDecl *FD) {
|
|||
return;
|
||||
|
||||
// Issue a warning.
|
||||
SourceRange R = CE->getCallee()->getSourceRange();
|
||||
PathDiagnosticLocation CELoc =
|
||||
PathDiagnosticLocation::createBegin(CE, BR.getSourceManager(), AC);
|
||||
BR.EmitBasicReport(AC->getDecl(),
|
||||
|
@ -647,7 +639,7 @@ void WalkAST::checkCall_random(const CallExpr *CE, const FunctionDecl *FD) {
|
|||
"Security",
|
||||
"The 'random' function produces a sequence of values that "
|
||||
"an adversary may be able to predict. Use 'arc4random' "
|
||||
"instead", CELoc, &R, 1);
|
||||
"instead", CELoc, CE->getCallee()->getSourceRange());
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -660,7 +652,6 @@ void WalkAST::checkCall_vfork(const CallExpr *CE, const FunctionDecl *FD) {
|
|||
return;
|
||||
|
||||
// All calls to vfork() are insecure, issue a warning.
|
||||
SourceRange R = CE->getCallee()->getSourceRange();
|
||||
PathDiagnosticLocation CELoc =
|
||||
PathDiagnosticLocation::createBegin(CE, BR.getSourceManager(), AC);
|
||||
BR.EmitBasicReport(AC->getDecl(),
|
||||
|
@ -671,7 +662,7 @@ void WalkAST::checkCall_vfork(const CallExpr *CE, const FunctionDecl *FD) {
|
|||
"denial of service situations in the parent process. "
|
||||
"Replace calls to vfork with calls to the safer "
|
||||
"'posix_spawn' function",
|
||||
CELoc, &R, 1);
|
||||
CELoc, CE->getCallee()->getSourceRange());
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -732,11 +723,10 @@ void WalkAST::checkUncheckedReturnValue(CallExpr *CE) {
|
|||
<< "' is not checked. If an error occurs in '" << *FD
|
||||
<< "', the following code may execute with unexpected privileges";
|
||||
|
||||
SourceRange R = CE->getCallee()->getSourceRange();
|
||||
PathDiagnosticLocation CELoc =
|
||||
PathDiagnosticLocation::createBegin(CE, BR.getSourceManager(), AC);
|
||||
BR.EmitBasicReport(AC->getDecl(), os1.str(), "Security", os2.str(),
|
||||
CELoc, &R, 1);
|
||||
CELoc, CE->getCallee()->getSourceRange());
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -60,7 +60,6 @@ void WalkAST::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {
|
|||
if (!isa<DeclRefExpr>(ArgEx->IgnoreParens()))
|
||||
return;
|
||||
|
||||
SourceRange R = ArgEx->getSourceRange();
|
||||
PathDiagnosticLocation ELoc =
|
||||
PathDiagnosticLocation::createBegin(E, BR.getSourceManager(), AC);
|
||||
BR.EmitBasicReport(AC->getDecl(),
|
||||
|
@ -68,7 +67,7 @@ void WalkAST::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {
|
|||
categories::LogicError,
|
||||
"The code calls sizeof() on a pointer type. "
|
||||
"This can produce an unexpected result.",
|
||||
ELoc, &R, 1);
|
||||
ELoc, ArgEx->getSourceRange());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -213,11 +213,11 @@ void MallocOverflowSecurityChecker::OutputPossibleOverflows(
|
|||
e = PossibleMallocOverflows.end();
|
||||
i != e;
|
||||
++i) {
|
||||
SourceRange R = i->mulop->getSourceRange();
|
||||
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);
|
||||
BR.getSourceManager()),
|
||||
i->mulop->getSourceRange());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -239,7 +239,7 @@ public:
|
|||
BR.EmitBasicReport(D, "Allocator sizeof operand mismatch",
|
||||
categories::UnixAPI,
|
||||
OS.str(),
|
||||
L, Ranges.data(), Ranges.size());
|
||||
L, Ranges);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -140,12 +140,11 @@ void WalkAST::VisitCallExpr(CallExpr *CE) {
|
|||
<< Name << "' must be a C array of pointer-sized values, not '"
|
||||
<< Arg->getType().getAsString() << "'";
|
||||
|
||||
SourceRange R = Arg->getSourceRange();
|
||||
PathDiagnosticLocation CELoc =
|
||||
PathDiagnosticLocation::createBegin(CE, BR.getSourceManager(), AC);
|
||||
BR.EmitBasicReport(AC->getDecl(),
|
||||
OsName.str(), categories::CoreFoundationObjectiveC,
|
||||
Os.str(), CELoc, &R, 1);
|
||||
Os.str(), CELoc, Arg->getSourceRange());
|
||||
}
|
||||
|
||||
// Recurse and check children.
|
||||
|
|
|
@ -191,7 +191,7 @@ void WalkAST::ReportVirtualCall(const CallExpr *CE, bool isPure) {
|
|||
"Call pure virtual function during construction or "
|
||||
"Destruction",
|
||||
"Cplusplus",
|
||||
os.str(), CELoc, &R, 1);
|
||||
os.str(), CELoc, R);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
|
@ -201,7 +201,7 @@ void WalkAST::ReportVirtualCall(const CallExpr *CE, bool isPure) {
|
|||
"Call virtual function during construction or "
|
||||
"Destruction",
|
||||
"Cplusplus",
|
||||
os.str(), CELoc, &R, 1);
|
||||
os.str(), CELoc, R);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3428,13 +3428,15 @@ void BugReporter::EmitBasicReport(const Decl *DeclWithIssue,
|
|||
StringRef name,
|
||||
StringRef category,
|
||||
StringRef str, PathDiagnosticLocation Loc,
|
||||
SourceRange* RBeg, unsigned NumRanges) {
|
||||
ArrayRef<SourceRange> Ranges) {
|
||||
|
||||
// 'BT' is owned by BugReporter.
|
||||
BugType *BT = getBugTypeForName(name, category);
|
||||
BugReport *R = new BugReport(*BT, str, Loc);
|
||||
R->setDeclWithIssue(DeclWithIssue);
|
||||
for ( ; NumRanges > 0 ; --NumRanges, ++RBeg) R->addRange(*RBeg);
|
||||
for (ArrayRef<SourceRange>::iterator I = Ranges.begin(), E = Ranges.end();
|
||||
I != E; ++I)
|
||||
R->addRange(*I);
|
||||
emitReport(R);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue