[cfe-commits] r68661 - /cfe/trunk/lib/Analysis/GRExprEngine.cpp
Ted Kremenek
kremenek at apple.com
Wed Apr 8 17:00:02 PDT 2009
Author: kremenek
Date: Wed Apr 8 19:00:02 2009
New Revision: 68661
URL: http://llvm.org/viewvc/llvm-project?rev=68661&view=rev
Log:
Refactor/cleanup reasoning of nil receivers in message expressions.
Modified:
cfe/trunk/lib/Analysis/GRExprEngine.cpp
Modified: cfe/trunk/lib/Analysis/GRExprEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRExprEngine.cpp?rev=68661&r1=68660&r2=68661&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original)
+++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Wed Apr 8 19:00:02 2009
@@ -1690,8 +1690,8 @@
if (isFeasibleNull) {
// Check if the receiver was nil and the return value a struct.
- if (BR.getParentMap().isConsumedExpr(ME)) {
- if(ME->getType()->isRecordType()) {
+ if(ME->getType()->isRecordType()) {
+ if (BR.getParentMap().isConsumedExpr(ME)) {
// The [0 ...] expressions will return garbage. Flag either an
// explicit or implicit error. Because of the structure of this
// function we currently do not bifurfacte the state graph at
@@ -1704,40 +1704,50 @@
NilReceiverStructRetImplicit.insert(N);
else
NilReceiverStructRetExplicit.insert(N);
+
+ return;
}
}
- else {
- ASTContext& Ctx = getContext();
-
- // sizeof(void *)
- const uint64_t voidPtrSize = Ctx.getTypeSize(Ctx.VoidPtrTy);
-
- // sizeof(return type)
- const uint64_t returnTypeSize = Ctx.getTypeSize(ME->getType());
-
- if(voidPtrSize < returnTypeSize) {
- if (NodeTy* N = Builder->generateNode(ME, StNull, Pred)) {
- N->markAsSink();
- if(isFeasibleNotNull)
- NilReceiverLargerThanVoidPtrRetImplicit.insert(N);
- else
- NilReceiverLargerThanVoidPtrRetExplicit.insert(N);
- }
- }
- else {
- // Handle the safe cases where the return value is 0 if the receiver
- // is nil.
- SVal V = SVal::MakeZero(getBasicVals(), ME->getType());
- MakeNode(Dst, ME, Pred, BindExpr(StNull, ME, V));
+ }
+ else if (BR.getParentMap().isConsumedExpr(ME)) {
+ ASTContext& Ctx = getContext();
+ // sizeof(void *)
+ const uint64_t voidPtrSize = Ctx.getTypeSize(Ctx.VoidPtrTy);
+ // sizeof(return type)
+ const uint64_t returnTypeSize = Ctx.getTypeSize(ME->getType());
+
+ if(voidPtrSize < returnTypeSize) {
+ if (NodeTy* N = Builder->generateNode(ME, StNull, Pred)) {
+ N->markAsSink();
+ if(isFeasibleNotNull)
+ NilReceiverLargerThanVoidPtrRetImplicit.insert(N);
+ else
+ NilReceiverLargerThanVoidPtrRetExplicit.insert(N);
+
+ return;
}
}
+ else if (!isFeasibleNotNull) {
+ // FIXME: For now take the conservative approach that we only
+ // return null values if we *know* that the receiver is nil.
+ // This is because we can have suprises like:
+ //
+ // if ([[NSScreens screens]count]) {
+ // ... = [[NSScreens screens] objectAtIndex:0];
+ //
+ // In this case 'objectAtIndex:0' is guaranteed to not be zero.
+ //
+
+ // Handle the safe cases where the return value is 0 if the receiver
+ // is nil.
+ SVal V = SVal::MakeZero(getBasicVals(), ME->getType());
+ MakeNode(Dst, ME, Pred, BindExpr(StNull, ME, V));
+ return;
+ }
}
// We have handled the cases where the receiver is nil. The remainder
// of this method should assume that the receiver is not nil.
- if (!isFeasibleNotNull)
- return;
-
state = StNotNull;
}
More information about the cfe-commits
mailing list