зеркало из https://github.com/microsoft/clang-1.git
OSAtomic simulation: use the original region as the location to load from,
instead of the ElementRegion obtained from casts. Test cast: the leak cannot occur bacause the true branch cannot be taken. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90964 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
eac813909b
Коммит
2f4a6b25a7
|
@ -1483,10 +1483,13 @@ static bool EvalOSAtomicCompareAndSwap(ExplodedNodeSet& Dst,
|
|||
ExplodedNodeSet Tmp;
|
||||
SVal location = state->getSVal(theValueExpr);
|
||||
// Here we should use the value type of the region as the load type.
|
||||
const MemRegion *R = location.getAsRegion();
|
||||
const MemRegion *R = location.getAsRegion()->StripCasts();
|
||||
QualType LoadTy;
|
||||
if (R)
|
||||
if (R) {
|
||||
LoadTy = cast<TypedRegion>(R)->getValueType(C);
|
||||
// Use the region as the real load location.
|
||||
location = loc::MemRegionVal(R);
|
||||
}
|
||||
Engine.EvalLoad(Tmp, theValueExpr, Pred, state, location, OSAtomicLoadTag,
|
||||
LoadTy);
|
||||
|
||||
|
|
|
@ -199,7 +199,7 @@ SVal StoreManager::CastRetrievedVal(SVal V, const TypedRegion *R,
|
|||
QualType castTy) {
|
||||
if (castTy.isNull())
|
||||
return V;
|
||||
|
||||
|
||||
assert(ValMgr.getContext().hasSameUnqualifiedType(castTy,
|
||||
R->getValueType(ValMgr.getContext())));
|
||||
return V;
|
||||
|
@ -228,4 +228,4 @@ const GRState *StoreManager::InvalidateRegions(const GRState *state,
|
|||
SVal StoreManager::getLValueCompoundLiteral(const CompoundLiteralExpr* CL,
|
||||
const LocationContext *LC) {
|
||||
return loc::MemRegionVal(MRMgr.getCompoundLiteralRegion(CL, LC));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -302,7 +302,7 @@ void testOSCompareAndSwapXXBarrier() {
|
|||
|
||||
void testOSCompareAndSwapXXBarrier_positive() {
|
||||
NSString *old = 0;
|
||||
NSString *s = [[NSString alloc] init]; // expected-warning{{leak}}
|
||||
NSString *s = [[NSString alloc] init]; // no-warning
|
||||
if (!COMPARE_SWAP_BARRIER((intptr_t) 0, (intptr_t) s, (intptr_t*) &old))
|
||||
return;
|
||||
else
|
||||
|
@ -326,7 +326,7 @@ void test_objc_atomicCompareAndSwap() {
|
|||
|
||||
void test_objc_atomicCompareAndSwap_positive() {
|
||||
NSString *old = 0;
|
||||
NSString *s = [[NSString alloc] init]; // expected-warning{{leak}}
|
||||
NSString *s = [[NSString alloc] init]; // no-warning
|
||||
if (!objc_atomicCompareAndSwapPtr(0, s, &old))
|
||||
return;
|
||||
else
|
||||
|
|
Загрузка…
Ссылка в новой задаче