summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis/UndefinedAssignmentChecker.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2009-11-04 04:24:16 +0000
committerTed Kremenek <kremenek@apple.com>2009-11-04 04:24:16 +0000
commitef910047b287c79fb810ba252372961c82c0533f (patch)
treedbb99d158eccd41865412415c2afdb1def7b769d /clang/lib/Analysis/UndefinedAssignmentChecker.cpp
parent9db38f6f835581e25b5a00bd42ec409a4aa9679f (diff)
downloadbcm5719-llvm-ef910047b287c79fb810ba252372961c82c0533f.tar.gz
bcm5719-llvm-ef910047b287c79fb810ba252372961c82c0533f.zip
Catch uses of undefined values when they are used in assignment, thus catching such bugs closer to the source.
llvm-svn: 86003
Diffstat (limited to 'clang/lib/Analysis/UndefinedAssignmentChecker.cpp')
-rw-r--r--clang/lib/Analysis/UndefinedAssignmentChecker.cpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/clang/lib/Analysis/UndefinedAssignmentChecker.cpp b/clang/lib/Analysis/UndefinedAssignmentChecker.cpp
new file mode 100644
index 00000000000..9df58844dc3
--- /dev/null
+++ b/clang/lib/Analysis/UndefinedAssignmentChecker.cpp
@@ -0,0 +1,59 @@
+//===--- UndefinedAssignmentChecker.h ---------------------------*- C++ -*--==//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This defines UndefinedAssginmentChecker, a builtin check in GRExprEngine that
+// checks for assigning undefined values.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/Analysis/PathSensitive/Checkers/UndefinedAssignmentChecker.h"
+#include "clang/Analysis/PathSensitive/BugReporter.h"
+
+using namespace clang;
+
+void *UndefinedAssignmentChecker::getTag() {
+ static int x = 0;
+ return &x;
+}
+
+void UndefinedAssignmentChecker::PreVisitBind(CheckerContext &C,
+ const Stmt *S,
+ SVal location,
+ SVal val) {
+ if (!val.isUndef())
+ return;
+
+ ExplodedNode *N = C.GenerateNode(S, true);
+
+ if (!N)
+ return;
+
+ if (!BT)
+ BT = new BugType("Assigned value is garbage or undefined",
+ "Logic error");
+
+ // Generate a report for this bug.
+ EnhancedBugReport *R = new EnhancedBugReport(*BT, BT->getName().c_str(), N);
+ const Expr *ex = 0;
+
+ if (const BinaryOperator *B = dyn_cast<BinaryOperator>(S))
+ ex = B->getRHS();
+ else if (const DeclStmt *DS = dyn_cast<DeclStmt>(S)) {
+ const VarDecl* VD = dyn_cast<VarDecl>(DS->getSingleDecl());
+ ex = VD->getInit();
+ }
+
+ if (ex) {
+ R->addRange(ex->getSourceRange());
+ R->addVisitorCreator(bugreporter::registerTrackNullOrUndefValue, ex);
+ }
+
+ C.EmitReport(R);
+}
+
OpenPOWER on IntegriCloud