summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-03-25 16:40:05 +0000
committerTed Kremenek <kremenek@apple.com>2008-03-25 16:40:05 +0000
commit4b55badc39cff7a910646d5a22385ede276a30b7 (patch)
tree169380d87d877b6f1a57f88dc2f363583c5ed780 /clang
parent40f061cb6605b078e5325b86b949fe69c8f6d84f (diff)
downloadbcm5719-llvm-4b55badc39cff7a910646d5a22385ede276a30b7.tar.gz
bcm5719-llvm-4b55badc39cff7a910646d5a22385ede276a30b7.zip
GRSimple analysis now outputs additional diagnostic warnings about
passing an uninitialized value to a message expresion. llvm-svn: 48776
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/Analysis/PathSensitive/GRExprEngine.h24
-rw-r--r--clang/lib/Analysis/GRSimpleVals.cpp22
2 files changed, 37 insertions, 9 deletions
diff --git a/clang/include/clang/Analysis/PathSensitive/GRExprEngine.h b/clang/include/clang/Analysis/PathSensitive/GRExprEngine.h
index f625b9eb13c..96a6d4ab5ea 100644
--- a/clang/include/clang/Analysis/PathSensitive/GRExprEngine.h
+++ b/clang/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/clang/lib/Analysis/GRSimpleVals.cpp b/clang/lib/Analysis/GRSimpleVals.cpp
index 8c538c08b40..b6e6b5087f1 100644
--- a/clang/lib/Analysis/GRSimpleVals.cpp
+++ b/clang/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);
OpenPOWER on IntegriCloud