aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2011-02-12 18:50:03 +0000
committerTed Kremenek <kremenek@apple.com>2011-02-12 18:50:03 +0000
commit020c374273ab6099acbed747a7f27aebf8f0af1d (patch)
tree06da2d317b4a825e3d237eacea75713bb967a47f
parent0895d1513772eca5a20c552976209fd7f58b993f (diff)
Teach the IdempotentOperations checker to ignore property setters.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125443 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/StaticAnalyzer/Checkers/IdempotentOperationChecker.cpp11
-rw-r--r--test/Analysis/idempotent-operations.m12
2 files changed, 19 insertions, 4 deletions
diff --git a/lib/StaticAnalyzer/Checkers/IdempotentOperationChecker.cpp b/lib/StaticAnalyzer/Checkers/IdempotentOperationChecker.cpp
index 633648ec6c..7f64f8e2c4 100644
--- a/lib/StaticAnalyzer/Checkers/IdempotentOperationChecker.cpp
+++ b/lib/StaticAnalyzer/Checkers/IdempotentOperationChecker.cpp
@@ -357,8 +357,15 @@ void IdempotentOperationChecker::PostVisitBinaryOperator(
const BinaryOperator *B) {
// Add the ExplodedNode we just visited
BinaryOperatorData &Data = hash[B];
- assert(isa<BinaryOperator>(cast<StmtPoint>(C.getPredecessor()
- ->getLocation()).getStmt()));
+
+ const Stmt *predStmt
+ = cast<StmtPoint>(C.getPredecessor()->getLocation()).getStmt();
+
+ // Ignore implicit calls to setters.
+ if (isa<ObjCPropertyRefExpr>(predStmt))
+ return;
+
+ assert(isa<BinaryOperator>(predStmt));
Data.explodedNodes.Add(C.getPredecessor());
}
diff --git a/test/Analysis/idempotent-operations.m b/test/Analysis/idempotent-operations.m
index 3f68206b16..bda98fa717 100644
--- a/test/Analysis/idempotent-operations.m
+++ b/test/Analysis/idempotent-operations.m
@@ -4,10 +4,12 @@ typedef signed char BOOL;
typedef unsigned long NSUInteger;
typedef struct _NSZone NSZone;
@protocol NSObject - (BOOL)isEqual:(id)object;
-@end @interface NSObject <NSObject> {
-}
@end
+@interface NSObject {}
+ @property int locked;
+ @property(nonatomic, readonly) NSObject *media;
+@end
// <rdar://problem/8725041> - Don't flag idempotent operation warnings when
// a method may invalidate an instance variable.
@@ -32,3 +34,9 @@ typedef struct _NSZone NSZone;
}
@end
+// Test that the idempotent operations checker works in the prescence
+// of property expressions.
+void pr9116(NSObject *placeholder) {
+ int x = placeholder.media.locked = placeholder ? 1 : 0;
+}
+