More attribute renaming:

- Rename 'ns_returns_owned' -> 'ns_returns_retained'.
- Rename 'cf_returns_owned' -> 'cf_returns_retained'.

llvm-svn: 71182
This commit is contained in:
Ted Kremenek 2009-05-07 21:49:45 +00:00
parent 0d451813f9
commit ba53fe98e7
6 changed files with 88 additions and 24 deletions

View File

@ -78,11 +78,11 @@ public:
AT_objc_exception,
AT_cf_releases, // Clang-specific.
AT_cf_retains, // Clang-specific.
AT_cf_returns_owned, // Clang-specific.
AT_cf_returns_retained, // Clang-specific.
AT_ns_autoreleases, // Clang-specific.
AT_ns_releases, // Clang-specific.
AT_ns_retains, // Clang-specific.
AT_ns_returns_owned, // Clang-specific.
AT_ns_returns_retained, // Clang-specific.
AT_objc_gc,
AT_overloadable, // Clang-specific.
AT_packed,

View File

@ -525,6 +525,65 @@ public:
//===----------------------------------------------------------------------===//
namespace {
#if 0
class VISIBILITY_HIDDEN TrackValueBRVisitor : public BugReporterVisitor {
SVal V;
Stmt *S;
const MemRegion *R;
public:
TrackValueBRVisitor(SVal v, Stmt *s) : V(v), S(s), R(0) {}
PathDiagnosticPiece* VisitNode(const ExplodedNode<GRState> *N,
const ExplodedNode<GRState> *PrevN,
BugReporterContext& BRC) {
// Not at a expression?
if (!isa<PostStmt>(N->getLocation())) {
S = 0;
return NULL;
}
if (S)
return VisitNodeExpr(N, PrevN, BRC);
else if (R)
return VisitNodeRegion(N, PrevN, BRC);
return NULL;
}
PathDiagnosticPiece* VisitNodeExpr(const ExplodedNode<GRState> *N,
const ExplodedNode<GRState> *PrevN,
BugReporterContext& BRC) {
assert(S);
PostStmt P = cast<PostStmt>(N->getLocation());
Stmt *X = P.getStmt();
// Generate the subexpression path.
llvm::SmallVector<Stmt*, 4> SubExprPath;
ParentMap &PM = BRC.getParentMap();
for ( ; X && X != S ; X = X.getParent(X)) {
if (isa<ParenExpr>(X))
continue;
SubExprPath.push_back(L);
}
// Lost track? (X is not a subexpression of S).
if (X != S) {
S = NULL;
return NULL;
}
// Now go down the subexpression path!
}
};
#endif
class VISIBILITY_HIDDEN TrackConstraintBRVisitor : public BugReporterVisitor {
SVal Constraint;
const bool Assumption;
@ -624,7 +683,7 @@ static void registerTrackNullValue(BugReporterContext& BRC,
// base value that was dereferenced.
// assert(!V.isUnknownOrUndef());
// For now just track when a symbolic value became null.
// Is it a symbolic value?
if (loc::MemRegionVal *L = dyn_cast<loc::MemRegionVal>(&V)) {
const SubRegion *R = cast<SubRegion>(L->getRegion());
while (R && !isa<SymbolicRegion>(R)) {
@ -634,8 +693,13 @@ static void registerTrackNullValue(BugReporterContext& BRC,
if (R) {
assert(isa<SymbolicRegion>(R));
registerTrackConstraint(BRC, loc::MemRegionVal(R), false);
// registerTrackValue(BRC, S, V, N);
}
}
// Was it a hard integer?
// if (isa<nonloc::ConcreteInt>(V))
// registerTrackValue(BRC, S, V, N);
}
//===----------------------------------------------------------------------===//

View File

@ -131,10 +131,6 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) {
if (!memcmp(Str, "ext_vector_type", 15)) return AT_ext_vector_type;
if (!memcmp(Str, "ns_autoreleases", 15)) return AT_ns_autoreleases;
break;
case 16:
if (!memcmp(Str, "ns_returns_owned", 16)) return AT_ns_returns_owned;
if (!memcmp(Str, "cf_returns_owned", 16)) return AT_cf_returns_owned;
break;
case 17:
if (!memcmp(Str, "transparent_union", 17)) return AT_transparent_union;
if (!memcmp(Str, "analyzer_noreturn", 17)) return AT_analyzer_noreturn;
@ -142,6 +138,10 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo *Name) {
case 18:
if (!memcmp(Str, "warn_unused_result", 18)) return AT_warn_unused_result;
break;
case 19:
if (!memcmp(Str, "ns_returns_retained", 19)) return AT_ns_returns_retained;
if (!memcmp(Str, "cf_returns_retained", 19)) return AT_cf_returns_retained;
break;
case 22:
if (!memcmp(Str, "no_instrument_function", 22))
return AT_no_instrument_function;

View File

@ -1557,10 +1557,10 @@ static void HandleNSOwnershipReturnsAttr(Decl *d, const AttributeList &Attr,
default:
assert(0 && "invalid ownership attribute");
return;
case AttributeList::AT_cf_returns_owned:
name = "cf_returns_owned"; break;
case AttributeList::AT_ns_returns_owned:
name = "ns_returns_owned"; break;
case AttributeList::AT_cf_returns_retained:
name = "cf_returns_retained"; break;
case AttributeList::AT_ns_returns_retained:
name = "ns_returns_retained"; break;
};
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type) <<
@ -1572,10 +1572,10 @@ static void HandleNSOwnershipReturnsAttr(Decl *d, const AttributeList &Attr,
default:
assert(0 && "invalid ownership attribute");
return;
case AttributeList::AT_cf_returns_owned:
case AttributeList::AT_cf_returns_retained:
d->addAttr(::new (S.Context) CFOwnershipReturnsAttr());
return;
case AttributeList::AT_ns_returns_owned:
case AttributeList::AT_ns_returns_retained:
d->addAttr(::new (S.Context) NSOwnershipReturnsAttr());
return;
};
@ -1676,8 +1676,8 @@ static void ProcessDeclAttribute(Decl *D, const AttributeList &Attr, Sema &S) {
case AttributeList::AT_ns_releases:
case AttributeList::AT_ns_retains:
HandleNSOwnershipAttr(D, Attr, S, true); break;
case AttributeList::AT_ns_returns_owned:
case AttributeList::AT_cf_returns_owned:
case AttributeList::AT_ns_returns_retained:
case AttributeList::AT_cf_returns_retained:
HandleNSOwnershipReturnsAttr(D, Attr, S); break;
case AttributeList::AT_packed: HandlePackedAttr (D, Attr, S); break;

View File

@ -129,8 +129,8 @@ void f3() {
//===----------------------------------------------------------------------===//
@interface TestOwnershipAttr : NSObject
- (NSString*) returnsAnOwnedString __attribute__((ns_returns_owned));
- (NSString*) returnsAnOwnedCFString __attribute__((cf_returns_owned));
- (NSString*) returnsAnOwnedString __attribute__((ns_returns_retained));
- (NSString*) returnsAnOwnedCFString __attribute__((cf_returns_retained));
- (void) myRetain:(id)__attribute__((ns_retains))obj;
- (void) myCFRetain:(id)__attribute__((cf_retains))obj;
- (void) myRelease:(id)__attribute__((ns_releases))obj;

View File

@ -431,8 +431,8 @@ void rdar6704930(unsigned char *s, unsigned int length) {
//===----------------------------------------------------------------------===//
@interface TestOwnershipAttr : NSObject
- (NSString*) returnsAnOwnedString __attribute__((ns_returns_owned));
- (NSString*) returnsAnOwnedCFString __attribute__((cf_returns_owned));
- (NSString*) returnsAnOwnedString __attribute__((ns_returns_retained));
- (NSString*) returnsAnOwnedCFString __attribute__((cf_returns_retained));
- (void) myRetain:(id)__attribute__((ns_retains))obj;
- (void) myCFRetain:(id)__attribute__((cf_retains))obj;
- (void) myRelease:(id)__attribute__((ns_releases))obj;
@ -445,7 +445,7 @@ void rdar6704930(unsigned char *s, unsigned int length) {
@interface TestAttrHelper : NSObject
- (NSString*) createString:(TestOwnershipAttr*)X;
- (NSString*) createStringAttr:(TestOwnershipAttr*)X __attribute__((ns_returns_owned));
- (NSString*) createStringAttr:(TestOwnershipAttr*)X __attribute__((ns_returns_retained));
@end
@implementation TestAttrHelper
@ -465,7 +465,7 @@ void test_attr_1b(TestOwnershipAttr *X) {
NSString *str = [X returnsAnOwnedCFString]; // expected-warning{{leak}}
}
__attribute__((ns_returns_owned))
__attribute__((ns_returns_retained))
NSString* test_attr_1c(TestOwnershipAttr *X) {
NSString *str = [X returnsAnOwnedString]; // no-warning
return str;
@ -473,7 +473,7 @@ NSString* test_attr_1c(TestOwnershipAttr *X) {
void test_attr_1d_helper(NSString* str __attribute__((ns_retains)));
__attribute__((ns_returns_owned))
__attribute__((ns_returns_retained))
NSString* test_attr_1d(TestOwnershipAttr *X) {
NSString *str = [X returnsAnOwnedString]; // expected-warning{{leak}}
test_attr_1d_helper(str);