clang  14.0.0git
Macros | Typedefs | Functions | Variables
BugReporter.cpp File Reference
#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclBase.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/Expr.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ParentMap.h"
#include "clang/AST/Stmt.h"
#include "clang/AST/StmtCXX.h"
#include "clang/AST/StmtObjC.h"
#include "clang/Analysis/AnalysisDeclContext.h"
#include "clang/Analysis/CFG.h"
#include "clang/Analysis/CFGStmtMap.h"
#include "clang/Analysis/PathDiagnostic.h"
#include "clang/Analysis/ProgramPoint.h"
#include "clang/Basic/LLVM.h"
#include "clang/Basic/SourceLocation.h"
#include "clang/Basic/SourceManager.h"
#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
#include "clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitors.h"
#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
#include "clang/StaticAnalyzer/Core/Checker.h"
#include "clang/StaticAnalyzer/Core/CheckerManager.h"
#include "clang/StaticAnalyzer/Core/CheckerRegistryData.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/SMTConv.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/None.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/iterator_range.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <iterator>
#include <memory>
#include <queue>
#include <string>
#include <tuple>
#include <utility>
#include <vector>

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "BugReporter"
 

Typedefs

using OptimizedCallsSet = llvm::DenseSet< const PathDiagnosticCallPiece * >
 

Functions

 STATISTIC (MaxBugClassSize, "The maximum number of bug reports in the same equivalence class")
 
 STATISTIC (MaxValidBugClassSize, "The maximum number of bug reports in the same equivalence class " "where at least one report is valid (not suppressed)")
 
static PathDiagnosticEventPiece * eventsDescribeSameCondition (PathDiagnosticEventPiece *X, PathDiagnosticEventPiece *Y)
 
static void removeRedundantMsgs (PathPieces &path)
 An optimization pass over PathPieces that removes redundant diagnostics generated by both ConditionBRVisitor and TrackConstraintBRVisitor. More...
 
static bool removeUnneededCalls (const PathDiagnosticConstruct &C, PathPieces &pieces, const PathSensitiveBugReport *R, bool IsInteresting=false)
 Recursively scan through a path and prune out calls and macros pieces that aren't needed. More...
 
static void removePopUpNotes (PathPieces &Path)
 Same logic as above to remove extra pieces. More...
 
static bool hasImplicitBody (const Decl *D)
 Returns true if the given decl has been implicitly given a body, either by the analyzer or by the compiler proper. More...
 
static void adjustCallLocations (PathPieces &Pieces, PathDiagnosticLocation *LastCallLocation=nullptr)
 Recursively scan through a path and make sure that all call pieces have valid locations. More...
 
static void removeEdgesToDefaultInitializers (PathPieces &Pieces)
 Remove edges in and out of C++ default initializer expressions. More...
 
static void removePiecesWithInvalidLocations (PathPieces &Pieces)
 Remove all pieces with invalid locations as these cannot be serialized. More...
 
static const StmtgetEnclosingParent (const Stmt *S, const ParentMap &PM)
 
static PathDiagnosticLocation getEnclosingStmtLocation (const Stmt *S, const LocationContext *LC, bool allowNestedContexts=false)
 
static void CompactMacroExpandedPieces (PathPieces &path, const SourceManager &SM)
 CompactMacroExpandedPieces - This function postprocesses a PathDiagnostic object and collapses PathDiagosticPieces that are expanded by macros. More...
 
static bool isLoop (const Stmt *Term)
 
static bool isJumpToFalseBranch (const BlockEdge *BE)
 
static bool isContainedByStmt (const ParentMap &PM, const Stmt *S, const Stmt *SubS)
 
static const StmtgetStmtBeforeCond (const ParentMap &PM, const Stmt *Term, const ExplodedNode *N)
 
static bool isInLoopBody (const ParentMap &PM, const Stmt *S, const Stmt *Term)
 
static void addEdgeToPath (PathPieces &path, PathDiagnosticLocation &PrevLoc, PathDiagnosticLocation NewLoc)
 Adds a sanitized control-flow diagnostic edge to a path. More...
 
static const StmtgetTerminatorCondition (const CFGBlock *B)
 A customized wrapper for CFGBlock::getTerminatorCondition() which returns the element for ObjCForCollectionStmts. More...
 
static std::unique_ptr< FilesToLineNumsMap > findExecutedLines (const SourceManager &SM, const ExplodedNode *N)
 
static std::unique_ptr< PathDiagnostic > generateDiagnosticForBasicReport (const BasicBugReport *R)
 
static std::unique_ptr< PathDiagnostic > generateEmptyDiagnosticForReport (const PathSensitiveBugReport *R, const SourceManager &SM)
 
static const StmtgetStmtParent (const Stmt *S, const ParentMap &PM)
 
static bool isConditionForTerminator (const Stmt *S, const Stmt *Cond)
 
static bool isIncrementOrInitInForLoop (const Stmt *S, const Stmt *FL)
 
static void addContextEdges (PathPieces &pieces, const LocationContext *LC)
 Adds synthetic edges from top-level statements to their subexpressions. More...
 
static void simplifySimpleBranches (PathPieces &pieces)
 Move edges from a branch condition to a branch target when the condition is simple. More...
 
static Optional< size_tgetLengthOnSingleLine (const SourceManager &SM, SourceRange Range)
 Returns the number of bytes in the given (character-based) SourceRange. More...
 
static Optional< size_tgetLengthOnSingleLine (const SourceManager &SM, const Stmt *S)
 
static void removeContextCycles (PathPieces &Path, const SourceManager &SM)
 Eliminate two-edge cycles created by addContextEdges(). More...
 
static bool lexicalContains (const ParentMap &PM, const Stmt *X, const Stmt *Y)
 Return true if X is contained by Y. More...
 
static void removePunyEdges (PathPieces &path, const SourceManager &SM, const ParentMap &PM)
 
static void removeIdenticalEvents (PathPieces &path)
 
static bool optimizeEdges (const PathDiagnosticConstruct &C, PathPieces &path, OptimizedCallsSet &OCS)
 
static void dropFunctionEntryEdge (const PathDiagnosticConstruct &C, PathPieces &Path)
 Drop the very first edge in a path, which should be a function entry edge. More...
 
static void updateExecutedLinesWithDiagnosticPieces (PathDiagnostic &PD)
 Populate executes lines with lines containing at least one diagnostics. More...
 
static LLVM_ATTRIBUTE_USED bool isDependency (const CheckerRegistryData &Registry, StringRef CheckerName)
 
static LLVM_ATTRIBUTE_USED bool isHidden (const CheckerRegistryData &Registry, StringRef CheckerName)
 
template<class T >
static void insertToInterestingnessMap (llvm::DenseMap< T, bugreporter::TrackingKind > &InterestingnessMap, T Val, bugreporter::TrackingKind TKind)
 
static std::unique_ptr< VisitorsDiagnosticsTy > generateVisitorsDiagnostics (PathSensitiveBugReport *R, const ExplodedNode *ErrorNode, BugReporterContext &BRC)
 Generate notes from all visitors. More...
 
static void populateExecutedLinesWithFunctionSignature (const Decl *Signature, const SourceManager &SM, FilesToLineNumsMap &ExecutedLines)
 Insert all lines participating in the function signature Signature into ExecutedLines. More...
 
static void populateExecutedLinesWithStmt (const Stmt *S, const SourceManager &SM, FilesToLineNumsMap &ExecutedLines)
 
static PathDiagnosticCallPiece * getFirstStackedCallToHeaderFile (PathDiagnosticCallPiece *CP, const SourceManager &SMgr)
 
static void resetDiagnosticLocationToMainFile (PathDiagnostic &PD)
 

Variables

constexpr llvm::StringLiteral StrEnteringLoop = "Entering loop body"
 
constexpr llvm::StringLiteral StrLoopBodyZero = "Loop body executed 0 times"
 
constexpr llvm::StringLiteral StrLoopRangeEmpty
 
constexpr llvm::StringLiteral StrLoopCollectionEmpty
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "BugReporter"

Definition at line 79 of file BugReporter.cpp.

Typedef Documentation

◆ OptimizedCallsSet

using OptimizedCallsSet = llvm::DenseSet<const PathDiagnosticCallPiece *>

Definition at line 1415 of file BugReporter.cpp.

Function Documentation

◆ addContextEdges()

static void addContextEdges ( PathPieces &  pieces,
const LocationContext LC 
)
static

Adds synthetic edges from top-level statements to their subexpressions.

This avoids a "swoosh" effect, where an edge from a top-level statement A points to a sub-expression B.1 that's not at the start of B. In these cases, we'd like to see an edge from A to B, then another one from B to B.1.

Definition at line 1422 of file BugReporter.cpp.

References getEnclosingStmtLocation(), clang::LocationContext::getParentMap(), getStmtParent(), and P.

◆ addEdgeToPath()

static void addEdgeToPath ( PathPieces &  path,
PathDiagnosticLocation &  PrevLoc,
PathDiagnosticLocation  NewLoc 
)
static

Adds a sanitized control-flow diagnostic edge to a path.

Definition at line 1081 of file BugReporter.cpp.

References clang::SourceLocation::isInvalid().

◆ adjustCallLocations()

static void adjustCallLocations ( PathPieces &  Pieces,
PathDiagnosticLocation *  LastCallLocation = nullptr 
)
static

Recursively scan through a path and make sure that all call pieces have valid locations.

Definition at line 496 of file BugReporter.cpp.

References hasImplicitBody().

◆ CompactMacroExpandedPieces()

static void CompactMacroExpandedPieces ( PathPieces &  path,
const SourceManager SM 
)
static

CompactMacroExpandedPieces - This function postprocesses a PathDiagnostic object and collapses PathDiagosticPieces that are expanded by macros.

Definition at line 2674 of file BugReporter.cpp.

References clang::ento::PathDiagnosticLocation::createSingleLocation(), clang::SourceLocation::isFileID(), clang::SourceLocation::isMacroID(), and SM.

◆ dropFunctionEntryEdge()

static void dropFunctionEntryEdge ( const PathDiagnosticConstruct &  C,
PathPieces &  Path 
)
static

Drop the very first edge in a path, which should be a function entry edge.

If the first edge is not a function entry edge (say, because the first statement had an invalid source location), this function does nothing.

Definition at line 1945 of file BugReporter.cpp.

References clang::ento::PathDiagnosticLocation::createBegin().

◆ eventsDescribeSameCondition()

static PathDiagnosticEventPiece* eventsDescribeSameCondition ( PathDiagnosticEventPiece *  X,
PathDiagnosticEventPiece *  Y 
)
static

◆ findExecutedLines()

static std::unique_ptr< FilesToLineNumsMap > findExecutedLines ( const SourceManager SM,
const ExplodedNode *  N 
)
static
Returns
all executed lines including function signatures on the path starting from N.

Definition at line 3166 of file BugReporter.cpp.

References populateExecutedLinesWithFunctionSignature(), and SM.

Referenced by generateEmptyDiagnosticForReport().

◆ generateDiagnosticForBasicReport()

static std::unique_ptr<PathDiagnostic> generateDiagnosticForBasicReport ( const BasicBugReport *  R)
static

◆ generateEmptyDiagnosticForReport()

static std::unique_ptr<PathDiagnostic> generateEmptyDiagnosticForReport ( const PathSensitiveBugReport *  R,
const SourceManager SM 
)
static

Definition at line 1336 of file BugReporter.cpp.

References findExecutedLines(), and SM.

◆ generateVisitorsDiagnostics()

static std::unique_ptr<VisitorsDiagnosticsTy> generateVisitorsDiagnostics ( PathSensitiveBugReport *  R,
const ExplodedNode *  ErrorNode,
BugReporterContext &  BRC 
)
static

Generate notes from all visitors.

Notes associated with ErrorNode are generated using getEndPath, and the rest are generated with VisitNode.

Definition at line 2769 of file BugReporter.cpp.

References P, and V.

◆ getEnclosingParent()

static const Stmt* getEnclosingParent ( const Stmt S,
const ParentMap PM 
)
static

Definition at line 619 of file BugReporter.cpp.

◆ getEnclosingStmtLocation()

static PathDiagnosticLocation getEnclosingStmtLocation ( const Stmt S,
const LocationContext LC,
bool  allowNestedContexts = false 
)
static

Definition at line 642 of file BugReporter.cpp.

Referenced by addContextEdges().

◆ getFirstStackedCallToHeaderFile()

static PathDiagnosticCallPiece* getFirstStackedCallToHeaderFile ( PathDiagnosticCallPiece *  CP,
const SourceManager SMgr 
)
static

◆ getLengthOnSingleLine() [1/2]

static Optional<size_t> getLengthOnSingleLine ( const SourceManager SM,
const Stmt S 
)
static
See also
getLengthOnSingleLine(SourceManager, SourceRange)

Definition at line 1601 of file BugReporter.cpp.

◆ getLengthOnSingleLine() [2/2]

static Optional<size_t> getLengthOnSingleLine ( const SourceManager SM,
SourceRange  Range 
)
static

Returns the number of bytes in the given (character-based) SourceRange.

If the locations in the range are not on the same line, returns None.

Note that this does not do a precise user-visible character or column count.

Definition at line 1572 of file BugReporter.cpp.

References clang::SourceRange::getBegin(), clang::SourceRange::getEnd(), and SM.

Referenced by optimizeEdges(), removeContextCycles(), and removePunyEdges().

◆ getStmtBeforeCond()

static const Stmt* getStmtBeforeCond ( const ParentMap PM,
const Stmt Term,
const ExplodedNode *  N 
)
static

Definition at line 1033 of file BugReporter.cpp.

◆ getStmtParent()

static const Stmt* getStmtParent ( const Stmt S,
const ParentMap PM 
)
static

Definition at line 1346 of file BugReporter.cpp.

Referenced by addContextEdges(), and optimizeEdges().

◆ getTerminatorCondition()

static const Stmt* getTerminatorCondition ( const CFGBlock B)
static

A customized wrapper for CFGBlock::getTerminatorCondition() which returns the element for ObjCForCollectionStmts.

Definition at line 1108 of file BugReporter.cpp.

◆ hasImplicitBody()

static bool hasImplicitBody ( const Decl D)
static

Returns true if the given decl has been implicitly given a body, either by the analyzer or by the compiler proper.

Definition at line 488 of file BugReporter.cpp.

References clang::Decl::hasBody(), and clang::Decl::isImplicit().

Referenced by adjustCallLocations().

◆ insertToInterestingnessMap()

template<class T >
static void insertToInterestingnessMap ( llvm::DenseMap< T, bugreporter::TrackingKind > &  InterestingnessMap,
Val,
bugreporter::TrackingKind  TKind 
)
static

◆ isConditionForTerminator()

static bool isConditionForTerminator ( const Stmt S,
const Stmt Cond 
)
static

Definition at line 1365 of file BugReporter.cpp.

Referenced by optimizeEdges(), and removePunyEdges().

◆ isContainedByStmt()

static bool isContainedByStmt ( const ParentMap PM,
const Stmt S,
const Stmt SubS 
)
static

Definition at line 1023 of file BugReporter.cpp.

◆ isDependency()

static LLVM_ATTRIBUTE_USED bool isDependency ( const CheckerRegistryData &  Registry,
StringRef  CheckerName 
)
static

◆ isHidden()

static LLVM_ATTRIBUTE_USED bool isHidden ( const CheckerRegistryData &  Registry,
StringRef  CheckerName 
)
static

◆ isIncrementOrInitInForLoop()

static bool isIncrementOrInitInForLoop ( const Stmt S,
const Stmt FL 
)
static

Definition at line 1406 of file BugReporter.cpp.

Referenced by optimizeEdges().

◆ isInLoopBody()

static bool isInLoopBody ( const ParentMap PM,
const Stmt S,
const Stmt Term 
)
static

Definition at line 1047 of file BugReporter.cpp.

◆ isJumpToFalseBranch()

static bool isJumpToFalseBranch ( const BlockEdge BE)
static

◆ isLoop()

static bool isLoop ( const Stmt Term)
static

Definition at line 1004 of file BugReporter.cpp.

References clang::Stmt::getStmtClass().

◆ lexicalContains()

static bool lexicalContains ( const ParentMap PM,
const Stmt X,
const Stmt Y 
)
static

Return true if X is contained by Y.

Definition at line 1677 of file BugReporter.cpp.

References clang::ParentMap::getParent(), and clang::tooling::X().

Referenced by optimizeEdges().

◆ optimizeEdges()

static bool optimizeEdges ( const PathDiagnosticConstruct &  C,
PathPieces &  path,
OptimizedCallsSet OCS 
)
static

◆ populateExecutedLinesWithFunctionSignature()

static void populateExecutedLinesWithFunctionSignature ( const Decl Signature,
const SourceManager SM,
FilesToLineNumsMap &  ExecutedLines 
)
static

Insert all lines participating in the function signature Signature into ExecutedLines.

Definition at line 3126 of file BugReporter.cpp.

References End, clang::SourceRange::getBegin(), clang::Decl::getBody(), clang::SourceRange::getEnd(), clang::Stmt::getSourceRange(), clang::SourceLocation::isValid(), Line, and SM.

Referenced by findExecutedLines().

◆ populateExecutedLinesWithStmt()

static void populateExecutedLinesWithStmt ( const Stmt S,
const SourceManager SM,
FilesToLineNumsMap &  ExecutedLines 
)
static

Definition at line 3151 of file BugReporter.cpp.

◆ removeContextCycles()

static void removeContextCycles ( PathPieces &  Path,
const SourceManager SM 
)
static

Eliminate two-edge cycles created by addContextEdges().

Once all the context edges are in place, there are plenty of cases where there's a single edge from a top-level statement to a subexpression, followed by a single path note, and then a reverse edge to get back out to the top level. If the statement is simple enough, the subexpression edges just add noise and make it harder to understand what's going on.

This function only removes edges in pairs, because removing only one edge might leave other edges dangling.

This will not remove edges in more complicated situations:

  • if there is more than one "hop" leading to or from a subexpression.
  • if there is an inlined call between the edges instead of a single event.
  • if the whole statement is large enough that having subexpression arrows might be helpful.

Definition at line 1622 of file BugReporter.cpp.

References getLengthOnSingleLine(), and SM.

◆ removeEdgesToDefaultInitializers()

static void removeEdgesToDefaultInitializers ( PathPieces &  Pieces)
static

Remove edges in and out of C++ default initializer expressions.

These are for fields that have in-class initializers, as opposed to being initialized explicitly in a constructor or braced list.

Definition at line 529 of file BugReporter.cpp.

References End.

◆ removeIdenticalEvents()

static void removeIdenticalEvents ( PathPieces &  path)
static

Definition at line 1740 of file BugReporter.cpp.

◆ removePiecesWithInvalidLocations()

static void removePiecesWithInvalidLocations ( PathPieces &  Pieces)
static

Remove all pieces with invalid locations as these cannot be serialized.

We might have pieces with invalid locations as a result of inlining Body Farm generated functions.

Definition at line 563 of file BugReporter.cpp.

◆ removePopUpNotes()

static void removePopUpNotes ( PathPieces &  Path)
static

Same logic as above to remove extra pieces.

Definition at line 477 of file BugReporter.cpp.

◆ removePunyEdges()

static void removePunyEdges ( PathPieces &  path,
const SourceManager SM,
const ParentMap PM 
)
static

◆ removeRedundantMsgs()

static void removeRedundantMsgs ( PathPieces &  path)
static

An optimization pass over PathPieces that removes redundant diagnostics generated by both ConditionBRVisitor and TrackConstraintBRVisitor.

Both BugReporterVisitors use different methods to generate diagnostics, with one capable of emitting diagnostics in some cases but not in others. This can lead to redundant diagnostic pieces at the same point in a path.

Definition at line 374 of file BugReporter.cpp.

References clang::ento::PathDiagnosticPiece::Call, clang::ento::PathDiagnosticPiece::ControlFlow, clang::ento::PathDiagnosticPiece::Event, eventsDescribeSameCondition(), clang::ento::PathDiagnosticPiece::Macro, clang::ento::PathDiagnosticPiece::Note, and clang::ento::PathDiagnosticPiece::PopUp.

◆ removeUnneededCalls()

static bool removeUnneededCalls ( const PathDiagnosticConstruct &  C,
PathPieces &  pieces,
const PathSensitiveBugReport *  R,
bool  IsInteresting = false 
)
static

Recursively scan through a path and prune out calls and macros pieces that aren't needed.

Return true if afterwards the path contains "interesting stuff" which means it shouldn't be pruned from the parent path.

Definition at line 424 of file BugReporter.cpp.

References clang::ento::PathDiagnosticPiece::Call, clang::ento::PathDiagnosticPiece::ControlFlow, clang::ento::PathDiagnosticPiece::Event, macro(), clang::ento::PathDiagnosticPiece::Macro, clang::ento::PathDiagnosticPiece::Note, and clang::ento::PathDiagnosticPiece::PopUp.

◆ resetDiagnosticLocationToMainFile()

static void resetDiagnosticLocationToMainFile ( PathDiagnostic &  PD)
static

Definition at line 3241 of file BugReporter.cpp.

References getFirstStackedCallToHeaderFile().

◆ simplifySimpleBranches()

static void simplifySimpleBranches ( PathPieces &  pieces)
static

Move edges from a branch condition to a branch target when the condition is simple.

This restructures some of the work of addContextEdges. That function creates edges this may destroy, but they work together to create a more aesthetically set of edges around branches. After the call to addContextEdges, we may have (1) an edge to the branch, (2) an edge from the branch to the branch condition, and (3) an edge from the branch condition to the branch target. We keep (1), but may wish to remove (2) and move the source of (3) to the branch if the branch condition is simple.

Definition at line 1503 of file BugReporter.cpp.

◆ STATISTIC() [1/2]

STATISTIC ( MaxBugClassSize  ,
"The maximum number of bug reports in the same equivalence class"   
)

◆ STATISTIC() [2/2]

STATISTIC ( MaxValidBugClassSize  ,
"The maximum number of bug reports in the same equivalence class " "where at least one report is valid (not suppressed)"   
)

◆ updateExecutedLinesWithDiagnosticPieces()

static void updateExecutedLinesWithDiagnosticPieces ( PathDiagnostic &  PD)
static

Populate executes lines with lines containing at least one diagnostics.

Definition at line 1962 of file BugReporter.cpp.

References clang::FullSourceLoc::getFileID(), clang::FullSourceLoc::getLineNumber(), clang::FileID::isValid(), and P.

Variable Documentation

◆ StrEnteringLoop

constexpr llvm::StringLiteral StrEnteringLoop = "Entering loop body"
constexpr

Definition at line 1115 of file BugReporter.cpp.

◆ StrLoopBodyZero

constexpr llvm::StringLiteral StrLoopBodyZero = "Loop body executed 0 times"
constexpr

Definition at line 1116 of file BugReporter.cpp.

◆ StrLoopCollectionEmpty

constexpr llvm::StringLiteral StrLoopCollectionEmpty
constexpr
Initial value:
=
"Loop body skipped when collection is empty"

Definition at line 1119 of file BugReporter.cpp.

◆ StrLoopRangeEmpty

constexpr llvm::StringLiteral StrLoopRangeEmpty
constexpr
Initial value:
=
"Loop body skipped when range is empty"

Definition at line 1117 of file BugReporter.cpp.