[PATCH] D41799: [analyzer] PtrArithChecker: Update to use check::NewAllocator

Artem Dergachev via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Jan 5 17:41:10 PST 2018


NoQ created this revision.
NoQ added reviewers: dcoughlin, xazax.hun, a.sidorin, george.karpenkov, szepet.
Herald added subscribers: cfe-commits, rnkovacs.

Make use of the new callback introduced in https://reviews.llvm.org/D41406 for tracking values allocated by `operator new()` in `-analyzer-config c++-allocator-inlining=true` mode. Most of the patch actually has no intended functional changes, apart from the `StripCasts` part, which is similar to https://reviews.llvm.org/D41796 and fixes two tests in `ptr-arith.cpp` (`checkNew()` and `getArray()`).

(@xazax.hun - this is an alpha checker last touched by you, do you still have plans for it?)


Repository:
  rC Clang

https://reviews.llvm.org/D41799

Files:
  lib/StaticAnalyzer/Checkers/PointerArithChecker.cpp
  test/Analysis/ptr-arith.cpp


Index: test/Analysis/ptr-arith.cpp
===================================================================
--- test/Analysis/ptr-arith.cpp
+++ test/Analysis/ptr-arith.cpp
@@ -1,4 +1,5 @@
 // RUN: %clang_analyze_cc1 -Wno-unused-value -std=c++14 -analyzer-checker=core,debug.ExprInspection,alpha.core.PointerArithm -verify %s
+// RUN: %clang_analyze_cc1 -Wno-unused-value -std=c++14 -analyzer-checker=core,debug.ExprInspection,alpha.core.PointerArithm -analyzer-config c++-allocator-inlining=true -verify %s
 struct X {
   int *p;
   int zero;
Index: lib/StaticAnalyzer/Checkers/PointerArithChecker.cpp
===================================================================
--- lib/StaticAnalyzer/Checkers/PointerArithChecker.cpp
+++ lib/StaticAnalyzer/Checkers/PointerArithChecker.cpp
@@ -46,7 +46,7 @@
           check::PreStmt<BinaryOperator>, check::PreStmt<UnaryOperator>,
           check::PreStmt<ArraySubscriptExpr>, check::PreStmt<CastExpr>,
           check::PostStmt<CastExpr>, check::PostStmt<CXXNewExpr>,
-          check::PostStmt<CallExpr>, check::DeadSymbols> {
+          check::PostStmt<CallExpr>, check::DeadSymbols, check::NewAllocator> {
   AllocKind getKindOfNewOp(const CXXNewExpr *NE, const FunctionDecl *FD) const;
   const MemRegion *getArrayRegion(const MemRegion *Region, bool &Polymorphic,
                                   AllocKind &AKind, CheckerContext &C) const;
@@ -56,6 +56,9 @@
                                 bool PointedNeeded = false) const;
   void initAllocIdentifiers(ASTContext &C) const;
 
+  void processNewAllocatorAux(const CXXNewExpr *NE, SVal Target,
+                              CheckerContext &C) const;
+
   mutable std::unique_ptr<BuiltinBug> BT_pointerArith;
   mutable std::unique_ptr<BuiltinBug> BT_polyArray;
   mutable llvm::SmallSet<IdentifierInfo *, 8> AllocFunctions;
@@ -69,6 +72,8 @@
   void checkPostStmt(const CXXNewExpr *NE, CheckerContext &C) const;
   void checkPostStmt(const CallExpr *CE, CheckerContext &C) const;
   void checkDeadSymbols(SymbolReaper &SR, CheckerContext &C) const;
+  void checkNewAllocator(const CXXNewExpr *NE, SVal Target,
+                         CheckerContext &C) const;
 };
 } // end namespace
 
@@ -239,21 +244,34 @@
   C.addTransition(State);
 }
 
-void PointerArithChecker::checkPostStmt(const CXXNewExpr *NE,
-                                        CheckerContext &C) const {
+void PointerArithChecker::processNewAllocatorAux(const CXXNewExpr *NE,
+                                                 SVal Target,
+                                                 CheckerContext &C) const {
   const FunctionDecl *FD = NE->getOperatorNew();
   if (!FD)
     return;
 
-  AllocKind Kind = getKindOfNewOp(NE, FD);
-
-  ProgramStateRef State = C.getState();
-  SVal AllocedVal = State->getSVal(NE, C.getLocationContext());
-  const MemRegion *Region = AllocedVal.getAsRegion();
+  const MemRegion *Region = Target.getAsRegion();
   if (!Region)
     return;
-  State = State->set<RegionState>(Region, Kind);
-  C.addTransition(State);
+
+  Region = Region->StripCasts();
+
+  AllocKind Kind = getKindOfNewOp(NE, FD);
+
+  C.addTransition(C.getState()->set<RegionState>(Region, Kind));
+}
+
+void PointerArithChecker::checkPostStmt(const CXXNewExpr *NE,
+                                        CheckerContext &C) const {
+  if (!C.getAnalysisManager().getAnalyzerOptions().mayInlineCXXAllocator())
+    processNewAllocatorAux(NE, C.getSVal(NE), C);
+}
+
+void PointerArithChecker::checkNewAllocator(const CXXNewExpr *NE,
+    SVal Target, CheckerContext &C) const {
+  if (!C.wasInlined)
+    processNewAllocatorAux(NE, Target, C);
 }
 
 void PointerArithChecker::checkPostStmt(const CastExpr *CE,


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D41799.128832.patch
Type: text/x-patch
Size: 3690 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180106/c2520c7b/attachment.bin>


More information about the cfe-commits mailing list