diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-04-03 18:52:25 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-04-03 18:52:25 +0000 |
commit | a2fdbf5245386c92220a1dfc0ea500d281bbfdc9 (patch) | |
tree | 37f13d5eac2bdddd094e67e38a0fe7c94e7e5ee5 | |
parent | a7bf7e79cc42ab723facd3a0ce37a5c8f3d077a6 (diff) |
Better range highlight for undefined-argument checks.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49184 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Analysis/GRSimpleVals.cpp | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/lib/Analysis/GRSimpleVals.cpp b/lib/Analysis/GRSimpleVals.cpp index d7138b2466..fe4c1e70d5 100644 --- a/lib/Analysis/GRSimpleVals.cpp +++ b/lib/Analysis/GRSimpleVals.cpp @@ -91,19 +91,31 @@ public: }; class VISIBILITY_HIDDEN BadArg : public BugDescription { + SourceRange R; public: + BadArg(Expr *E) { + R = E->getSourceRange(); + } + virtual const char* getName() const { return "bad argument"; } virtual const char* getDescription() const { return "Pass-by-value argument in function is undefined."; } + + virtual void getRanges(const SourceRange*& B, const SourceRange*& E) const { + B = &R; + E = B+1; + } }; -class VISIBILITY_HIDDEN BadMsgExprArg : public BugDescription { +class VISIBILITY_HIDDEN BadMsgExprArg : public BadArg { public: + BadMsgExprArg(Expr *E) : BadArg(E) {} + virtual const char* getName() const { - return "bad receiver"; + return "bad argument"; } virtual const char* getDescription() const { return "Pass-by-value argument in message expression is undefined."; @@ -121,7 +133,7 @@ public: } virtual const char* getName() const { - return "invalid message expression"; + return "bad receiver"; } virtual const char* getDescription() const { return "Receiver in message expression is an uninitialized value."; @@ -218,11 +230,19 @@ unsigned RunGRSimpleVals(CFG& cfg, Decl& CD, ASTContext& Ctx, EmitWarning(Diag, PD, Ctx, BR, BadCall(), G, CS->bad_calls_begin(), CS->bad_calls_end()); - EmitWarning(Diag, PD, Ctx, BR, BadArg(), G, - CS->undef_arg_begin(), CS->undef_arg_end()); + for (GRExprEngine::UndefArgsTy::iterator I = CS->undef_arg_begin(), + E = CS->undef_arg_end(); I!=E; ++I) { + + BadArg Desc(I->second); + BR.EmitPathWarning(Diag, PD, Ctx, Desc, G, I->first); + } - EmitWarning(Diag, PD, Ctx, BR, BadMsgExprArg(), G, - CS->msg_expr_undef_arg_begin(), CS->msg_expr_undef_arg_end()); + for (GRExprEngine::UndefArgsTy::iterator I = CS->msg_expr_undef_arg_begin(), + E = CS->msg_expr_undef_arg_end(); I!=E; ++I) { + + BadMsgExprArg Desc(I->second); + BR.EmitPathWarning(Diag, PD, Ctx, Desc, G, I->first); + } for (GRExprEngine::UndefReceiversTy::iterator I = CS->undef_receivers_begin(), E = CS->undef_receivers_end(); I!=E; ++I) { |