[llvm-branch-commits] [cfe-branch] r275902 - Merging r275880:

Hans Wennborg via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Mon Jul 18 13:12:49 PDT 2016


Author: hans
Date: Mon Jul 18 15:12:49 2016
New Revision: 275902

URL: http://llvm.org/viewvc/llvm-project?rev=275902&view=rev
Log:
Merging r275880:
------------------------------------------------------------------------
r275880 | dcoughlin | 2016-07-18 11:57:50 -0700 (Mon, 18 Jul 2016) | 3 lines

Revert "[analyzer] Add checker modeling potential C++ self-assignment"

This reverts commit r275820. It is failing on the bots.
------------------------------------------------------------------------

Removed:
    cfe/branches/release_39/lib/StaticAnalyzer/Checkers/CXXSelfAssignmentChecker.cpp
    cfe/branches/release_39/test/Analysis/self-assign.cpp
Modified:
    cfe/branches/release_39/   (props changed)
    cfe/branches/release_39/include/clang/StaticAnalyzer/Checkers/Checkers.td
    cfe/branches/release_39/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h
    cfe/branches/release_39/lib/StaticAnalyzer/Checkers/CMakeLists.txt
    cfe/branches/release_39/lib/StaticAnalyzer/Core/BugReporter.cpp
    cfe/branches/release_39/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
    cfe/branches/release_39/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp

Propchange: cfe/branches/release_39/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Jul 18 15:12:49 2016
@@ -1,3 +1,4 @@
 /cfe/branches/type-system-rewrite:134693-134817
+/cfe/trunk:275880
 /cfe/trunk/test:170344
 /cfe/trunk/test/SemaTemplate:126920

Modified: cfe/branches/release_39/include/clang/StaticAnalyzer/Checkers/Checkers.td
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_39/include/clang/StaticAnalyzer/Checkers/Checkers.td?rev=275902&r1=275901&r2=275902&view=diff
==============================================================================
--- cfe/branches/release_39/include/clang/StaticAnalyzer/Checkers/Checkers.td (original)
+++ cfe/branches/release_39/include/clang/StaticAnalyzer/Checkers/Checkers.td Mon Jul 18 15:12:49 2016
@@ -247,10 +247,6 @@ def NewDeleteLeaksChecker : Checker<"New
   HelpText<"Check for memory leaks. Traces memory managed by new/delete.">,
   DescFile<"MallocChecker.cpp">;
 
-def CXXSelfAssignmentChecker : Checker<"SelfAssignment">,
-  HelpText<"Checks C++ copy and move assignment operators for self assignment">,
-  DescFile<"CXXSelfAssignmentChecker.cpp">;
-
 } // end: "cplusplus"
 
 let ParentPackage = CplusplusAlpha in {

Modified: cfe/branches/release_39/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_39/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h?rev=275902&r1=275901&r2=275902&view=diff
==============================================================================
--- cfe/branches/release_39/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h (original)
+++ cfe/branches/release_39/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitor.h Mon Jul 18 15:12:49 2016
@@ -331,22 +331,6 @@ public:
                                  BugReport &BR) override;
 };
 
-class CXXSelfAssignmentBRVisitor final
-  : public BugReporterVisitorImpl<CXXSelfAssignmentBRVisitor> {
-  
-  bool Satisfied;
-
-public:
-  CXXSelfAssignmentBRVisitor() : Satisfied(false) {}
-
-  void Profile(llvm::FoldingSetNodeID &ID) const override {}
-
-  PathDiagnosticPiece *VisitNode(const ExplodedNode *Succ,
-                                 const ExplodedNode *Pred,
-                                 BugReporterContext &BRC,
-                                 BugReport &BR) override;
-};
-
 namespace bugreporter {
 
 /// Attempts to add visitors to trace a null or undefined value back to its

Modified: cfe/branches/release_39/lib/StaticAnalyzer/Checkers/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_39/lib/StaticAnalyzer/Checkers/CMakeLists.txt?rev=275902&r1=275901&r2=275902&view=diff
==============================================================================
--- cfe/branches/release_39/lib/StaticAnalyzer/Checkers/CMakeLists.txt (original)
+++ cfe/branches/release_39/lib/StaticAnalyzer/Checkers/CMakeLists.txt Mon Jul 18 15:12:49 2016
@@ -22,7 +22,6 @@ add_clang_library(clangStaticAnalyzerChe
   CheckerDocumentation.cpp
   ChrootChecker.cpp
   ClangCheckers.cpp
-  CXXSelfAssignmentChecker.cpp
   DeadStoresChecker.cpp
   DebugCheckers.cpp
   DereferenceChecker.cpp

Removed: cfe/branches/release_39/lib/StaticAnalyzer/Checkers/CXXSelfAssignmentChecker.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_39/lib/StaticAnalyzer/Checkers/CXXSelfAssignmentChecker.cpp?rev=275901&view=auto
==============================================================================
--- cfe/branches/release_39/lib/StaticAnalyzer/Checkers/CXXSelfAssignmentChecker.cpp (original)
+++ cfe/branches/release_39/lib/StaticAnalyzer/Checkers/CXXSelfAssignmentChecker.cpp (removed)
@@ -1,62 +0,0 @@
-//=== CXXSelfAssignmentChecker.cpp -----------------------------*- C++ -*--===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file defines CXXSelfAssignmentChecker, which tests all custom defined
-// copy and move assignment operators for the case of self assignment, thus
-// where the parameter refers to the same location where the this pointer
-// points to. The checker itself does not do any checks at all, but it
-// causes the analyzer to check every copy and move assignment operator twice:
-// once for when 'this' aliases with the parameter and once for when it may not.
-// It is the task of the other enabled checkers to find the bugs in these two
-// different cases.
-//
-//===----------------------------------------------------------------------===//
-
-#include "ClangSACheckers.h"
-#include "clang/StaticAnalyzer/Core/Checker.h"
-#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
-
-using namespace clang;
-using namespace ento;
-
-namespace {
-
-class CXXSelfAssignmentChecker : public Checker<check::BeginFunction> {
-public:
-  CXXSelfAssignmentChecker();
-  void checkBeginFunction(CheckerContext &C) const;
-};
-}
-
-CXXSelfAssignmentChecker::CXXSelfAssignmentChecker() {}
-
-void CXXSelfAssignmentChecker::checkBeginFunction(CheckerContext &C) const {
-  if (!C.inTopFrame())
-    return;
-  const auto *LCtx = C.getLocationContext();
-  const auto *MD = dyn_cast<CXXMethodDecl>(LCtx->getDecl());
-  if (!MD)
-    return;
-  if (!MD->isCopyAssignmentOperator() && !MD->isMoveAssignmentOperator())
-    return;
-  auto &State = C.getState();
-  auto &SVB = C.getSValBuilder();
-  auto ThisVal =
-      State->getSVal(SVB.getCXXThis(MD, LCtx->getCurrentStackFrame()));
-  auto Param = SVB.makeLoc(State->getRegion(MD->getParamDecl(0), LCtx));
-  auto ParamVal = State->getSVal(Param);
-  ProgramStateRef SelfAssignState = State->bindLoc(Param, ThisVal);
-  C.addTransition(SelfAssignState);
-  ProgramStateRef NonSelfAssignState = State->bindLoc(Param, ParamVal);
-  C.addTransition(NonSelfAssignState);
-}
-
-void ento::registerCXXSelfAssignmentChecker(CheckerManager &Mgr) {
-  Mgr.registerChecker<CXXSelfAssignmentChecker>();
-}

Modified: cfe/branches/release_39/lib/StaticAnalyzer/Core/BugReporter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_39/lib/StaticAnalyzer/Core/BugReporter.cpp?rev=275902&r1=275901&r2=275902&view=diff
==============================================================================
--- cfe/branches/release_39/lib/StaticAnalyzer/Core/BugReporter.cpp (original)
+++ cfe/branches/release_39/lib/StaticAnalyzer/Core/BugReporter.cpp Mon Jul 18 15:12:49 2016
@@ -3104,7 +3104,6 @@ bool GRBugReporter::generatePathDiagnost
     R->addVisitor(llvm::make_unique<NilReceiverBRVisitor>());
     R->addVisitor(llvm::make_unique<ConditionBRVisitor>());
     R->addVisitor(llvm::make_unique<LikelyFalsePositiveSuppressionBRVisitor>());
-    R->addVisitor(llvm::make_unique<CXXSelfAssignmentBRVisitor>());
 
     BugReport::VisitorList visitors;
     unsigned origReportConfigToken, finalReportConfigToken;

Modified: cfe/branches/release_39/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_39/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp?rev=275902&r1=275901&r2=275902&view=diff
==============================================================================
--- cfe/branches/release_39/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp (original)
+++ cfe/branches/release_39/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp Mon Jul 18 15:12:49 2016
@@ -1693,53 +1693,3 @@ UndefOrNullArgVisitor::VisitNode(const E
   }
   return nullptr;
 }
-
-PathDiagnosticPiece *
-CXXSelfAssignmentBRVisitor::VisitNode(const ExplodedNode *Succ,
-                                      const ExplodedNode *Pred,
-                                      BugReporterContext &BRC, BugReport &BR) {
-  if (Satisfied)
-    return nullptr;
-
-  auto Edge = Succ->getLocation().getAs<BlockEdge>();
-  if (!Edge.hasValue())
-    return nullptr;
-
-  auto Tag = Edge->getTag();
-  if (!Tag)
-    return nullptr;
-
-  if (Tag->getTagDescription() != "cplusplus.SelfAssignment")
-    return nullptr;
-
-  Satisfied = true;
-
-  const auto *Met =
-      dyn_cast<CXXMethodDecl>(Succ->getCodeDecl().getAsFunction());
-  assert(Met && "Not a C++ method.");
-  assert((Met->isCopyAssignmentOperator() || Met->isMoveAssignmentOperator()) &&
-         "Not a copy/move assignment operator.");
-
-  const auto *LCtx = Edge->getLocationContext();
-
-  const auto &State = Succ->getState();
-  auto &SVB = State->getStateManager().getSValBuilder();
-
-  const auto Param =
-      State->getSVal(State->getRegion(Met->getParamDecl(0), LCtx));
-  const auto This =
-      State->getSVal(SVB.getCXXThis(Met, LCtx->getCurrentStackFrame()));
-
-  auto L = PathDiagnosticLocation::create(Met, BRC.getSourceManager());
-
-  if (!L.isValid() || !L.asLocation().isValid())
-    return nullptr;
-
-  const auto Msg = "Assuming " + Met->getParamDecl(0)->getName() +
-                   ((Param == This) ? " == " : " != ") + "*this";
-
-  auto *Piece = new PathDiagnosticEventPiece(L, Msg.str());
-  Piece->addRange(Met->getSourceRange());
-
-  return Piece;
-}

Modified: cfe/branches/release_39/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_39/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp?rev=275902&r1=275901&r2=275902&view=diff
==============================================================================
--- cfe/branches/release_39/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp (original)
+++ cfe/branches/release_39/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp Mon Jul 18 15:12:49 2016
@@ -431,13 +431,6 @@ static bool shouldSkipFunction(const Dec
   //   Count naming convention errors more aggressively.
   if (isa<ObjCMethodDecl>(D))
     return false;
-  // We also want to reanalyze all C++ copy and move assignment operators to
-  // separately check the two cases where 'this' aliases with the parameter and
-  // where it may not. (cplusplus.SelfAssignmentChecker)
-  if (const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
-    if (MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())
-      return false;
-  }
 
   // Otherwise, if we visited the function before, do not reanalyze it.
   return Visited.count(D);
@@ -449,7 +442,9 @@ AnalysisConsumer::getInliningModeForFunc
   // We want to reanalyze all ObjC methods as top level to report Retain
   // Count naming convention errors more aggressively. But we should tune down
   // inlining when reanalyzing an already inlined function.
-  if (Visited.count(D) && isa<ObjCMethodDecl>(D)) {
+  if (Visited.count(D)) {
+    assert(isa<ObjCMethodDecl>(D) &&
+           "We are only reanalyzing ObjCMethods.");
     const ObjCMethodDecl *ObjCM = cast<ObjCMethodDecl>(D);
     if (ObjCM->getMethodFamily() != OMF_init)
       return ExprEngine::Inline_Minimal;

Removed: cfe/branches/release_39/test/Analysis/self-assign.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_39/test/Analysis/self-assign.cpp?rev=275901&view=auto
==============================================================================
--- cfe/branches/release_39/test/Analysis/self-assign.cpp (original)
+++ cfe/branches/release_39/test/Analysis/self-assign.cpp (removed)
@@ -1,89 +0,0 @@
-// RUN: %clang_cc1 -std=c++11 -analyze -analyzer-checker=core,cplusplus,unix.Malloc,debug.ExprInspection %s -verify -analyzer-output=text
-
-extern "C" char *strdup(const char* s);
-extern "C" void free(void* ptr);
-
-namespace std {
-template<class T> struct remove_reference      { typedef T type; };
-template<class T> struct remove_reference<T&>  { typedef T type; };
-template<class T> struct remove_reference<T&&> { typedef T type; };
-template<class T> typename remove_reference<T>::type&& move(T&& t);
-}
-
-void clang_analyzer_eval(int);
-
-class StringUsed {
-public:
-  StringUsed(const char *s = "") : str(strdup(s)) {}
-  StringUsed(const StringUsed &rhs) : str(strdup(rhs.str)) {}
-  ~StringUsed();
-  StringUsed& operator=(const StringUsed &rhs);
-  StringUsed& operator=(StringUsed &&rhs);
-  operator const char*() const;
-private:
-  char *str;
-};
-
-StringUsed::~StringUsed() {
-  free(str);
-}
-
-StringUsed& StringUsed::operator=(const StringUsed &rhs) { // expected-note{{Assuming rhs == *this}} expected-note{{Assuming rhs == *this}} expected-note{{Assuming rhs != *this}}
-  clang_analyzer_eval(*this == rhs); // expected-warning{{TRUE}} expected-warning{{UNKNOWN}} expected-note{{TRUE}} expected-note{{UNKNOWN}}
-  free(str); // expected-note{{Memory is released}}
-  str = strdup(rhs.str); // expected-warning{{Use of memory after it is freed}}  expected-note{{Use of memory after it is freed}}
-  return *this;
-}
-
-StringUsed& StringUsed::operator=(StringUsed &&rhs) { // expected-note{{Assuming rhs == *this}} expected-note{{Assuming rhs != *this}}
-  clang_analyzer_eval(*this == rhs); // expected-warning{{TRUE}} expected-warning{{UNKNOWN}} expected-note{{TRUE}} expected-note{{UNKNOWN}}
-  str = rhs.str;
-  rhs.str = nullptr; // FIXME: An improved leak checker should warn here
-  return *this;
-}
-
-StringUsed::operator const char*() const {
-  return str;
-}
-
-class StringUnused {
-public:
-  StringUnused(const char *s = "") : str(strdup(s)) {}
-  StringUnused(const StringUnused &rhs) : str(strdup(rhs.str)) {}
-  ~StringUnused();
-  StringUnused& operator=(const StringUnused &rhs);
-  StringUnused& operator=(StringUnused &&rhs);
-  operator const char*() const;
-private:
-  char *str;
-};
-
-StringUnused::~StringUnused() {
-  free(str);
-}
-
-StringUnused& StringUnused::operator=(const StringUnused &rhs) { // expected-note{{Assuming rhs == *this}} expected-note{{Assuming rhs == *this}} expected-note{{Assuming rhs != *this}}
-  clang_analyzer_eval(*this == rhs); // expected-warning{{TRUE}} expected-warning{{UNKNOWN}} expected-note{{TRUE}} expected-note{{UNKNOWN}}
-  free(str); // expected-note{{Memory is released}}
-  str = strdup(rhs.str); // expected-warning{{Use of memory after it is freed}}  expected-note{{Use of memory after it is freed}}
-  return *this;
-}
-
-StringUnused& StringUnused::operator=(StringUnused &&rhs) { // expected-note{{Assuming rhs == *this}} expected-note{{Assuming rhs != *this}}
-  clang_analyzer_eval(*this == rhs); // expected-warning{{TRUE}} expected-warning{{UNKNOWN}} expected-note{{TRUE}} expected-note{{UNKNOWN}}
-  str = rhs.str;
-  rhs.str = nullptr; // FIXME: An improved leak checker should warn here
-  return *this;
-}
-
-StringUnused::operator const char*() const {
-  return str;
-}
-
-
-int main() {
-  StringUsed s1 ("test"), s2;
-  s2 = s1;
-  s2 = std::move(s1);
-  return 0;
-}




More information about the llvm-branch-commits mailing list