clang API Documentation

Namespaces | Functions
ReachableCode.cpp File Reference
#include "clang/Analysis/Analyses/ReachableCode.h"
#include "clang/Lex/Preprocessor.h"
#include "clang/AST/Expr.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ExprObjC.h"
#include "clang/AST/StmtCXX.h"
#include "clang/AST/ParentMap.h"
#include "clang/Analysis/AnalysisContext.h"
#include "clang/Analysis/CFG.h"
#include "clang/Basic/SourceManager.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

namespace  clang
namespace  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 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.
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)
static bool shouldTreatSuccessorsAsReachable (const CFGBlock *B, Preprocessor &PP)
 Returns true if we should always explore all successors of a block.
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)
void clang::reachable_code::FindUnreachableCode (AnalysisDeclContext &AC, Preprocessor &PP, Callback &CB)

Function Documentation

static SourceLocation getTopMostMacro ( SourceLocation  Loc,
SourceManager SM 
) [static]
static SourceLocation GetUnreachableLoc ( const Stmt S,
SourceRange R1,
SourceRange R2 
) [static]
static bool isConfigurationValue ( const ValueDecl D,
Preprocessor PP 
) [static]

Definition at line 230 of file ReachableCode.cpp.

Referenced by isConfigurationValue(), and shouldTreatSuccessorsAsReachable().

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 159 of file ReachableCode.cpp.

References clang::BinaryOperator::getLHS(), clang::UnaryOperator::getOpcode(), clang::BinaryOperator::getRHS(), clang::Stmt::getSourceRange(), clang::Stmt::getStmtClass(), clang::UnaryOperator::getSubExpr(), clang::BinaryOperator::isComparisonOp(), isConfigurationValue(), clang::FunctionDecl::isConstexpr(), isExpandedFromConfigurationMacro(), clang::BinaryOperator::isLogicalOp(), S, and clang::UO_LNot.

static bool isDeadReturn ( const CFGBlock B,
const Stmt S 
) [static]
static bool isEnumConstant ( const Expr Ex) [static]

Definition at line 34 of file ReachableCode.cpp.

References clang::DeclRefExpr::getDecl().

Referenced by isTrivialExpression().

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 126 of file ReachableCode.cpp.

References clang::Preprocessor::getImmediateMacroName(), clang::Stmt::getLocStart(), clang::Preprocessor::getSourceManager(), getTopMostMacro(), clang::SourceLocation::isMacroID(), and SM.

Referenced by isConfigurationValue().

static bool isTrivialDoWhile ( const CFGBlock B,
const Stmt S 
) [static]
static bool isTrivialExpression ( const Expr Ex) [static]

Definition at line 41 of file ReachableCode.cpp.

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

Referenced by isTrivialDoWhile().

static bool isValidDeadStmt ( const Stmt S) [static]
static unsigned scanFromBlock ( const CFGBlock Start,
llvm::BitVector &  Reachable,
Preprocessor PP,
bool  IncludeSometimesUnreachableEdges 
) [static]
static unsigned scanMaybeReachableFromBlock ( const CFGBlock Start,
Preprocessor PP,
llvm::BitVector &  Reachable 
) [static]

Definition at line 333 of file ReachableCode.cpp.

References scanFromBlock().

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

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

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

Definition at line 252 of file ReachableCode.cpp.

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

Referenced by scanFromBlock().

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

Definition at line 433 of file ReachableCode.cpp.