clang  10.0.0svn
Functions | Variables
BugReporterVisitors.cpp File Reference
#include "clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitors.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclBase.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/Expr.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ExprObjC.h"
#include "clang/AST/Stmt.h"
#include "clang/AST/Type.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/Analysis/Analyses/Dominators.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/IdentifierTable.h"
#include "clang/Basic/LLVM.h"
#include "clang/Basic/SourceLocation.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Lex/Lexer.h"
#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.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/ProgramState_Fwd.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/SMTConv.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"
#include "clang/StaticAnalyzer/Core/PathSensitive/SubEngine.h"
#include "llvm/ADT/ArrayRef.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/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 <deque>
#include <memory>
#include <string>
#include <utility>

Go to the source code of this file.

Functions

static const ExprpeelOffPointerArithmetic (const BinaryOperator *B)
 
static bool hasVisibleUpdate (const ExplodedNode *LeftNode, SVal LeftVal, const ExplodedNode *RightNode, SVal RightVal)
 Comparing internal representations of symbolic values (via SVal::operator==()) is a valid way to check if the value was updated, unless it's a LazyCompoundVal that may have a different internal representation every time it is loaded from the state. More...
 
static Optional< SVal > getSValForVar (const Expr *CondVarExpr, const ExplodedNode *N)
 
static Optional< const llvm::APSInt * > getConcreteIntegerValue (const Expr *CondVarExpr, const ExplodedNode *N)
 
static bool isVarAnInterestingCondition (const Expr *CondVarExpr, const ExplodedNode *N, const PathSensitiveBugReport *B)
 
static bool isInterestingExpr (const Expr *E, const ExplodedNode *N, const PathSensitiveBugReport *B)
 
static StringRef getMacroName (SourceLocation Loc, BugReporterContext &BRC)
 
static bool isFunctionMacroExpansion (SourceLocation Loc, const SourceManager &SM)
 
static bool wasRegionOfInterestModifiedAt (const SubRegion *RegionOfInterest, const ExplodedNode *N, SVal ValueAfter)
 
static bool potentiallyWritesIntoIvar (const Decl *Parent, const ObjCIvarDecl *Ivar)
 
static ArrayRef< ParmVarDecl * > getCallParameters (CallEventRef<> Call)
 Get parameters associated with runtime definition in order to get the correct parameter name. More...
 
static bool isPointerToConst (QualType Ty)
 
static bool isInitializationOfVar (const ExplodedNode *N, const VarRegion *VR)
 Returns true if N represents the DeclStmt declaring and initializing VR. More...
 
static void showBRDiagnostics (const char *action, llvm::raw_svector_ostream &os, const MemRegion *R, SVal V, const DeclStmt *DS)
 Show diagnostics for initializing or declaring a region R with a bad value. More...
 
static void showBRParamDiagnostics (llvm::raw_svector_ostream &os, const VarRegion *VR, SVal V)
 Display diagnostics for passing bad region as a parameter. More...
 
static void showBRDefaultDiagnostics (llvm::raw_svector_ostream &os, const MemRegion *R, SVal V)
 Show default diagnostics for storing bad region. More...
 
static std::shared_ptr< PathDiagnosticEventPiece > constructDebugPieceForTrackedCondition (const Expr *Cond, const ExplodedNode *N, BugReporterContext &BRC)
 
static bool isAssertlikeBlock (const CFGBlock *B, ASTContext &Context)
 
static const MemRegion * getLocationRegionIfReference (const Expr *E, const ExplodedNode *N)
 

Variables

static llvm::StringLiteral WillBeUsedForACondition
 

Function Documentation

◆ constructDebugPieceForTrackedCondition()

static std::shared_ptr<PathDiagnosticEventPiece> constructDebugPieceForTrackedCondition ( const Expr Cond,
const ExplodedNode *  N,
BugReporterContext &  BRC 
)
static

◆ getCallParameters()

static ArrayRef<ParmVarDecl *> getCallParameters ( CallEventRef<>  Call)
static

Get parameters associated with runtime definition in order to get the correct parameter name.

Definition at line 469 of file BugReporterVisitors.cpp.

Referenced by isPointerToConst().

◆ getConcreteIntegerValue()

static Optional<const llvm::APSInt *> getConcreteIntegerValue ( const Expr CondVarExpr,
const ExplodedNode *  N 
)
static

Definition at line 208 of file BugReporterVisitors.cpp.

References getSValForVar(), and V.

◆ getLocationRegionIfReference()

static const MemRegion* getLocationRegionIfReference ( const Expr E,
const ExplodedNode *  N 
)
static

◆ getMacroName()

static StringRef getMacroName ( SourceLocation  Loc,
BugReporterContext &  BRC 
)
static
Returns
name of the macro inside the location Loc.

Definition at line 240 of file BugReporterVisitors.cpp.

References clang::Lexer::getImmediateMacroName().

◆ getSValForVar()

static Optional<SVal> getSValForVar ( const Expr CondVarExpr,
const ExplodedNode *  N 
)
static

◆ hasVisibleUpdate()

static bool hasVisibleUpdate ( const ExplodedNode *  LeftNode,
SVal  LeftVal,
const ExplodedNode *  RightNode,
SVal  RightVal 
)
static

Comparing internal representations of symbolic values (via SVal::operator==()) is a valid way to check if the value was updated, unless it's a LazyCompoundVal that may have a different internal representation every time it is loaded from the state.

In this function we do an approximate comparison for lazy compound values, checking that they are the immediate snapshots of the tracked region's bindings within the node's respective states but not really checking that these snapshots actually contain the same set of bindings.

Definition at line 165 of file BugReporterVisitors.cpp.

Referenced by showBRDefaultDiagnostics().

◆ isAssertlikeBlock()

static bool isAssertlikeBlock ( const CFGBlock B,
ASTContext Context 
)
static

Definition at line 1753 of file BugReporterVisitors.cpp.

◆ isFunctionMacroExpansion()

static bool isFunctionMacroExpansion ( SourceLocation  Loc,
const SourceManager SM 
)
static

◆ isInitializationOfVar()

static bool isInitializationOfVar ( const ExplodedNode *  N,
const VarRegion *  VR 
)
static

Returns true if N represents the DeclStmt declaring and initializing VR.

Definition at line 1216 of file BugReporterVisitors.cpp.

References clang::DeclStmt::getSingleDecl(), clang::LocationContext::getStackFrame(), and P.

Referenced by showBRDefaultDiagnostics().

◆ isInterestingExpr()

static bool isInterestingExpr ( const Expr E,
const ExplodedNode *  N,
const PathSensitiveBugReport *  B 
)
static

Definition at line 232 of file BugReporterVisitors.cpp.

References getSValForVar(), and V.

◆ isPointerToConst()

static bool isPointerToConst ( QualType  Ty)
static

◆ isVarAnInterestingCondition()

static bool isVarAnInterestingCondition ( const Expr CondVarExpr,
const ExplodedNode *  N,
const PathSensitiveBugReport *  B 
)
static

Definition at line 216 of file BugReporterVisitors.cpp.

References getSValForVar(), and V.

◆ peelOffPointerArithmetic()

static const Expr* peelOffPointerArithmetic ( const BinaryOperator B)
static

◆ potentiallyWritesIntoIvar()

static bool potentiallyWritesIntoIvar ( const Decl Parent,
const ObjCIvarDecl Ivar 
)
static
Returns
Whether the method declaration Parent syntactically has a binary operation writing into the ivar Ivar.

Definition at line 436 of file BugReporterVisitors.cpp.

References clang::ast_matchers::binaryOperator, clang::Decl::hasBody(), clang::ast_matchers::hasDeclaration(), clang::ast_matchers::hasDescendant, clang::ast_matchers::objcIvarRefExpr, and clang::ast_matchers::stmt.

Referenced by isPointerToConst().

◆ showBRDefaultDiagnostics()

static void showBRDefaultDiagnostics ( llvm::raw_svector_ostream &  os,
const MemRegion *  R,
SVal  V 
)
static

Show default diagnostics for storing bad region.

Definition at line 1316 of file BugReporterVisitors.cpp.

References clang::CallEventManager::getCaller(), hasVisibleUpdate(), clang::Expr::IgnoreParenCasts(), isInitializationOfVar(), P, and V.

◆ showBRDiagnostics()

static void showBRDiagnostics ( const char *  action,
llvm::raw_svector_ostream &  os,
const MemRegion *  R,
SVal  V,
const DeclStmt DS 
)
static

Show diagnostics for initializing or declaring a region R with a bad value.

Definition at line 1244 of file BugReporterVisitors.cpp.

References clang::DeclStmt::getSingleDecl().

◆ showBRParamDiagnostics()

static void showBRParamDiagnostics ( llvm::raw_svector_ostream &  os,
const VarRegion *  VR,
SVal  V 
)
static

Display diagnostics for passing bad region as a parameter.

Definition at line 1286 of file BugReporterVisitors.cpp.

◆ wasRegionOfInterestModifiedAt()

static bool wasRegionOfInterestModifiedAt ( const SubRegion *  RegionOfInterest,
const ExplodedNode *  N,
SVal  ValueAfter 
)
static
Returns
Whether RegionOfInterest was modified at N, where ValueAfter is RegionOfInterest's value at the end of the stack frame.

Definition at line 265 of file BugReporterVisitors.cpp.

References clang::LocationContext::getStackFrame(), P, SM, and State.

Referenced by isPointerToConst().

Variable Documentation

◆ WillBeUsedForACondition

llvm::StringLiteral WillBeUsedForACondition
static
Initial value:
=
", which participates in a condition later"

Definition at line 654 of file BugReporterVisitors.cpp.