#include "clang/Analysis/PathDiagnostic.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclBase.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/Expr.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/OperationKinds.h"
#include "clang/AST/ParentMap.h"
#include "clang/AST/PrettyPrinter.h"
#include "clang/AST/Stmt.h"
#include "clang/AST/Type.h"
#include "clang/Analysis/AnalysisDeclContext.h"
#include "clang/Analysis/CFG.h"
#include "clang/Analysis/ProgramPoint.h"
#include "clang/Basic/FileManager.h"
#include "clang/Basic/LLVM.h"
#include "clang/Basic/SourceLocation.h"
#include "clang/Basic/SourceManager.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
#include <cassert>
#include <cstring>
#include <memory>
#include <optional>
#include <utility>
#include <vector>
usingnamespaceclang;
usingnamespaceento;
static StringRef StripTrailingDots(StringRef s) { … }
PathDiagnosticPiece::PathDiagnosticPiece(StringRef s,
Kind k, DisplayHint hint)
: … { … }
PathDiagnosticPiece::PathDiagnosticPiece(Kind k, DisplayHint hint)
: … { … }
PathDiagnosticPiece::~PathDiagnosticPiece() = default;
PathDiagnosticEventPiece::~PathDiagnosticEventPiece() = default;
PathDiagnosticCallPiece::~PathDiagnosticCallPiece() = default;
PathDiagnosticControlFlowPiece::~PathDiagnosticControlFlowPiece() = default;
PathDiagnosticMacroPiece::~PathDiagnosticMacroPiece() = default;
PathDiagnosticNotePiece::~PathDiagnosticNotePiece() = default;
PathDiagnosticPopUpPiece::~PathDiagnosticPopUpPiece() = default;
void PathPieces::flattenTo(PathPieces &Primary, PathPieces &Current,
bool ShouldFlattenMacros) const { … }
PathDiagnostic::~PathDiagnostic() = default;
PathDiagnostic::PathDiagnostic(
StringRef CheckerName, const Decl *declWithIssue, StringRef bugtype,
StringRef verboseDesc, StringRef shortDesc, StringRef category,
PathDiagnosticLocation LocationToUnique, const Decl *DeclToUnique,
const Decl *AnalysisEntryPoint,
std::unique_ptr<FilesToLineNumsMap> ExecutedLines)
: … { … }
void PathDiagnosticConsumer::anchor() { … }
PathDiagnosticConsumer::~PathDiagnosticConsumer() { … }
void PathDiagnosticConsumer::HandlePathDiagnostic(
std::unique_ptr<PathDiagnostic> D) { … }
static std::optional<bool> comparePath(const PathPieces &X,
const PathPieces &Y);
static std::optional<bool>
compareControlFlow(const PathDiagnosticControlFlowPiece &X,
const PathDiagnosticControlFlowPiece &Y) { … }
static std::optional<bool> compareMacro(const PathDiagnosticMacroPiece &X,
const PathDiagnosticMacroPiece &Y) { … }
static std::optional<bool> compareCall(const PathDiagnosticCallPiece &X,
const PathDiagnosticCallPiece &Y) { … }
static std::optional<bool> comparePiece(const PathDiagnosticPiece &X,
const PathDiagnosticPiece &Y) { … }
static std::optional<bool> comparePath(const PathPieces &X,
const PathPieces &Y) { … }
static bool compareCrossTUSourceLocs(FullSourceLoc XL, FullSourceLoc YL) { … }
static bool compare(const PathDiagnostic &X, const PathDiagnostic &Y) { … }
void PathDiagnosticConsumer::FlushDiagnostics(
PathDiagnosticConsumer::FilesMade *Files) { … }
PathDiagnosticConsumer::FilesMade::~FilesMade() { … }
void PathDiagnosticConsumer::FilesMade::addDiagnostic(const PathDiagnostic &PD,
StringRef ConsumerName,
StringRef FileName) { … }
PathDiagnosticConsumer::PDFileEntry::ConsumerFiles *
PathDiagnosticConsumer::FilesMade::getFiles(const PathDiagnostic &PD) { … }
SourceLocation PathDiagnosticLocation::getValidSourceLocation(
const Stmt *S, LocationOrAnalysisDeclContext LAC, bool UseEndOfStatement) { … }
static PathDiagnosticLocation
getLocationForCaller(const StackFrameContext *SFC,
const LocationContext *CallerCtx,
const SourceManager &SM) { … }
PathDiagnosticLocation
PathDiagnosticLocation::createBegin(const Decl *D,
const SourceManager &SM) { … }
PathDiagnosticLocation
PathDiagnosticLocation::createBegin(const Stmt *S,
const SourceManager &SM,
LocationOrAnalysisDeclContext LAC) { … }
PathDiagnosticLocation
PathDiagnosticLocation::createEnd(const Stmt *S,
const SourceManager &SM,
LocationOrAnalysisDeclContext LAC) { … }
PathDiagnosticLocation
PathDiagnosticLocation::createOperatorLoc(const BinaryOperator *BO,
const SourceManager &SM) { … }
PathDiagnosticLocation
PathDiagnosticLocation::createConditionalColonLoc(
const ConditionalOperator *CO,
const SourceManager &SM) { … }
PathDiagnosticLocation
PathDiagnosticLocation::createMemberLoc(const MemberExpr *ME,
const SourceManager &SM) { … }
PathDiagnosticLocation
PathDiagnosticLocation::createBeginBrace(const CompoundStmt *CS,
const SourceManager &SM) { … }
PathDiagnosticLocation
PathDiagnosticLocation::createEndBrace(const CompoundStmt *CS,
const SourceManager &SM) { … }
PathDiagnosticLocation
PathDiagnosticLocation::createDeclBegin(const LocationContext *LC,
const SourceManager &SM) { … }
PathDiagnosticLocation
PathDiagnosticLocation::createDeclEnd(const LocationContext *LC,
const SourceManager &SM) { … }
PathDiagnosticLocation
PathDiagnosticLocation::create(const ProgramPoint& P,
const SourceManager &SMng) { … }
PathDiagnosticLocation PathDiagnosticLocation::createSingleLocation(
const PathDiagnosticLocation &PDL) { … }
FullSourceLoc
PathDiagnosticLocation::genLocation(SourceLocation L,
LocationOrAnalysisDeclContext LAC) const { … }
PathDiagnosticRange
PathDiagnosticLocation::genRange(LocationOrAnalysisDeclContext LAC) const { … }
void PathDiagnosticLocation::flatten() { … }
std::shared_ptr<PathDiagnosticCallPiece>
PathDiagnosticCallPiece::construct(const CallExitEnd &CE,
const SourceManager &SM) { … }
PathDiagnosticCallPiece *
PathDiagnosticCallPiece::construct(PathPieces &path,
const Decl *caller) { … }
void PathDiagnosticCallPiece::setCallee(const CallEnter &CE,
const SourceManager &SM) { … }
static void describeTemplateParameters(raw_ostream &Out,
const ArrayRef<TemplateArgument> TAList,
const LangOptions &LO,
StringRef Prefix = StringRef(),
StringRef Postfix = StringRef());
static void describeTemplateParameter(raw_ostream &Out,
const TemplateArgument &TArg,
const LangOptions &LO) { … }
static void describeTemplateParameters(raw_ostream &Out,
const ArrayRef<TemplateArgument> TAList,
const LangOptions &LO,
StringRef Prefix, StringRef Postfix) { … }
static void describeClass(raw_ostream &Out, const CXXRecordDecl *D,
StringRef Prefix = StringRef()) { … }
static bool describeCodeDecl(raw_ostream &Out, const Decl *D,
bool ExtendedDescription,
StringRef Prefix = StringRef()) { … }
std::shared_ptr<PathDiagnosticEventPiece>
PathDiagnosticCallPiece::getCallEnterEvent() const { … }
std::shared_ptr<PathDiagnosticEventPiece>
PathDiagnosticCallPiece::getCallEnterWithinCallerEvent() const { … }
std::shared_ptr<PathDiagnosticEventPiece>
PathDiagnosticCallPiece::getCallExitEvent() const { … }
static void compute_path_size(const PathPieces &pieces, unsigned &size) { … }
unsigned PathDiagnostic::full_size() { … }
void PathDiagnosticLocation::Profile(llvm::FoldingSetNodeID &ID) const { … }
void PathDiagnosticPiece::Profile(llvm::FoldingSetNodeID &ID) const { … }
void PathDiagnosticCallPiece::Profile(llvm::FoldingSetNodeID &ID) const { … }
void PathDiagnosticSpotPiece::Profile(llvm::FoldingSetNodeID &ID) const { … }
void PathDiagnosticControlFlowPiece::Profile(llvm::FoldingSetNodeID &ID) const { … }
void PathDiagnosticMacroPiece::Profile(llvm::FoldingSetNodeID &ID) const { … }
void PathDiagnosticNotePiece::Profile(llvm::FoldingSetNodeID &ID) const { … }
void PathDiagnosticPopUpPiece::Profile(llvm::FoldingSetNodeID &ID) const { … }
void PathDiagnostic::Profile(llvm::FoldingSetNodeID &ID) const { … }
void PathDiagnostic::FullProfile(llvm::FoldingSetNodeID &ID) const { … }
LLVM_DUMP_METHOD void PathPieces::dump() const { … }
LLVM_DUMP_METHOD void PathDiagnosticCallPiece::dump() const { … }
LLVM_DUMP_METHOD void PathDiagnosticEventPiece::dump() const { … }
LLVM_DUMP_METHOD void PathDiagnosticControlFlowPiece::dump() const { … }
LLVM_DUMP_METHOD void PathDiagnosticMacroPiece::dump() const { … }
LLVM_DUMP_METHOD void PathDiagnosticNotePiece::dump() const { … }
LLVM_DUMP_METHOD void PathDiagnosticPopUpPiece::dump() const { … }
LLVM_DUMP_METHOD void PathDiagnosticLocation::dump() const { … }