aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/GRExprEngine.cpp
diff options
context:
space:
mode:
authorZhongxing Xu <xuzhongxing@gmail.com>2008-11-23 05:52:28 +0000
committerZhongxing Xu <xuzhongxing@gmail.com>2008-11-23 05:52:28 +0000
commit1c0c23325312df5d40fe788ffcb48484f190e9a3 (patch)
treedbf3076e8d85fc1b492516d11e13a669a2e9e1c5 /lib/Analysis/GRExprEngine.cpp
parentea06544bea29ba9def49ea061def1df9e100af25 (diff)
Add out-of-bound memory access warning report code.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59903 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/GRExprEngine.cpp')
-rw-r--r--lib/Analysis/GRExprEngine.cpp21
1 files changed, 17 insertions, 4 deletions
diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp
index 6de910fc17..084796cd99 100644
--- a/lib/Analysis/GRExprEngine.cpp
+++ b/lib/Analysis/GRExprEngine.cpp
@@ -1088,7 +1088,20 @@ const GRState* GRExprEngine::EvalLocation(Stmt* Ex, NodeTy* Pred,
if (isFeasibleOutBound) {
// Report warning.
- StOutBound = 0;
+ // Make sink node manually.
+ ProgramPoint::Kind K = isLoad ? ProgramPoint::PostLoadKind
+ : ProgramPoint::PostStoreKind;
+
+ NodeTy* OOBNode = Builder->generateNode(Ex, StOutBound, Pred, K);
+
+ if (OOBNode) {
+ OOBNode->markAsSink();
+
+ if (isFeasibleInBound)
+ ImplicitOOBMemAccesses.insert(OOBNode);
+ else
+ ExplicitOOBMemAccesses.insert(OOBNode);
+ }
}
return isFeasibleInBound ? StInBound : NULL;
@@ -2529,8 +2542,8 @@ void GRExprEngine::VisitBinaryOperator(BinaryOperator* B,
SVal LHSVal;
- if (Result.isUnknown() && (Loc::IsLocType(CTy) ||
- (CTy->isScalarType() && CTy->isIntegerType()))) {
+ if (Result.isUnknown() && (Loc::IsLocType(CTy)
+ || (CTy->isScalarType() && CTy->isIntegerType()))) {
unsigned Count = Builder->getCurrentBlockCount();
@@ -2542,7 +2555,7 @@ void GRExprEngine::VisitBinaryOperator(BinaryOperator* B,
? cast<SVal>(loc::SymbolVal(Sym))
: cast<SVal>(nonloc::SymbolVal(Sym));
- // However, we need to convert the symbol to the computation type.
+ // However, we need to convert the symbol to the computation type.
Result = (LTy == CTy) ? LHSVal : EvalCast(LHSVal,CTy);
}
else {