clang 17.0.0git
Classes | 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/Expr.h"
#include "clang/AST/ExprCXX.h"
#include "clang/AST/ExprObjC.h"
#include "clang/AST/OperationKinds.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/CalledOnceCheck.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/Analyses/UnsafeBufferUsage.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/ArrayRef.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 <optional>
Include dependency graph for AnalysisBasedWarnings.cpp:

Go to the source code of this file.


class  clang::sema::AnalysisBasedWarnings::InterProceduralData
 InterProceduralData aims to be a storage of whatever data should be passed between analyses of different functions. More...


namespace  clang
namespace  clang::threadSafety
namespace  clang::consumed


enum  ControlFlowKind {
  UnknownFallThrough , NeverFallThrough , MaybeFallThrough , AlwaysFallThrough ,


static void CheckUnreachable (Sema &S, AnalysisDeclContext &AC)
 CheckUnreachable - Check for unreachable code.
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.
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.
static void CheckFallThroughForBody (Sema &S, const Decl *D, const Stmt *Body, QualType BlockType, 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.
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.
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.
static bool DiagnoseUninitializedConstRefUse (Sema &S, const VarDecl *VD, const UninitUse &Use)
 Diagnose uninitialized const reference usages.
static bool DiagnoseUninitializedUse (Sema &S, const VarDecl *VD, const UninitUse &Use, bool alwaysReportSelfInit=false)
 DiagnoseUninitializedUse – Helper function for diagnosing uses of an uninitialized variable.
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


Definition at line 392 of file AnalysisBasedWarnings.cpp.

Function Documentation

◆ CheckFallThrough()

static ControlFlowKind CheckFallThrough ( AnalysisDeclContext AC)

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

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 409 of file AnalysisBasedWarnings.cpp.

References AlwaysFallThrough, clang::CFGElement::castAs(), clang::CFGBlock::filtered_pred_start_end(), clang::AnalysisDeclContext::getAddEHEdges(), clang::CFGElement::getAs(), clang::CFGBlock::getBlockID(), clang::AnalysisDeclContext::getCFG(), clang::CFG::getEntry(), clang::CFG::getExit(), clang::CFG::getNumBlockIDs(), clang::CFGStmt::getStmt(), clang::CFGBlock::getTerminatorStmt(), clang::CFGBlock::FilteredCFGBlockIterator< IMPL, IsPred >::hasMore(), clang::CFGBlock::hasNoReturnElement(), clang::CFGBlock::FilterOptions::IgnoreDefaultsWithCoveredEnums, MaybeFallThrough, NeverFallThrough, NeverFallThroughOrReturn, clang::CFGBlock::rbegin(), clang::CFGBlock::rend(), clang::reachable_code::ScanReachableFromBlock(), clang::CFGBlock::succs(), and UnknownFallThrough.

Referenced by CheckFallThroughForBody().

◆ CheckFallThroughForBody()

static void CheckFallThroughForBody ( Sema S,
const Decl D,
const Stmt Body,
QualType  BlockType,
const CheckFallThroughDiagnostics &  CD,
AnalysisDeclContext AC,
sema::FunctionScopeInfo FSI 

◆ checkForRecursiveFunctionCall()

static bool checkForRecursiveFunctionCall ( const FunctionDecl FD,
CFG cfg 

◆ checkRecursiveFunction()

static void checkRecursiveFunction ( Sema S,
const FunctionDecl FD,
const Stmt Body,
AnalysisDeclContext AC 

◆ checkThrowInNonThrowingFunc()

static void checkThrowInNonThrowingFunc ( Sema S,
const FunctionDecl FD,
AnalysisDeclContext AC 

◆ CheckUnreachable()

static void CheckUnreachable ( Sema S,
AnalysisDeclContext AC 

◆ CreateIfFixit()

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.

Definition at line 798 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 

◆ DiagnoseSwitchLabelsFallthrough()

static void DiagnoseSwitchLabelsFallthrough ( Sema S,
AnalysisDeclContext AC,
bool  PerFunction 

◆ DiagnoseUninitializedConstRefUse()

static bool DiagnoseUninitializedConstRefUse ( Sema S,
const VarDecl VD,
const UninitUse Use 

◆ DiagnoseUninitializedUse()

static bool DiagnoseUninitializedUse ( Sema S,
const VarDecl VD,
const UninitUse Use,
bool  alwaysReportSelfInit = false 

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 1002 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::QualType::getQualifiers(), clang::ValueDecl::getType(), clang::UninitUse::getUser(), clang::Decl::hasAttr(), clang::Qualifiers::hasObjCLifetime(), clang::Initializer, clang::Type::isBlockPointerType(), and SuggestInitializationFixit().

◆ DiagUninitUse()

static void DiagUninitUse ( Sema S,
const VarDecl VD,
const UninitUse Use,
bool  IsCapturedByBlock 

◆ EmitDiagForCXXThrowInNonThrowingFunc()

static void EmitDiagForCXXThrowInNonThrowingFunc ( Sema S,
SourceLocation  OpLoc,
const FunctionDecl FD 

◆ flushDiagnostics()

static void flushDiagnostics ( Sema S,
const sema::FunctionScopeInfo fscope 

◆ getFallthroughAttrSpelling()

static StringRef getFallthroughAttrSpelling ( Preprocessor PP,
SourceLocation  Loc 

◆ hasRecursiveCallInPath()

static bool hasRecursiveCallInPath ( const FunctionDecl FD,
CFGBlock Block 

◆ isEnabled()

static unsigned isEnabled ( DiagnosticsEngine D,
unsigned  diag 

◆ isInLoop()

static bool isInLoop ( const ASTContext Ctx,
const ParentMap PM,
const Stmt S 

◆ isNoexcept()

static bool isNoexcept ( const FunctionDecl FD)

◆ SuggestInitializationFixit()

static bool SuggestInitializationFixit ( Sema S,
const VarDecl VD 

◆ throwEscapes()

static bool throwEscapes ( Sema S,
const CXXThrowExpr E,
CFGBlock ThrowBlock,
CFG Body 

◆ visitReachableThrows()

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

Variable Documentation

◆ SM

Definition at line 1519 of file AnalysisBasedWarnings.cpp.

Referenced by diagnoseRepeatedUseOfWeak().