[cfe-commits] r106911 - in /cfe/trunk: lib/Checker/RegionStore.cpp test/Analysis/no-outofbounds.c test/Analysis/outofbound.c
Jordy Rose
jediknil at belkadan.com
Fri Jun 25 16:23:05 PDT 2010
Author: jrose
Date: Fri Jun 25 18:23:04 2010
New Revision: 106911
URL: http://llvm.org/viewvc/llvm-project?rev=106911&view=rev
Log:
When a constant size array is casted to another type, its length should be scaled as well.
Modified:
cfe/trunk/lib/Checker/RegionStore.cpp
cfe/trunk/test/Analysis/no-outofbounds.c
cfe/trunk/test/Analysis/outofbound.c
Modified: cfe/trunk/lib/Checker/RegionStore.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Checker/RegionStore.cpp?rev=106911&r1=106910&r2=106911&view=diff
==============================================================================
--- cfe/trunk/lib/Checker/RegionStore.cpp (original)
+++ cfe/trunk/lib/Checker/RegionStore.cpp Fri Jun 25 18:23:04 2010
@@ -797,23 +797,28 @@
case MemRegion::VarRegionKind: {
const VarRegion* VR = cast<VarRegion>(R);
+ ASTContext& Ctx = getContext();
// Get the type of the variable.
- QualType T = VR->getDesugaredValueType(getContext());
+ QualType T = VR->getDesugaredValueType(Ctx);
// FIXME: Handle variable-length arrays.
if (isa<VariableArrayType>(T))
return UnknownVal();
+ CharUnits EleSize = Ctx.getTypeSizeInChars(EleTy);
+
if (const ConstantArrayType* CAT = dyn_cast<ConstantArrayType>(T)) {
// return the size as signed integer.
- return ValMgr.makeIntVal(CAT->getSize(), false);
+ CharUnits RealEleSize = Ctx.getTypeSizeInChars(CAT->getElementType());
+ CharUnits::QuantityType EleRatio = RealEleSize / EleSize;
+ int64_t Length = CAT->getSize().getSExtValue();
+ return ValMgr.makeIntVal(Length * EleRatio, false);
}
// Clients can reinterpret ordinary variables as arrays, possibly of
// another type. The width is rounded down to ensure that an access is
// entirely within bounds.
- CharUnits VarSize = getContext().getTypeSizeInChars(T);
- CharUnits EleSize = getContext().getTypeSizeInChars(EleTy);
+ CharUnits VarSize = Ctx.getTypeSizeInChars(T);
return ValMgr.makeIntVal(VarSize / EleSize, false);
}
}
Modified: cfe/trunk/test/Analysis/no-outofbounds.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/no-outofbounds.c?rev=106911&r1=106910&r2=106911&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/no-outofbounds.c (original)
+++ cfe/trunk/test/Analysis/no-outofbounds.c Fri Jun 25 18:23:04 2010
@@ -12,3 +12,9 @@
short *z = (short*) &x;
short s = z[0] + z[1]; // no-warning
}
+
+void g() {
+ int a[2];
+ char *b = (char*)a;
+ b[3] = 'c'; // no-warning
+}
Modified: cfe/trunk/test/Analysis/outofbound.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/outofbound.c?rev=106911&r1=106910&r2=106911&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/outofbound.c (original)
+++ cfe/trunk/test/Analysis/outofbound.c Fri Jun 25 18:23:04 2010
@@ -43,3 +43,9 @@
p[3] = '.'; // no-warning
p[4] = '!'; // expected-warning{{out-of-bound}}
}
+
+void f6() {
+ char a[2];
+ int *b = (int*)a;
+ b[1] = 3; // expected-warning{{out-of-bound}}
+}
More information about the cfe-commits
mailing list