#include "clang/Basic/SourceLocation.h"
#include "clang/Lex/Preprocessor.h"
#include "clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitors.h"
-#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
#include "clang/StaticAnalyzer/Core/CheckerManager.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
SmallVector<FixItHint, 4> Fixits;
BugReport(Kind kind, const BugType &bt, StringRef desc)
- : BugReport(kind, bt, "", desc) {}
+ : K(kind), BT(bt), Description(desc) {}
BugReport(Kind K, const BugType &BT, StringRef ShortDescription,
StringRef Description)
public:
PathSensitiveBugReport(const BugType &bt, StringRef desc,
const ExplodedNode *errorNode)
- : PathSensitiveBugReport(bt, desc, desc, errorNode) {}
+ : BugReport(Kind::PathSensitive, bt, desc), ErrorNode(errorNode),
+ ErrorNodeRange(getStmt() ? getStmt()->getSourceRange()
+ : SourceRange()) {}
PathSensitiveBugReport(const BugType &bt, StringRef shortDesc, StringRef desc,
const ExplodedNode *errorNode)
- : PathSensitiveBugReport(bt, shortDesc, desc, errorNode,
- /*LocationToUnique*/ {},
- /*DeclToUnique*/ nullptr) {}
+ : BugReport(Kind::PathSensitive, bt, shortDesc, desc),
+ ErrorNode(errorNode),
+ ErrorNodeRange(getStmt() ? getStmt()->getSourceRange()
+ : SourceRange()) {}
/// Create a PathSensitiveBugReport with a custom uniqueing location.
///
const ExplodedNode *errorNode,
PathDiagnosticLocation LocationToUnique,
const Decl *DeclToUnique)
- : PathSensitiveBugReport(bt, desc, desc, errorNode, LocationToUnique,
- DeclToUnique) {}
-
- PathSensitiveBugReport(const BugType &bt, StringRef shortDesc, StringRef desc,
- const ExplodedNode *errorNode,
- PathDiagnosticLocation LocationToUnique,
- const Decl *DeclToUnique);
+ : BugReport(Kind::PathSensitive, bt, desc), ErrorNode(errorNode),
+ ErrorNodeRange(getStmt() ? getStmt()->getSourceRange() : SourceRange()),
+ UniqueingLocation(LocationToUnique), UniqueingDecl(DeclToUnique) {
+ assert(errorNode);
+ }
static bool classof(const BugReport *R) {
return R->getKind() == Kind::PathSensitive;
"Invalid development status!");
}
- LLVM_DUMP_METHOD void dump() const;
+ LLVM_DUMP_METHOD void dump() const { dumpToStream(llvm::errs()); }
LLVM_DUMP_METHOD void dumpToStream(llvm::raw_ostream &Out) const;
};
// Used for lower_bound.
explicit CheckerInfo(StringRef FullName) : FullName(FullName) {}
- LLVM_DUMP_METHOD void dump() const;
+ LLVM_DUMP_METHOD void dump() const { dumpToStream(llvm::errs()); }
LLVM_DUMP_METHOD void dumpToStream(llvm::raw_ostream &Out) const;
};
explicit PackageInfo(StringRef FullName) : FullName(FullName) {}
- LLVM_DUMP_METHOD void dump() const;
+ LLVM_DUMP_METHOD void dump() const { dumpToStream(llvm::errs()); }
LLVM_DUMP_METHOD void dumpToStream(llvm::raw_ostream &Out) const;
};
/// For example, it'll return the checkers for the core package, if
/// \p CmdLineArg is "core".
CheckerInfoListRange getMutableCheckersForCmdLineArg(StringRef CmdLineArg);
- /// Used for couting how many checkers belong to a certain package in the
- /// \c Checkers field. For convenience purposes.
- llvm::StringMap<size_t> PackageSizes;
-
- void resolveCheckerAndPackageOptions();
- template <bool IsWeak> void resolveDependencies();
- DiagnosticsEngine &Diags;
- AnalyzerOptions &AnOpts;
-
-public:
CheckerInfoList Checkers;
PackageInfoList Packages;
+ /// Used for couting how many checkers belong to a certain package in the
+ /// \c Checkers field. For convenience purposes.
+ llvm::StringMap<size_t> PackageSizes;
/// Contains all (Dependendent checker, Dependency) pairs. We need this, as
/// we'll resolve dependencies after all checkers were added first.
llvm::SmallVector<std::pair<StringRef, StringRef>, 0> Dependencies;
llvm::SmallVector<std::pair<StringRef, StringRef>, 0> WeakDependencies;
+ template <bool IsWeak> void resolveDependencies();
+
/// Contains all (FullName, CmdLineOption) pairs. Similarly to dependencies,
/// we only modify the actual CheckerInfo and PackageInfo objects once all
/// of them have been added.
llvm::SmallVector<std::pair<StringRef, CmdLineOption>, 0> PackageOptions;
llvm::SmallVector<std::pair<StringRef, CmdLineOption>, 0> CheckerOptions;
+
+ void resolveCheckerAndPackageOptions();
+
+ DiagnosticsEngine &Diags;
+ AnalyzerOptions &AnOpts;
CheckerInfoSet EnabledCheckers;
};
#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h"
-#include "clang/StaticAnalyzer/Frontend/CheckerRegistry.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
// Methods for BugReport and subclasses.
//===----------------------------------------------------------------------===//
-static bool isDependency(const CheckerRegistry &Registry,
- StringRef CheckerName) {
- for (const std::pair<StringRef, StringRef> &Pair : Registry.Dependencies) {
- if (Pair.second == CheckerName)
- return true;
- }
- return false;
-}
-
-PathSensitiveBugReport::PathSensitiveBugReport(
- const BugType &bt, StringRef shortDesc, StringRef desc,
- const ExplodedNode *errorNode, PathDiagnosticLocation LocationToUnique,
- const Decl *DeclToUnique)
- : BugReport(Kind::PathSensitive, bt, shortDesc, desc), ErrorNode(errorNode),
- ErrorNodeRange(getStmt() ? getStmt()->getSourceRange() : SourceRange()),
- UniqueingLocation(LocationToUnique), UniqueingDecl(DeclToUnique) {
- assert(!isDependency(ErrorNode->getState()
- ->getAnalysisManager()
- .getCheckerManager()
- ->getCheckerRegistry(),
- bt.getCheckerName()) &&
- "Some checkers depend on this one! We don't allow dependency "
- "checkers to emit warnings, because checkers should depend on "
- "*modeling*, not *diagnostics*.");
-}
-
void PathSensitiveBugReport::addVisitor(
std::unique_ptr<BugReporterVisitor> visitor) {
if (!visitor)
return;
case bugreporter::TrackingKind::Condition:
return;
- }
+ }
- llvm_unreachable(
- "BugReport::markInteresting currently can only handle 2 different "
- "tracking kinds! Please define what tracking kind should this entitiy"
- "have, if it was already marked as interesting with a different kind!");
+ llvm_unreachable(
+ "BugReport::markInteresting currently can only handle 2 different "
+ "tracking kinds! Please define what tracking kind should this entitiy"
+ "have, if it was already marked as interesting with a different kind!");
}
void PathSensitiveBugReport::markInteresting(SymbolRef sym,
// Methods of CmdLineOption, PackageInfo and CheckerInfo.
//===----------------------------------------------------------------------===//
-LLVM_DUMP_METHOD void CheckerRegistry::CmdLineOption::dump() const {
- dumpToStream(llvm::errs());
-}
-
LLVM_DUMP_METHOD void
CheckerRegistry::CmdLineOption::dumpToStream(llvm::raw_ostream &Out) const {
// The description can be just checked in Checkers.inc, the point here is to
llvm_unreachable("Unhandled CheckerRegistry::StateFromCmdLine enum");
}
-LLVM_DUMP_METHOD void CheckerRegistry::CheckerInfo::dump() const {
- dumpToStream(llvm::errs());
-}
-
LLVM_DUMP_METHOD void
CheckerRegistry::CheckerInfo::dumpToStream(llvm::raw_ostream &Out) const {
// The description can be just checked in Checkers.inc, the point here is to
}
}
-LLVM_DUMP_METHOD void CheckerRegistry::PackageInfo::dump() const {
- dumpToStream(llvm::errs());
-}
-
LLVM_DUMP_METHOD void
CheckerRegistry::PackageInfo::dumpToStream(llvm::raw_ostream &Out) const {
Out << FullName << "\n";