diff options
-rw-r--r-- | include/clang/Analysis/PathSensitive/GRExprEngine.h | 24 | ||||
-rw-r--r-- | lib/Analysis/GRSimpleVals.cpp | 22 |
2 files changed, 37 insertions, 9 deletions
diff --git a/include/clang/Analysis/PathSensitive/GRExprEngine.h b/include/clang/Analysis/PathSensitive/GRExprEngine.h index f625b9eb13..96a6d4ab5e 100644 --- a/include/clang/Analysis/PathSensitive/GRExprEngine.h +++ b/include/clang/Analysis/PathSensitive/GRExprEngine.h @@ -211,7 +211,12 @@ public: bool isUndefArg(const NodeTy* N) const { return N->isSink() && - UndefArgs.find(const_cast<NodeTy*>(N)) != UndefArgs.end(); + (UndefArgs.find(const_cast<NodeTy*>(N)) != UndefArgs.end() || + MsgExprUndefArgs.find(const_cast<NodeTy*>(N)) != MsgExprUndefArgs.end()); + } + + bool isUndefReceiver(const NodeTy* N) const { + return N->isSink() && UndefReceivers.count(const_cast<NodeTy*>(N)) != 0; } typedef UndefBranchesTy::iterator undef_branch_iterator; @@ -256,6 +261,23 @@ public: undef_arg_iterator undef_arg_begin() { return UndefArgs.begin(); } undef_arg_iterator undef_arg_end() { return UndefArgs.end(); } + undef_arg_iterator msg_expr_undef_arg_begin() { + return MsgExprUndefArgs.begin(); + } + undef_arg_iterator msg_expr_undef_arg_end() { + return MsgExprUndefArgs.end(); + } + + typedef UndefReceiversTy::iterator undef_receivers_iterator; + + undef_receivers_iterator undef_receivers_begin() { + return UndefReceivers.begin(); + } + + undef_receivers_iterator undef_receivers_end() { + return UndefReceivers.end(); + } + /// ProcessStmt - Called by GRCoreEngine. Used to generate new successor /// nodes by processing the 'effects' of a block-level statement. void ProcessStmt(Stmt* S, StmtNodeBuilder& builder); diff --git a/lib/Analysis/GRSimpleVals.cpp b/lib/Analysis/GRSimpleVals.cpp index 8c538c08b4..b6e6b5087f 100644 --- a/lib/Analysis/GRSimpleVals.cpp +++ b/lib/Analysis/GRSimpleVals.cpp @@ -119,7 +119,7 @@ unsigned RunGRSimpleVals(CFG& cfg, Decl& CD, ASTContext& Ctx, EmitWarning(Diag, SrcMgr, CheckerState->null_derefs_begin(), CheckerState->null_derefs_end(), - "NULL pointer is dereferenced after it is checked for NULL."); + "Dereference of NULL pointer."); EmitWarning(Diag, SrcMgr, CheckerState->undef_derefs_begin(), @@ -127,9 +127,9 @@ unsigned RunGRSimpleVals(CFG& cfg, Decl& CD, ASTContext& Ctx, "Dereference of undefined value."); EmitWarning(Diag, SrcMgr, - CheckerState->undef_derefs_begin(), - CheckerState->undef_derefs_end(), - "Dereference of undefined value."); + CheckerState->undef_branches_begin(), + CheckerState->undef_branches_end(), + "Branch condition evaluates to an uninitialized value."); EmitWarning(Diag, SrcMgr, CheckerState->explicit_bad_divides_begin(), @@ -149,12 +149,18 @@ unsigned RunGRSimpleVals(CFG& cfg, Decl& CD, ASTContext& Ctx, EmitWarning(Diag, SrcMgr, CheckerState->undef_arg_begin(), CheckerState->undef_arg_end(), - "Pass-by-value argument in function or message expression is undefined."); + "Pass-by-value argument in function is undefined."); EmitWarning(Diag, SrcMgr, - CheckerState->undef_branches_begin(), - CheckerState->undef_branches_end(), - "Branch condition evaluates to an uninitialized value."); + CheckerState->msg_expr_undef_arg_begin(), + CheckerState->msg_expr_undef_arg_end(), + "Pass-by-value argument in message expression is undefined."); + + EmitWarning(Diag, SrcMgr, + CheckerState->undef_receivers_begin(), + CheckerState->undef_receivers_end(), + "Receiver in message expression is an uninitialized value."); + #ifndef NDEBUG if (Visualize) CheckerState->ViewGraph(TrimGraph); |