r251697 - Revert r251621 "[Analyzer] Widening loops which do not exit" (bot failure)

Sean Eveson via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 30 04:13:08 PDT 2015


Author: seaneveson
Date: Fri Oct 30 06:13:07 2015
New Revision: 251697

URL: http://llvm.org/viewvc/llvm-project?rev=251697&view=rev
Log:
Revert r251621 "[Analyzer] Widening loops which do not exit" (bot failure)

Seems to be causing clang-cmake-mips build bot to fail (timeout)

http://lab.llvm.org:8011/builders/clang-cmake-mips/builds/10299

Removed:
    cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/LoopWidening.h
    cfe/trunk/lib/StaticAnalyzer/Core/LoopWidening.cpp
    cfe/trunk/test/Analysis/loop-widening.c
Modified:
    cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
    cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp
    cfe/trunk/lib/StaticAnalyzer/Core/CMakeLists.txt
    cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
    cfe/trunk/test/Analysis/analyzer-config.c
    cfe/trunk/test/Analysis/analyzer-config.cpp

Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h?rev=251697&r1=251696&r2=251697&view=diff
==============================================================================
--- cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h (original)
+++ cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h Fri Oct 30 06:13:07 2015
@@ -262,9 +262,6 @@ private:
   /// \sa shouldInlineLambdas
   Optional<bool> InlineLambdas;
 
-  /// \sa shouldWidenLoops
-  Optional<bool> WidenLoops;
-
   /// A helper function that retrieves option for a given full-qualified
   /// checker name.
   /// Options for checkers can be specified via 'analyzer-config' command-line
@@ -529,10 +526,6 @@ public:
   /// generated each time a LambdaExpr is visited.
   bool shouldInlineLambdas();
 
-  /// Returns true if the analysis should try to widen loops.
-  /// This is controlled by the 'widen-loops' config option.
-  bool shouldWidenLoops();
-
 public:
   AnalyzerOptions() :
     AnalysisStoreOpt(RegionStoreModel),

Removed: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/LoopWidening.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/LoopWidening.h?rev=251696&view=auto
==============================================================================
--- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/LoopWidening.h (original)
+++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/LoopWidening.h (removed)
@@ -1,37 +0,0 @@
-//===--- LoopWidening.h - Instruction class definition ----------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-///
-/// This header contains the declarations of functions which are used to widen
-/// loops which do not otherwise exit. The widening is done by invalidating
-/// anything which might be modified by the body of the loop.
-///
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_LOOPWIDENING_H
-#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_LOOPWIDENING_H
-
-#include "clang/Analysis/CFG.h"
-#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
-
-namespace clang {
-namespace ento {
-
-/// \brief Get the states that result from widening the loop.
-///
-/// Widen the loop by invalidating anything that might be modified
-/// by the loop body in any iteration.
-ProgramStateRef getWidenedLoopState(ProgramStateRef PrevState,
-                                    const LocationContext *LCtx,
-                                    unsigned BlockCount,
-                                    const Stmt *LoopStmt);
-
-} // end namespace ento
-} // end namespace clang
-
-#endif

Modified: cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp?rev=251697&r1=251696&r2=251697&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp Fri Oct 30 06:13:07 2015
@@ -338,9 +338,3 @@ bool AnalyzerOptions::shouldInlineLambda
     InlineLambdas = getBooleanOption("inline-lambdas", /*Default=*/true);
   return InlineLambdas.getValue();
 }
-
-bool AnalyzerOptions::shouldWidenLoops() {
-  if (!WidenLoops.hasValue())
-    WidenLoops = getBooleanOption("widen-loops", /*Default=*/false);
-  return WidenLoops.getValue();
-}

Modified: cfe/trunk/lib/StaticAnalyzer/Core/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/CMakeLists.txt?rev=251697&r1=251696&r2=251697&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Core/CMakeLists.txt (original)
+++ cfe/trunk/lib/StaticAnalyzer/Core/CMakeLists.txt Fri Oct 30 06:13:07 2015
@@ -28,7 +28,6 @@ add_clang_library(clangStaticAnalyzerCor
   ExprEngineObjC.cpp
   FunctionSummary.cpp
   HTMLDiagnostics.cpp
-  LoopWidening.cpp
   MemRegion.cpp
   PathDiagnostic.cpp
   PlistDiagnostics.cpp

Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp?rev=251697&r1=251696&r2=251697&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp Fri Oct 30 06:13:07 2015
@@ -26,7 +26,6 @@
 #include "clang/StaticAnalyzer/Core/CheckerManager.h"
 #include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"
 #include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h"
-#include "clang/StaticAnalyzer/Core/PathSensitive/LoopWidening.h"
 #include "llvm/ADT/ImmutableList.h"
 #include "llvm/ADT/Statistic.h"
 #include "llvm/Support/raw_ostream.h"
@@ -1396,25 +1395,8 @@ void ExprEngine::processCFGBlockEntrance
                                          ExplodedNode *Pred) {
   PrettyStackTraceLocationContext CrashInfo(Pred->getLocationContext());
 
-  // If this block is terminated by a loop and it has already been visited the
-  // maximum number of times, widen the loop.
-  unsigned int BlockCount = nodeBuilder.getContext().blockCount();
-  if (BlockCount == AMgr.options.maxBlockVisitOnPath - 1 &&
-      AMgr.options.shouldWidenLoops()) {
-    const Stmt *Term = nodeBuilder.getContext().getBlock()->getTerminator();
-    if (!(Term &&
-          (isa<ForStmt>(Term) || isa<WhileStmt>(Term) || isa<DoStmt>(Term))))
-      return;
-    // Widen.
-    const LocationContext *LCtx = Pred->getLocationContext();
-    ProgramStateRef WidenedState =
-        getWidenedLoopState(Pred->getState(), LCtx, BlockCount, Term);
-    nodeBuilder.generateNode(WidenedState, Pred);
-    return;
-  }
-
   // FIXME: Refactor this into a checker.
-  if (BlockCount >= AMgr.options.maxBlockVisitOnPath) {
+  if (nodeBuilder.getContext().blockCount() >= AMgr.options.maxBlockVisitOnPath) {
     static SimpleProgramPointTag tag(TagProviderName, "Block count exceeded");
     const ExplodedNode *Sink =
                    nodeBuilder.generateSink(Pred->getState(), Pred, &tag);

Removed: cfe/trunk/lib/StaticAnalyzer/Core/LoopWidening.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/LoopWidening.cpp?rev=251696&view=auto
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Core/LoopWidening.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Core/LoopWidening.cpp (removed)
@@ -1,68 +0,0 @@
-//===--- LoopWidening.cpp - Instruction class definition --------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-///
-/// This file contains functions which are used to widen loops. A loop may be
-/// widened to approximate the exit state(s), without analyzing every
-/// iteration. The widening is done by invalidating anything which might be
-/// modified by the body of the loop.
-///
-//===----------------------------------------------------------------------===//
-
-#include "clang/StaticAnalyzer/Core/PathSensitive/LoopWidening.h"
-
-using namespace clang;
-using namespace ento;
-
-/// Return the loops condition Stmt or NULL if LoopStmt is not a loop
-static const Expr *getLoopCondition(const Stmt *LoopStmt) {
-  switch (LoopStmt->getStmtClass()) {
-  default:
-    return NULL;
-  case Stmt::ForStmtClass:
-    return cast<ForStmt>(LoopStmt)->getCond();
-  case Stmt::WhileStmtClass:
-    return cast<WhileStmt>(LoopStmt)->getCond();
-  case Stmt::DoStmtClass:
-    return cast<DoStmt>(LoopStmt)->getCond();
-  }
-}
-
-namespace clang {
-namespace ento {
-
-ProgramStateRef getWidenedLoopState(ProgramStateRef PrevState,
-                                    const LocationContext *LCtx,
-                                    unsigned BlockCount, const Stmt *LoopStmt) {
-
-  assert(isa<ForStmt>(LoopStmt) || isa<WhileStmt>(LoopStmt) ||
-         isa<DoStmt>(LoopStmt));
-
-  // Invalidate values in the current state.
-  // TODO Make this more conservative by only invalidating values that might
-  //      be modified by the body of the loop.
-  // TODO Nested loops are currently widened as a result of the invalidation
-  //      being so inprecise. When the invalidation is improved, the handling
-  //      of nested loops will also need to be improved.
-  const StackFrameContext *STC = LCtx->getCurrentStackFrame();
-  MemRegionManager &MRMgr = PrevState->getStateManager().getRegionManager();
-  const MemRegion *Regions[] = {MRMgr.getStackLocalsRegion(STC),
-                                MRMgr.getStackArgumentsRegion(STC),
-                                MRMgr.getGlobalsRegion()};
-  RegionAndSymbolInvalidationTraits ITraits;
-  for (auto *Region : Regions) {
-    ITraits.setTrait(Region,
-                     RegionAndSymbolInvalidationTraits::TK_EntireMemSpace);
-  }
-  return PrevState->invalidateRegions(Regions, getLoopCondition(LoopStmt),
-                                      BlockCount, LCtx, true, nullptr, nullptr,
-                                      &ITraits);
-}
-
-} // end namespace ento
-} // end namespace clang

Modified: cfe/trunk/test/Analysis/analyzer-config.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/analyzer-config.c?rev=251697&r1=251696&r2=251697&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/analyzer-config.c (original)
+++ cfe/trunk/test/Analysis/analyzer-config.c Fri Oct 30 06:13:07 2015
@@ -25,7 +25,6 @@ void foo() {
 // CHECK-NEXT: min-cfg-size-treat-functions-as-large = 14
 // CHECK-NEXT: mode = deep
 // CHECK-NEXT: region-store-small-struct-limit = 2
-// CHECK-NEXT: widen-loops = false
 // CHECK-NEXT: [stats]
-// CHECK-NEXT: num-entries = 15
+// CHECK-NEXT: num-entries = 14
 

Modified: cfe/trunk/test/Analysis/analyzer-config.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/analyzer-config.cpp?rev=251697&r1=251696&r2=251697&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/analyzer-config.cpp (original)
+++ cfe/trunk/test/Analysis/analyzer-config.cpp Fri Oct 30 06:13:07 2015
@@ -36,6 +36,5 @@ public:
 // CHECK-NEXT: min-cfg-size-treat-functions-as-large = 14
 // CHECK-NEXT: mode = deep
 // CHECK-NEXT: region-store-small-struct-limit = 2
-// CHECK-NEXT: widen-loops = false
 // CHECK-NEXT: [stats]
-// CHECK-NEXT: num-entries = 20
+// CHECK-NEXT: num-entries = 19

Removed: cfe/trunk/test/Analysis/loop-widening.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/loop-widening.c?rev=251696&view=auto
==============================================================================
--- cfe/trunk/test/Analysis/loop-widening.c (original)
+++ cfe/trunk/test/Analysis/loop-widening.c (removed)
@@ -1,190 +0,0 @@
-// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-max-loop 4 -analyzer-config widen-loops=true -verify %s
-
-void clang_analyzer_eval(int);
-void clang_analyzer_warnIfReached();
-
-typedef __typeof(sizeof(int)) size_t;
-void *malloc(size_t);
-void free(void *);
-
-void loop_which_iterates_limit_times_not_widened() {
-  int i;
-  int x = 1;
-  // Check loop isn't widened by checking x isn't invalidated
-  for (i = 0; i < 1; ++i) {}
-  clang_analyzer_eval(x == 1); // expected-warning {{TRUE}}
-  for (i = 0; i < 2; ++i) {}
-  clang_analyzer_eval(x == 1); // expected-warning {{TRUE}}
-  for (i = 0; i < 3; ++i) {}
-  // FIXME loss of precision as a result of evaluating the widened loop body
-  //       *instead* of the last iteration.
-  clang_analyzer_eval(x == 1); // expected-warning {{UNKNOWN}}
-}
-
-int a_global;
-
-void loop_evaluated_before_widening() {
-  int i;
-  a_global = 1;
-  for (i = 0; i < 10; ++i) {
-    if (i == 2) {
-      // True before widening then unknown after.
-      clang_analyzer_eval(a_global == 1); // expected-warning{{TRUE}} expected-warning{{UNKNOWN}}
-    }
-  }
-  clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
-}
-
-void warnings_after_loop() {
-  int i;
-  for (i = 0; i < 10; ++i) {}
-  char *m = (char*)malloc(12);
-} // expected-warning {{Potential leak of memory pointed to by 'm'}}
-
-void for_loop_exits() {
-  int i;
-  for (i = 0; i < 10; ++i) {}
-  clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
-}
-
-void while_loop_exits() {
-  int i = 0;
-  while (i < 10) {++i;}
-  clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
-}
-
-void do_while_loop_exits() {
-  int i = 0;
-  do {++i;} while (i < 10);
-  clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
-}
-
-void loop_body_is_widened() {
-  int i = 0;
-  while (i < 100) {
-    if (i > 10) {
-      clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
-    }
-    ++i;
-  }
-  clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
-}
-
-void invariably_infinite_loop() {
-  int i = 0;
-  while (1) { ++i; }
-  clang_analyzer_warnIfReached(); // no-warning
-}
-
-void invariably_infinite_break_loop() {
-  int i = 0;
-  while (1) {
-    ++i;
-    int x = 1;
-    if (!x) break;
-  }
-  clang_analyzer_warnIfReached(); // no-warning
-}
-
-void reachable_break_loop() {
-  int i = 0;
-  while (1) {
-    ++i;
-    if (i == 100) break;
-  }
-  clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
-}
-
-void condition_constrained_true_in_loop() {
-  int i = 0;
-  while (i < 50) {
-    clang_analyzer_eval(i < 50); // expected-warning {{TRUE}}
-    ++i;
-  }
-  clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
-}
-
-void condition_constrained_false_after_loop() {
-  int i = 0;
-  while (i < 50) {
-    ++i;
-  }
-  clang_analyzer_eval(i >= 50); // expected-warning {{TRUE}}
-  clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
-}
-
-void multiple_exit_test() {
-  int x = 0;
-  int i = 0;
-  while (i < 50) {
-    if (x) {
-      i = 10;
-      break;
-    }
-    ++i;
-  }
-  // Reachable by 'normal' exit
-  if (i == 50) clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
-  // Reachable by break point
-  if (i == 10) clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
-  // Not reachable
-  if (i < 10) clang_analyzer_warnIfReached(); // no-warning
-  if (i > 10 && i < 50) clang_analyzer_warnIfReached(); // no-warning
-}
-
-void pointer_doesnt_leak_from_loop() {
-  int *h_ptr = (int *) malloc(sizeof(int));
-  for (int i = 0; i < 2; ++i) {}
-  for (int i = 0; i < 10; ++i) {} // no-warning
-  free(h_ptr);
-}
-
-int g_global;
-
-void unknown_after_loop(int s_arg) {
-  g_global = 0;
-  s_arg = 1;
-  int s_local = 2;
-  int *h_ptr = malloc(sizeof(int));
-
-  for (int i = 0; i < 10; ++i) {}
-
-  clang_analyzer_eval(g_global); // expected-warning {{UNKNOWN}}
-  clang_analyzer_eval(s_arg); // expected-warning {{UNKNOWN}}
-  clang_analyzer_eval(s_local); // expected-warning {{UNKNOWN}}
-  clang_analyzer_eval(h_ptr == 0); // expected-warning {{UNKNOWN}}
-  free(h_ptr);
-}
-
-void variable_bound_exiting_loops_widened(int x) {
-  int i = 0;
-  int t = 1;
-  while (i < x) {
-    ++i;
-  }
-  clang_analyzer_eval(t == 1); // expected-warning {{TRUE}} // expected-warning {{UNKNOWN}}
-}
-
-void nested_loop_outer_widen() {
-  int i = 0, j = 0;
-  for (i = 0; i < 10; i++) {
-    clang_analyzer_eval(i < 10); // expected-warning {{TRUE}}
-    for (j = 0; j < 2; j++) {
-      clang_analyzer_eval(j < 2); // expected-warning {{TRUE}}
-    }
-    clang_analyzer_eval(j >= 2); // expected-warning {{TRUE}}
-  }
-  clang_analyzer_eval(i >= 10); // expected-warning {{TRUE}}
-}
-
-void nested_loop_inner_widen() {
-  int i = 0, j = 0;
-  for (i = 0; i < 2; i++) {
-    clang_analyzer_eval(i < 2); // expected-warning {{TRUE}}
-    for (j = 0; j < 10; j++) {
-      clang_analyzer_eval(j < 10); // expected-warning {{TRUE}}
-    }
-    clang_analyzer_eval(j >= 10); // expected-warning {{TRUE}}
-  }
-  clang_analyzer_eval(i >= 2); // expected-warning {{TRUE}}
-}




More information about the cfe-commits mailing list