clang 8.0.0

Namespaces | Enumerations | Functions
AnalysisBasedWarnings.cpp File Reference
`#include "clang/Sema/AnalysisBasedWarnings.h"`
`#include "clang/AST/DeclCXX.h"`
`#include "clang/AST/DeclObjC.h"`
`#include "clang/AST/EvaluatedExprVisitor.h"`
`#include "clang/AST/ExprCXX.h"`
`#include "clang/AST/ExprObjC.h"`
`#include "clang/AST/ParentMap.h"`
`#include "clang/AST/RecursiveASTVisitor.h"`
`#include "clang/AST/StmtCXX.h"`
`#include "clang/AST/StmtObjC.h"`
`#include "clang/AST/StmtVisitor.h"`
`#include "clang/Analysis/Analyses/CFGReachabilityAnalysis.h"`
`#include "clang/Analysis/Analyses/Consumed.h"`
`#include "clang/Analysis/Analyses/ReachableCode.h"`
`#include "clang/Analysis/Analyses/ThreadSafety.h"`
`#include "clang/Analysis/Analyses/UninitializedValues.h"`
`#include "clang/Analysis/AnalysisDeclContext.h"`
`#include "clang/Analysis/CFG.h"`
`#include "clang/Analysis/CFGStmtMap.h"`
`#include "clang/Basic/SourceLocation.h"`
`#include "clang/Basic/SourceManager.h"`
`#include "clang/Lex/Preprocessor.h"`
`#include "clang/Sema/ScopeInfo.h"`
`#include "clang/Sema/SemaInternal.h"`
`#include "llvm/ADT/BitVector.h"`
`#include "llvm/ADT/MapVector.h"`
`#include "llvm/ADT/SmallString.h"`
`#include "llvm/ADT/SmallVector.h"`
`#include "llvm/ADT/StringRef.h"`
`#include "llvm/Support/Casting.h"`
`#include <algorithm>`
`#include <deque>`
`#include <iterator>`
Include dependency graph for AnalysisBasedWarnings.cpp:

Go to the source code of this file.

## Namespaces
| clang
| Dataflow Directional Tag Classes.
| clang::threadSafety
| clang::consumed

## Enumerations
enum | ControlFlowKind { UnknownFallThrough, NeverFallThrough, MaybeFallThrough, AlwaysFallThrough, NeverFallThroughOrReturn }

## Functions
static void | CheckUnreachable (Sema &S, AnalysisDeclContext &AC)
| CheckUnreachable - Check for unreachable code. More...
static bool | hasRecursiveCallInPath (const FunctionDecl *FD, CFGBlock &Block)
static bool | checkForRecursiveFunctionCall (const FunctionDecl *FD, CFG *cfg)
static void | checkRecursiveFunction (Sema &S, const FunctionDecl *FD, const Stmt *Body, AnalysisDeclContext &AC)
static bool | throwEscapes (Sema &S, const CXXThrowExpr *E, CFGBlock &ThrowBlock, CFG *Body)
| Determine whether an exception thrown by E, unwinding from ThrowBlock, can reach ExitBlock. More...
static void | visitReachableThrows (CFG *BodyCFG, llvm::function_ref< void(const CXXThrowExpr *, CFGBlock &)> Visit)
static void | EmitDiagForCXXThrowInNonThrowingFunc (Sema &S, SourceLocation OpLoc, const FunctionDecl *FD)
static void | checkThrowInNonThrowingFunc (Sema &S, const FunctionDecl *FD, AnalysisDeclContext &AC)
static bool | isNoexcept (const FunctionDecl *FD)
static ControlFlowKind | CheckFallThrough (AnalysisDeclContext &AC)
| CheckFallThrough - Check that we don't fall off the end of a Statement that should return a value. More...
static void | CheckFallThroughForBody (Sema &S, const Decl *D, const Stmt *Body, const BlockExpr *blkExpr, const CheckFallThroughDiagnostics &CD, AnalysisDeclContext &AC, sema::FunctionScopeInfo *FSI)
| CheckFallThroughForBody - Check that we don't fall off the end of a function that should return a value. More...
static bool | SuggestInitializationFixit (Sema &S, const VarDecl *VD)
static void | CreateIfFixit (Sema &S, const Stmt *If, const Stmt *Then, const Stmt *Else, bool CondVal, FixItHint &Fixit1, FixItHint &Fixit2)
| Create a fixit to remove an if-like statement, on the assumption that its condition is CondVal. More...
static void | DiagUninitUse (Sema &S, const VarDecl *VD, const UninitUse &Use, bool IsCapturedByBlock)
| DiagUninitUse – Helper function to produce a diagnostic for an uninitialized use of a variable. More...
static bool | DiagnoseUninitializedUse (Sema &S, const VarDecl *VD, const UninitUse &Use, bool alwaysReportSelfInit=false)
| DiagnoseUninitializedUse – Helper function for diagnosing uses of an uninitialized variable. More...
static StringRef | getFallthroughAttrSpelling (Preprocessor &PP, SourceLocation Loc)
static void | DiagnoseSwitchLabelsFallthrough (Sema &S, AnalysisDeclContext &AC, bool PerFunction)
static bool | isInLoop (const ASTContext &Ctx, const ParentMap &PM, const Stmt *S)
static void | diagnoseRepeatedUseOfWeak (Sema &S, const sema::FunctionScopeInfo *CurFn, const Decl *D, const ParentMap &PM)
static unsigned | isEnabled (DiagnosticsEngine &D, unsigned diag)
static void | flushDiagnostics (Sema &S, const sema::FunctionScopeInfo *fscope)

## Enumeration Type Documentation

## ◆ ControlFlowKind

enum ControlFlowKind

Enumerator
UnknownFallThrough |
NeverFallThrough |
MaybeFallThrough |
AlwaysFallThrough |
NeverFallThroughOrReturn |

Definition at line 363 of file AnalysisBasedWarnings.cpp.

## Function Documentation

## ◆ CheckFallThrough()

static ControlFlowKind CheckFallThrough | ( | AnalysisDeclContext & | AC | ) |
| static

CheckFallThrough - Check that we don't fall off the end of a Statement that should return a value.

Returns
  AlwaysFallThrough iff we always fall off the end of the statement, MaybeFallThrough iff we might or might not fall off the end, NeverFallThroughOrReturn iff we never fall off the end of the statement or return. We assume NeverFallThrough iff we never fall off the end of the statement but we may return. We assume that functions not marked noreturn will return.

Definition at line 380 of file AnalysisBasedWarnings.cpp.

References AlwaysFallThrough, clang::CFGElement::castAs(), clang::AnalysisDeclContext::getAddEHEdges(), clang::CFGElement::getAs(), clang::CFGBlock::getBlockID(), clang::AnalysisDeclContext::getCFG(), clang::CFG::getEntry(), clang::Decl::getLocation(), clang::CFG::getNumBlockIDs(), clang::CFGStmt::getStmt(), clang::CFGBlock::getTerminator(), clang::CFGBlock::FilteredCFGBlockIterator< IMPL, IsPred >::hasMore(), clang::CFGBlock::hasNoReturnElement(), clang::CFGBlock::FilterOptions::IgnoreDefaultsWithCoveredEnums, clang::DiagnosticsEngine::isIgnored(), clang::isTemplateInstantiation(), MaybeFallThrough, NeverFallThrough, NeverFallThroughOrReturn, clang::CFGBlock::rbegin(), clang::CFGBlock::rend(), clang::reachable_code::ScanReachableFromBlock(), clang::CFGBlock::succ_begin(), clang::CFGBlock::succ_end(), and UnknownFallThrough.

Referenced by CheckFallThroughForBody().

## ◆ CheckFallThroughForBody()

static void CheckFallThroughForBody | ( | Sema & | S,
|  | const Decl * | D,
|  | const Stmt * | Body,
|  | const BlockExpr * | blkExpr,
|  | const CheckFallThroughDiagnostics & | CD,
|  | AnalysisDeclContext & | AC,
|  | sema::FunctionScopeInfo * | FSI
| ) |  |
| static

CheckFallThroughForBody - Check that we don't fall off the end of a function that should return a value.

Check that we don't fall off the end of a noreturn function. We assume that functions and blocks not marked noreturn will return.

Definition at line 617 of file AnalysisBasedWarnings.cpp.

References AlwaysFallThrough, CheckFallThrough(), clang::sema::FunctionScopeInfo::CoroutinePromise, clang::Sema::Diag(), clang::Type::getAs(), clang::Decl::getAsFunction(), clang::Stmt::getBeginLoc(), clang::Sema::getDiagnostics(), clang::Stmt::getEndLoc(), clang::Type::getPointeeType(), clang::Expr::getType(), clang::ValueDecl::getType(), clang::sema::FunctionScopeInfo::isCoroutine(), clang::FunctionDecl::isCPUDispatchMultiVersion(), MaybeFallThrough, NeverFallThrough, NeverFallThroughOrReturn, and UnknownFallThrough.

Referenced by clang::sema::AnalysisBasedWarnings::IssueWarnings().

## ◆ checkForRecursiveFunctionCall()

static bool checkForRecursiveFunctionCall | ( | const FunctionDecl * | FD,
|  | CFG * | cfg
| ) |  |
| static

Definition at line 204 of file AnalysisBasedWarnings.cpp.

References clang::CFGBlock::getBlockID(), clang::CFG::getEntry(), clang::CFG::getExit(), hasRecursiveCallInPath(), clang::CFGBlock::succ_begin(), and clang::CFGBlock::succ_end().

Referenced by checkRecursiveFunction().

## ◆ checkRecursiveFunction()

static void checkRecursiveFunction | ( | Sema & | S,
|  | const FunctionDecl * | FD,
|  | const Stmt * | Body,
|  | AnalysisDeclContext & | AC
| ) |  |
| static

Definition at line 240 of file AnalysisBasedWarnings.cpp.

References checkForRecursiveFunctionCall(), clang::Sema::Diag(), clang::Stmt::getBeginLoc(), clang::FunctionDecl::getCanonicalDecl(), clang::AnalysisDeclContext::getCFG(), clang::FunctionDecl::getTemplatedKind(), clang::FunctionDecl::TK_MemberSpecialization, and clang::FunctionDecl::TK_NonTemplate.

Referenced by clang::sema::AnalysisBasedWarnings::IssueWarnings().

## ◆ checkThrowInNonThrowingFunc()

static void checkThrowInNonThrowingFunc | ( | Sema & | S,
|  | const FunctionDecl * | FD,
|  | AnalysisDeclContext & | AC
| ) |  |
| static

Definition at line 339 of file AnalysisBasedWarnings.cpp.

References EmitDiagForCXXThrowInNonThrowingFunc(), clang::AnalysisDeclContext::getCFG(), clang::CFG::getExit(), clang::CXXThrowExpr::getThrowLoc(), clang::CFGBlock::pred_empty(), throwEscapes(), and visitReachableThrows().

Referenced by clang::sema::AnalysisBasedWarnings::IssueWarnings().

## ◆ CheckUnreachable()

static void CheckUnreachable | ( | Sema & | S,
|  | AnalysisDeclContext & | AC
| ) |  |
| static

CheckUnreachable - Check for unreachable code.

Definition at line 109 of file AnalysisBasedWarnings.cpp.

References clang::reachable_code::FindUnreachableCode(), clang::Decl::getBeginLoc(), clang::AnalysisDeclContext::getDecl(), clang::Sema::getPreprocessor(), clang::Sema::getSourceManager(), and clang::SourceManager::isInMainFile().

Referenced by clang::sema::AnalysisBasedWarnings::IssueWarnings().

## ◆ CreateIfFixit()

static void CreateIfFixit | ( | Sema & | S,
|  | const Stmt * | If,
|  | const Stmt * | Then,
|  | const Stmt * | Else,
|  | bool | CondVal,
|  | FixItHint & | Fixit1,
|  | FixItHint & | Fixit2
| ) |  |
| static

Create a fixit to remove an if-like statement, on the assumption that its condition is CondVal.

Definition at line 768 of file AnalysisBasedWarnings.cpp.

References clang::FixItHint::CreateRemoval(), clang::Stmt::getBeginLoc(), clang::CharSourceRange::getCharRange(), clang::Stmt::getEndLoc(), clang::Sema::getLocForEndOfToken(), and clang::Stmt::getSourceRange().

Referenced by DiagUninitUse().

## ◆ diagnoseRepeatedUseOfWeak()

static void diagnoseRepeatedUseOfWeak | ( | Sema & | S,
|  | const sema::FunctionScopeInfo * | CurFn,
|  | const Decl * | D,
|  | const ParentMap & | PM
| ) |  |
| static

Definition at line 1330 of file AnalysisBasedWarnings.cpp.

References clang::Sema::Diag(), clang::Sema::getASTContext(), clang::Stmt::getBeginLoc(), clang::Sema::getSourceManager(), clang::Stmt::getSourceRange(), clang::sema::FunctionScopeInfo::getWeakObjectUses(), clang::SourceManager::isBeforeInTranslationUnit(), isInLoop(), P, clang::Property, and SM.

Referenced by clang::sema::AnalysisBasedWarnings::IssueWarnings().

## ◆ DiagnoseSwitchLabelsFallthrough()

static void DiagnoseSwitchLabelsFallthrough | ( | Sema & | S,
|  | AnalysisDeclContext & | AC,
|  | bool | PerFunction
| ) |  |
| static

Definition at line 1227 of file AnalysisBasedWarnings.cpp.

References clang::FixItHint::CreateInsertion(), clang::Sema::Diag(), clang::AnalysisDeclContext::getASTContext(), clang::Stmt::getBeginLoc(), clang::AnalysisDeclContext::getBody(), clang::AnalysisDeclContext::getCFG(), clang::AnalysisDeclContext::getDecl(), getFallthroughAttrSpelling(), clang::ASTContext::getLangOpts(), clang::Sema::getLangOpts(), clang::Sema::getPreprocessor(), clang::SourceLocation::isMacroID(), and Label.

Referenced by clang::sema::AnalysisBasedWarnings::IssueWarnings().

## ◆ DiagnoseUninitializedUse()

static bool DiagnoseUninitializedUse | ( | Sema & | S,
|  | const VarDecl * | VD,
|  | const UninitUse & | Use,
|  | bool | alwaysReportSelfInit = `false`
| ) |  |
| static

DiagnoseUninitializedUse – Helper function for diagnosing uses of an uninitialized variable.

This manages the different forms of diagnostic emitted for particular types of uses. Returns true if the use was diagnosed as a warning. If a particular use is one we omit warnings for, returns false.

Definition at line 964 of file AnalysisBasedWarnings.cpp.

References clang::Sema::Context, clang::Sema::Diag(), DiagUninitUse(), clang::DeclaratorDecl::getBeginLoc(), clang::BlockExpr::getBeginLoc(), clang::NamedDecl::getDeclName(), clang::VarDecl::getInit(), clang::Decl::getLocation(), clang::ValueDecl::getType(), clang::UninitUse::getUser(), clang::Decl::hasAttr(), clang::Type::isBlockPointerType(), and SuggestInitializationFixit().

## ◆ DiagUninitUse()

static void DiagUninitUse | ( | Sema & | S,
|  | const VarDecl * | VD,
|  | const UninitUse & | Use,
|  | bool | IsCapturedByBlock
| ) |  |
| static

DiagUninitUse – Helper function to produce a diagnostic for an uninitialized use of a variable.

Definition at line 792 of file AnalysisBasedWarnings.cpp.

References clang::UninitUse::AfterCall, clang::UninitUse::AfterDecl, clang::UninitUse::Always, clang::UninitUse::branch_begin(), clang::UninitUse::branch_end(), CreateIfFixit(), clang::FixItHint::CreateRemoval(), clang::FixItHint::CreateReplacement(), clang::Sema::Diag(), clang::SourceRange::getBegin(), clang::CharSourceRange::getBegin(), clang::Stmt::getBeginLoc(), clang::BinaryOperator::getBeginLoc(), clang::IfStmt::getCond(), clang::ConditionalOperator::getCond(), clang::NamedDecl::getDeclName(), clang::IfStmt::getElse(), clang::ConditionalOperator::getFalseExpr(), clang::UninitUse::getKind(), clang::Sema::getLangOpts(), clang::Decl::getLexicalDeclContext(), clang::BinaryOperator::getLHS(), clang::Decl::getLocation(), clang::BinaryOperator::getOpcode(), clang::BinaryOperator::getOpcodeStr(), clang::BinaryOperator::getOperatorLoc(), clang::VarDecl::getSourceRange(), clang::Stmt::getSourceRange(), clang::Stmt::getStmtClass(), clang::IfStmt::getThen(), clang::ConditionalOperator::getTrueExpr(), clang::UninitUse::getUser(), clang::BinaryOperator::isLogicalOp(), clang::UninitUse::Maybe, clang::FixItHint::RemoveRange, and clang::UninitUse::Sometimes.

Referenced by DiagnoseUninitializedUse().

## ◆ EmitDiagForCXXThrowInNonThrowingFunc()

static void EmitDiagForCXXThrowInNonThrowingFunc | ( | Sema & | S,
|  | SourceLocation | OpLoc,
|  | const FunctionDecl * | FD
| ) |  |
| static

Definition at line 319 of file AnalysisBasedWarnings.cpp.

References clang::Sema::Diag(), clang::DeclarationName::getCXXOverloadedOperator(), clang::NamedDecl::getDeclName(), clang::FunctionDecl::getExceptionSpecSourceRange(), clang::Sema::getLangOpts(), clang::Decl::getLocation(), clang::Sema::getSourceManager(), clang::TypeSourceInfo::getType(), clang::DeclaratorDecl::getTypeSourceInfo(), and clang::SourceManager::isInSystemHeader().

Referenced by checkThrowInNonThrowingFunc().

## ◆ flushDiagnostics()

static void flushDiagnostics | ( | Sema & | S,
|  | const sema::FunctionScopeInfo * | fscope
| ) |  |
| static

Definition at line 1998 of file AnalysisBasedWarnings.cpp.

References clang::Sema::Diag(), clang::sema::AnalysisBasedWarnings::IssueWarnings(), and clang::sema::FunctionScopeInfo::PossiblyUnreachableDiags.

Referenced by clang::sema::AnalysisBasedWarnings::IssueWarnings().

## ◆ getFallthroughAttrSpelling()

static StringRef getFallthroughAttrSpelling | ( | Preprocessor & | PP,
|  | SourceLocation | Loc
| ) |  |
| static

Definition at line 1199 of file AnalysisBasedWarnings.cpp.

References clang::Preprocessor::getIdentifierInfo(), clang::Preprocessor::getLangOpts(), and clang::Preprocessor::getLastMacroWithSpelling().

Referenced by DiagnoseSwitchLabelsFallthrough().

## ◆ hasRecursiveCallInPath()

static bool hasRecursiveCallInPath | ( | const FunctionDecl * | FD,
|  | CFGBlock & | Block
| ) |  |
| static

Definition at line 173 of file AnalysisBasedWarnings.cpp.

References clang::CallExpr::getCallee(), clang::CallExpr::getCalleeDecl(), clang::Decl::getCanonicalDecl(), clang::CXXMemberCallExpr::getImplicitObjectArgument(), clang::CXXMemberCallExpr::getMethodDecl(), clang::Expr::IgnoreParenImpCasts(), clang::CXXMethodDecl::isVirtual(), clang::CFGElement::Statement, and clang::NestedNameSpecifier::TypeSpec.

Referenced by checkForRecursiveFunctionCall().

## ◆ isEnabled()

static unsigned isEnabled | ( | DiagnosticsEngine & | D,
|  | unsigned | diag
| ) |  |
| static

Definition at line 1966 of file AnalysisBasedWarnings.cpp.

References clang::DiagnosticsEngine::isIgnored().

Referenced by clang::sema::AnalysisBasedWarnings::AnalysisBasedWarnings(), and clang::Sema::CheckAssignmentOperands().

## ◆ isInLoop()

static bool isInLoop | ( | const ASTContext & | Ctx,
|  | const ParentMap & | PM,
|  | const Stmt * | S
| ) |  |
| static

Definition at line 1305 of file AnalysisBasedWarnings.cpp.

References clang::APValue::getInt(), clang::ParentMap::getParent(), clang::Stmt::getStmtClass(), clang::Result, and clang::Expr::EvalResult::Val.

Referenced by diagnoseRepeatedUseOfWeak().

## ◆ isNoexcept()

static bool isNoexcept | ( | const FunctionDecl * | FD | ) |
| static

Definition at line 352 of file AnalysisBasedWarnings.cpp.

References clang::Type::castAs(), clang::ValueDecl::getType(), and clang::Decl::hasAttr().

Referenced by clang::sema::AnalysisBasedWarnings::IssueWarnings().

## ◆ SuggestInitializationFixit()

static bool SuggestInitializationFixit | ( | Sema & | S,
|  | const VarDecl * | VD
| ) |  |
| static

Definition at line 736 of file AnalysisBasedWarnings.cpp.

References clang::FixItHint::CreateInsertion(), clang::Sema::Diag(), clang::QualType::getCanonicalType(), clang::NamedDecl::getDeclName(), clang::Decl::getEndLoc(), clang::Sema::getFixItZeroInitializerForType(), clang::VarDecl::getInit(), clang::Decl::getLocation(), clang::Sema::getLocForEndOfToken(), clang::ValueDecl::getType(), clang::Decl::hasAttr(), clang::Type::isBlockPointerType(), and clang::SourceLocation::isMacroID().

Referenced by DiagnoseUninitializedUse().

## ◆ throwEscapes()

static bool throwEscapes | ( | Sema & | S,
|  | const CXXThrowExpr * | E,
|  | CFGBlock & | ThrowBlock,
|  | CFG * | Body
| ) |  |
| static

Determine whether an exception thrown by E, unwinding from ThrowBlock, can reach ExitBlock.

Definition at line 264 of file AnalysisBasedWarnings.cpp.

Referenced by checkThrowInNonThrowingFunc().

## ◆ visitReachableThrows()

static void visitReachableThrows | ( | CFG * | BodyCFG,
|  | llvm::function_ref< void(const CXXThrowExpr *, CFGBlock &)> | Visit
| ) |  |
| static

Definition at line 301 of file AnalysisBasedWarnings.cpp.

References clang::CFG::getEntry(), clang::CFG::getNumBlockIDs(), and clang::reachable_code::ScanReachableFromBlock().

Referenced by checkThrowInNonThrowingFunc().

## Variable Documentation

## ◆ SM

SourceManager& SM

Definition at line 1581 of file AnalysisBasedWarnings.cpp.

Referenced by diagnoseRepeatedUseOfWeak().