summaryrefslogtreecommitdiffstats
path: root/clang/lib/StaticAnalyzer/Core/CheckerHelpers.cpp
diff options
context:
space:
mode:
authorYury Gribov <y.gribov@samsung.com>2015-11-06 11:16:31 +0000
committerYury Gribov <y.gribov@samsung.com>2015-11-06 11:16:31 +0000
commit22b4164e7df02ff1f82a99bdb908070701e747be (patch)
treef8123405a13cbda0e5f9a3a8e5c14ed595b4bb62 /clang/lib/StaticAnalyzer/Core/CheckerHelpers.cpp
parent3a618b03172f715774ce1e74a914ce7af47e5a94 (diff)
downloadbcm5719-llvm-22b4164e7df02ff1f82a99bdb908070701e747be.tar.gz
bcm5719-llvm-22b4164e7df02ff1f82a99bdb908070701e747be.zip
[analyzer] Add VforkChecker to find unsafe code in vforked process.
This checker looks for unsafe constructs in vforked process: function calls (excluding whitelist), memory write and returns. This was originally motivated by a vfork-related bug in xtables package. Patch by Yury Gribov. Differential revision: http://reviews.llvm.org/D14014 llvm-svn: 252285
Diffstat (limited to 'clang/lib/StaticAnalyzer/Core/CheckerHelpers.cpp')
-rw-r--r--clang/lib/StaticAnalyzer/Core/CheckerHelpers.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/CheckerHelpers.cpp b/clang/lib/StaticAnalyzer/Core/CheckerHelpers.cpp
index 3d9a8158154..d6aeceb1457 100644
--- a/clang/lib/StaticAnalyzer/Core/CheckerHelpers.cpp
+++ b/clang/lib/StaticAnalyzer/Core/CheckerHelpers.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerHelpers.h"
+#include "clang/AST/Decl.h"
#include "clang/AST/Expr.h"
// Recursively find any substatements containing macros
@@ -70,3 +71,26 @@ bool clang::ento::containsBuiltinOffsetOf(const Stmt *S) {
return false;
}
+
+// Extract lhs and rhs from assignment statement
+std::pair<const clang::VarDecl *, const clang::Expr *>
+clang::ento::parseAssignment(const Stmt *S) {
+ const VarDecl *VD = 0;
+ const Expr *RHS = 0;
+
+ if (auto Assign = dyn_cast_or_null<BinaryOperator>(S)) {
+ if (Assign->isAssignmentOp()) {
+ // Ordinary assignment
+ RHS = Assign->getRHS();
+ if (auto DE = dyn_cast_or_null<DeclRefExpr>(Assign->getLHS()))
+ VD = dyn_cast_or_null<VarDecl>(DE->getDecl());
+ }
+ } else if (auto PD = dyn_cast_or_null<DeclStmt>(S)) {
+ // Initialization
+ assert(PD->isSingleDecl() && "We process decls one by one");
+ VD = dyn_cast_or_null<VarDecl>(PD->getSingleDecl());
+ RHS = VD->getAnyInitializer();
+ }
+
+ return std::make_pair(VD, RHS);
+}
OpenPOWER on IntegriCloud