Fix a bug in the dead stores checker reported in the following email:
http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-July/002157.html Essentially the observer mechanism in LiveVariables was observing block-level expressions multiple times, leading to a case where the dead store checker could see a value as dead when it was really live. llvm-svn: 53115
This commit is contained in:
@@ -133,15 +133,23 @@ public:
|
||||
};
|
||||
|
||||
void TransferFuncs::Visit(Stmt *S) {
|
||||
if (AD.Observer)
|
||||
AD.Observer->ObserveStmt(S,AD,LiveState);
|
||||
|
||||
if (S == getCurrentBlkStmt()) {
|
||||
|
||||
if (AD.Observer)
|
||||
AD.Observer->ObserveStmt(S,AD,LiveState);
|
||||
|
||||
if (getCFG().isBlkExpr(S)) LiveState(S,AD) = Dead;
|
||||
StmtVisitor<TransferFuncs,void>::Visit(S);
|
||||
}
|
||||
else if (!getCFG().isBlkExpr(S))
|
||||
else if (!getCFG().isBlkExpr(S)) {
|
||||
|
||||
if (AD.Observer)
|
||||
AD.Observer->ObserveStmt(S,AD,LiveState);
|
||||
|
||||
StmtVisitor<TransferFuncs,void>::Visit(S);
|
||||
|
||||
}
|
||||
else
|
||||
// For block-level expressions, mark that they are live.
|
||||
LiveState(S,AD) = Alive;
|
||||
|
||||
36
clang/test/Analysis/dead-stores.m
Normal file
36
clang/test/Analysis/dead-stores.m
Normal file
@@ -0,0 +1,36 @@
|
||||
// RUN: clang -warn-dead-stores -verify %s
|
||||
|
||||
typedef signed char BOOL;
|
||||
typedef unsigned int NSUInteger;
|
||||
typedef struct _NSZone NSZone;
|
||||
@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator;
|
||||
@protocol NSObject - (BOOL)isEqual:(id)object; @end
|
||||
@protocol NSCopying - (id)copyWithZone:(NSZone *)zone; @end
|
||||
@protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder; @end
|
||||
@interface NSObject <NSObject> {} @end
|
||||
extern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone);
|
||||
@interface NSValue : NSObject <NSCopying, NSCoding> - (void)getValue:(void *)value; @end
|
||||
typedef float CGFloat;
|
||||
typedef struct _NSPoint {} NSRange;
|
||||
@interface NSValue (NSValueRangeExtensions) + (NSValue *)valueWithRange:(NSRange)range;
|
||||
- (BOOL)containsObject:(id)anObject;
|
||||
@end
|
||||
@class NSURLAuthenticationChallenge;
|
||||
@interface NSResponder : NSObject <NSCoding> {} @end
|
||||
@class NSArray, NSDictionary, NSString;
|
||||
@interface NSObject (NSKeyValueBindingCreation)
|
||||
+ (void)exposeBinding:(NSString *)binding;
|
||||
- (NSArray *)exposedBindings;
|
||||
@end
|
||||
extern NSString *NSAlignmentBinding;
|
||||
|
||||
// This test case was reported as a false positive due to a bug in the
|
||||
// LiveVariables <-> DeadStores interplay. We should not flag a warning
|
||||
// here. The test case was reported in:
|
||||
// http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-July/002157.html
|
||||
void DeadStoreTest(NSObject *anObject) {
|
||||
NSArray *keys;
|
||||
if ((keys = [anObject exposedBindings]) && // no-warning
|
||||
([keys containsObject:@"name"] && [keys containsObject:@"icon"])) {}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user