diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-03-27 21:23:57 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-03-27 21:23:57 +0000 |
commit | 9b3fdeaca3660789d89e3980dc7d41e8676cd901 (patch) | |
tree | 5b1dd8c3996f99870679d5a935f1071b342384c7 /lib/Analysis/BasicObjCFoundationChecks.cpp | |
parent | e5d5c204c761cc3b2a6374a15b035420f207c7af (diff) |
Add line SourceLocation to NSString checks.
Added test case to test warning about passing 'nil' to NSString's compare: method.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48896 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/BasicObjCFoundationChecks.cpp')
-rw-r--r-- | lib/Analysis/BasicObjCFoundationChecks.cpp | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/lib/Analysis/BasicObjCFoundationChecks.cpp b/lib/Analysis/BasicObjCFoundationChecks.cpp index d2a2dd6a51..d158067e56 100644 --- a/lib/Analysis/BasicObjCFoundationChecks.cpp +++ b/lib/Analysis/BasicObjCFoundationChecks.cpp @@ -43,7 +43,7 @@ class VISIBILITY_HIDDEN BasicObjCFoundationChecks : public GRSimpleAPICheck { bool isNSString(ObjCInterfaceType* T, const char* suffix); bool AuditNSString(NodeTy* N, ObjCMessageExpr* ME); - void RegisterError(NodeTy* N, Expr* E, const char *msg); + void Warn(NodeTy* N, Expr* E, const char *msg); public: BasicObjCFoundationChecks(ASTContext& ctx, ValueStateManager* vmgr) @@ -112,7 +112,7 @@ static inline bool isNil(RVal X) { //===----------------------------------------------------------------------===// -void BasicObjCFoundationChecks::RegisterError(NodeTy* N, +void BasicObjCFoundationChecks::Warn(NodeTy* N, Expr* E, const char *msg) { Errors.push_back(AnnotatedPath<ValueState>()); @@ -135,7 +135,7 @@ void BasicObjCFoundationChecks::ReportResults(Diagnostic& D) { SourceRange R = AN.getExpr()->getSourceRange(); - D.Report(diag, &AN.getString(), 1, &R, 1); + D.Report(L, diag, &AN.getString(), 1, &R, 1); } } @@ -161,16 +161,30 @@ bool BasicObjCFoundationChecks::AuditNSString(NodeTy* N, // lexical comparisons. std::string name = S.getName(); + assert (!name.empty()); + const char* cstr = &name[0]; + unsigned len = name.size(); + + ValueState* St = N->getState(); - if (name == "compare:") { - // Check if the compared NSString is nil. - Expr * E = ME->getArg(0); - RVal X = GetRVal(St, E); + switch (len) { + default: + break; + case 8: + if (!strcmp(cstr, "compare:")) { + // Check if the compared NSString is nil. + Expr * E = ME->getArg(0); - if (isNil(X)) - RegisterError(N, E, - "Argument to NSString method 'compare:' cannot be nil."); + if (isNil(GetRVal(St, E))) { + Warn(N, E, "Argument to NSString method 'compare:' cannot be nil."); + return false; + } + + break; + } + + break; } return false; |