003 File Manager
Current Path:
/usr/src/contrib/llvm-project/clang/lib/StaticAnalyzer/Core
usr
/
src
/
contrib
/
llvm-project
/
clang
/
lib
/
StaticAnalyzer
/
Core
/
📁
..
📄
APSIntType.cpp
(1.53 KB)
📄
AnalysisManager.cpp
(2.59 KB)
📄
AnalyzerOptions.cpp
(6.85 KB)
📄
BasicValueFactory.cpp
(9.8 KB)
📄
BlockCounter.cpp
(2.5 KB)
📄
BugReporter.cpp
(115.16 KB)
📄
BugReporterVisitors.cpp
(105.05 KB)
📄
CallEvent.cpp
(50.1 KB)
📄
Checker.cpp
(1.42 KB)
📄
CheckerContext.cpp
(4.54 KB)
📄
CheckerHelpers.cpp
(4.38 KB)
📄
CheckerManager.cpp
(32.45 KB)
📄
CheckerRegistryData.cpp
(8.19 KB)
📄
CommonBugCategories.cpp
(1.03 KB)
📄
ConstraintManager.cpp
(1.69 KB)
📄
CoreEngine.cpp
(22.98 KB)
📄
DynamicSize.cpp
(2.76 KB)
📄
DynamicType.cpp
(11.09 KB)
📄
Environment.cpp
(8.97 KB)
📄
ExplodedGraph.cpp
(17.8 KB)
📄
ExprEngine.cpp
(119.37 KB)
📄
ExprEngineC.cpp
(43.12 KB)
📄
ExprEngineCXX.cpp
(43.21 KB)
📄
ExprEngineCallAndReturn.cpp
(43.63 KB)
📄
ExprEngineObjC.cpp
(11.57 KB)
📄
FunctionSummary.cpp
(1000 B)
📄
HTMLDiagnostics.cpp
(36.55 KB)
📄
IssueHash.cpp
(6.14 KB)
📄
LoopUnrolling.cpp
(11.23 KB)
📄
LoopWidening.cpp
(4.03 KB)
📄
MemRegion.cpp
(55.71 KB)
📄
PlistDiagnostics.cpp
(43.27 KB)
📄
PrettyStackTraceLocationContext.h
(1.3 KB)
📄
ProgramState.cpp
(21.81 KB)
📄
RangeConstraintManager.cpp
(50.62 KB)
📄
RangedConstraintManager.cpp
(8.08 KB)
📄
RegionStore.cpp
(97.14 KB)
📄
SMTConstraintManager.cpp
(657 B)
📄
SValBuilder.cpp
(23.41 KB)
📄
SVals.cpp
(12.25 KB)
📄
SarifDiagnostics.cpp
(14.69 KB)
📄
SimpleConstraintManager.cpp
(4.57 KB)
📄
SimpleSValBuilder.cpp
(50.41 KB)
📄
Store.cpp
(21.79 KB)
📄
SymbolManager.cpp
(16.21 KB)
📄
TextDiagnostics.cpp
(5.82 KB)
📄
WorkList.cpp
(8.62 KB)
Editing: LoopWidening.cpp
//===--- LoopWidening.cpp - Widen loops -------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// /// This file contains functions which are used to widen loops. A loop may be /// widened to approximate the exit state(s), without analyzing every /// iteration. The widening is done by invalidating anything which might be /// modified by the body of the loop. /// //===----------------------------------------------------------------------===// #include "clang/AST/AST.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h" #include "clang/StaticAnalyzer/Core/PathSensitive/LoopWidening.h" using namespace clang; using namespace ento; using namespace clang::ast_matchers; const auto MatchRef = "matchref"; /// Return the loops condition Stmt or NULL if LoopStmt is not a loop static const Expr *getLoopCondition(const Stmt *LoopStmt) { switch (LoopStmt->getStmtClass()) { default: return nullptr; case Stmt::ForStmtClass: return cast<ForStmt>(LoopStmt)->getCond(); case Stmt::WhileStmtClass: return cast<WhileStmt>(LoopStmt)->getCond(); case Stmt::DoStmtClass: return cast<DoStmt>(LoopStmt)->getCond(); } } namespace clang { namespace ento { ProgramStateRef getWidenedLoopState(ProgramStateRef PrevState, const LocationContext *LCtx, unsigned BlockCount, const Stmt *LoopStmt) { assert(isa<ForStmt>(LoopStmt) || isa<WhileStmt>(LoopStmt) || isa<DoStmt>(LoopStmt)); // Invalidate values in the current state. // TODO Make this more conservative by only invalidating values that might // be modified by the body of the loop. // TODO Nested loops are currently widened as a result of the invalidation // being so inprecise. When the invalidation is improved, the handling // of nested loops will also need to be improved. ASTContext &ASTCtx = LCtx->getAnalysisDeclContext()->getASTContext(); const StackFrameContext *STC = LCtx->getStackFrame(); MemRegionManager &MRMgr = PrevState->getStateManager().getRegionManager(); const MemRegion *Regions[] = {MRMgr.getStackLocalsRegion(STC), MRMgr.getStackArgumentsRegion(STC), MRMgr.getGlobalsRegion()}; RegionAndSymbolInvalidationTraits ITraits; for (auto *Region : Regions) { ITraits.setTrait(Region, RegionAndSymbolInvalidationTraits::TK_EntireMemSpace); } // References should not be invalidated. auto Matches = match( findAll(stmt(hasDescendant( varDecl(hasType(hasCanonicalType(referenceType()))).bind(MatchRef)))), *LCtx->getDecl()->getBody(), ASTCtx); for (BoundNodes Match : Matches) { const VarDecl *VD = Match.getNodeAs<VarDecl>(MatchRef); assert(VD); const VarRegion *VarMem = MRMgr.getVarRegion(VD, LCtx); ITraits.setTrait(VarMem, RegionAndSymbolInvalidationTraits::TK_PreserveContents); } // 'this' pointer is not an lvalue, we should not invalidate it. If the loop // is located in a method, constructor or destructor, the value of 'this' // pointer should remain unchanged. Ignore static methods, since they do not // have 'this' pointers. const CXXMethodDecl *CXXMD = dyn_cast<CXXMethodDecl>(STC->getDecl()); if (CXXMD && !CXXMD->isStatic()) { const CXXThisRegion *ThisR = MRMgr.getCXXThisRegion(CXXMD->getThisType(), STC); ITraits.setTrait(ThisR, RegionAndSymbolInvalidationTraits::TK_PreserveContents); } return PrevState->invalidateRegions(Regions, getLoopCondition(LoopStmt), BlockCount, LCtx, true, nullptr, nullptr, &ITraits); } } // end namespace ento } // end namespace clang
Upload File
Create Folder