clang  6.0.0svn
Namespaces | Functions
ReachableCode.cpp File Reference
#include "clang/Analysis/Analyses/ReachableCode.h"
#include "clang/AST/Expr.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ExprObjC.h"
#include "clang/AST/ParentMap.h"
#include "clang/AST/StmtCXX.h"
#include "clang/Analysis/AnalysisDeclContext.h"
#include "clang/Analysis/CFG.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Lex/Preprocessor.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/SmallVector.h"
Include dependency graph for ReachableCode.cpp:

Go to the source code of this file.

Namespaces

 clang
 Dataflow Directional Tag Classes.
 
 clang::reachable_code
 

Functions

static bool isEnumConstant (const Expr *Ex)
 
static bool isTrivialExpression (const Expr *Ex)
 
static bool isTrivialDoWhile (const CFGBlock *B, const Stmt *S)
 
static bool isBuiltinUnreachable (const Stmt *S)
 
static bool isDeadReturn (const CFGBlock *B, const Stmt *S)
 
static SourceLocation getTopMostMacro (SourceLocation Loc, SourceManager &SM)
 
static bool isExpandedFromConfigurationMacro (const Stmt *S, Preprocessor &PP, bool IgnoreYES_NO=false)
 Returns true if the statement is expanded from a configuration macro. More...
 
static bool isConfigurationValue (const ValueDecl *D, Preprocessor &PP)
 
static bool isConfigurationValue (const Stmt *S, Preprocessor &PP, SourceRange *SilenceableCondVal=nullptr, bool IncludeIntegers=true, bool WrappedInParens=false)
 Returns true if the statement represents a configuration value. More...
 
static bool shouldTreatSuccessorsAsReachable (const CFGBlock *B, Preprocessor &PP)
 Returns true if we should always explore all successors of a block. More...
 
static unsigned scanFromBlock (const CFGBlock *Start, llvm::BitVector &Reachable, Preprocessor *PP, bool IncludeSometimesUnreachableEdges)
 
static unsigned scanMaybeReachableFromBlock (const CFGBlock *Start, Preprocessor &PP, llvm::BitVector &Reachable)
 
static bool isValidDeadStmt (const Stmt *S)
 
static int SrcCmp (const std::pair< const CFGBlock *, const Stmt *> *p1, const std::pair< const CFGBlock *, const Stmt *> *p2)
 
static SourceLocation GetUnreachableLoc (const Stmt *S, SourceRange &R1, SourceRange &R2)
 
unsigned clang::reachable_code::ScanReachableFromBlock (const CFGBlock *Start, llvm::BitVector &Reachable)
 ScanReachableFromBlock - Mark all blocks reachable from Start. More...
 
void clang::reachable_code::FindUnreachableCode (AnalysisDeclContext &AC, Preprocessor &PP, Callback &CB)
 

Function Documentation

◆ getTopMostMacro()

static SourceLocation getTopMostMacro ( SourceLocation  Loc,
SourceManager SM 
)
static

◆ GetUnreachableLoc()

static SourceLocation GetUnreachableLoc ( const Stmt S,
SourceRange R1,
SourceRange R2 
)
static

Definition at line 530 of file ReachableCode.cpp.

◆ isBuiltinUnreachable()

static bool isBuiltinUnreachable ( const Stmt S)
static

Definition at line 61 of file ReachableCode.cpp.

◆ isConfigurationValue() [1/2]

static bool isConfigurationValue ( const ValueDecl D,
Preprocessor PP 
)
static

Definition at line 256 of file ReachableCode.cpp.

Referenced by shouldTreatSuccessorsAsReachable().

◆ isConfigurationValue() [2/2]

static bool isConfigurationValue ( const Stmt S,
Preprocessor PP,
SourceRange SilenceableCondVal = nullptr,
bool  IncludeIntegers = true,
bool  WrappedInParens = false 
)
static

Returns true if the statement represents a configuration value.

A configuration value is something usually determined at compile-time to conditionally always execute some branch. Such guards are for "sometimes unreachable" code. Such code is usually not interesting to report as unreachable, and may mask truly unreachable code within those blocks.

Definition at line 173 of file ReachableCode.cpp.

◆ isDeadReturn()

static bool isDeadReturn ( const CFGBlock B,
const Stmt S 
)
static

Definition at line 69 of file ReachableCode.cpp.

◆ isEnumConstant()

static bool isEnumConstant ( const Expr Ex)
static

Definition at line 34 of file ReachableCode.cpp.

References clang::DeclRefExpr::getDecl().

Referenced by isTrivialExpression().

◆ isExpandedFromConfigurationMacro()

static bool isExpandedFromConfigurationMacro ( const Stmt S,
Preprocessor PP,
bool  IgnoreYES_NO = false 
)
static

Returns true if the statement is expanded from a configuration macro.

Definition at line 134 of file ReachableCode.cpp.

◆ isTrivialDoWhile()

static bool isTrivialDoWhile ( const CFGBlock B,
const Stmt S 
)
static

Definition at line 49 of file ReachableCode.cpp.

◆ isTrivialExpression()

static bool isTrivialExpression ( const Expr Ex)
static

Definition at line 41 of file ReachableCode.cpp.

References clang::Expr::IgnoreParenCasts(), and isEnumConstant().

◆ isValidDeadStmt()

static bool isValidDeadStmt ( const Stmt S)
static

Definition at line 432 of file ReachableCode.cpp.

◆ scanFromBlock()

static unsigned scanFromBlock ( const CFGBlock Start,
llvm::BitVector &  Reachable,
Preprocessor PP,
bool  IncludeSometimesUnreachableEdges 
)
static

◆ scanMaybeReachableFromBlock()

static unsigned scanMaybeReachableFromBlock ( const CFGBlock Start,
Preprocessor PP,
llvm::BitVector &  Reachable 
)
static

Definition at line 359 of file ReachableCode.cpp.

References scanFromBlock().

Referenced by clang::reachable_code::FindUnreachableCode().

◆ shouldTreatSuccessorsAsReachable()

static bool shouldTreatSuccessorsAsReachable ( const CFGBlock B,
Preprocessor PP 
)
static

Returns true if we should always explore all successors of a block.

Definition at line 278 of file ReachableCode.cpp.

References clang::CFGBlock::getTerminator(), clang::CFGBlock::getTerminatorCondition(), and isConfigurationValue().

◆ SrcCmp()

static int SrcCmp ( const std::pair< const CFGBlock *, const Stmt *> *  p1,
const std::pair< const CFGBlock *, const Stmt *> *  p2 
)
static

Definition at line 459 of file ReachableCode.cpp.

References clang::CFGBlock::getBlockID().