]> granicus.if.org Git - clang/commitdiff
"Fix" bogus idempotent operations warning due to loop unrolling not unrolling enough...
authorTed Kremenek <kremenek@apple.com>
Mon, 18 Oct 2010 23:36:05 +0000 (23:36 +0000)
committerTed Kremenek <kremenek@apple.com>
Mon, 18 Oct 2010 23:36:05 +0000 (23:36 +0000)
doesn't hold.  This fix is to increase the loop unrolling count to 4, which experiments show doesn't typically impact
analysis time.  The real fix is to modify the IdempotentOperationsChecker to suppress warnings where an analysis point
could be preceded by a point where we gave up due to loop unrolling.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@116769 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Frontend/CompilerInvocation.cpp
test/Analysis/idempotent-operations-limited-loops.c [new file with mode: 0644]

index fd9b63599723ef137aa87525ac2c3a5160d52579..70bdd5b99cb7ec88ba07d23fb36b476f46cc30a4 100644 (file)
@@ -830,7 +830,7 @@ static void ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,
     Args.hasArg(OPT_analyzer_experimental_internal_checks);
   Opts.TrimGraph = Args.hasArg(OPT_trim_egraph);
   Opts.MaxNodes = Args.getLastArgIntValue(OPT_analyzer_max_nodes, 150000,Diags);
-  Opts.MaxLoop = Args.getLastArgIntValue(OPT_analyzer_max_loop, 3, Diags);
+  Opts.MaxLoop = Args.getLastArgIntValue(OPT_analyzer_max_loop, 4, Diags);
   Opts.InlineCall = Args.hasArg(OPT_analyzer_inline_call);
   Opts.IdempotentOps = Args.hasArg(OPT_analysis_WarnIdempotentOps);
 }
diff --git a/test/Analysis/idempotent-operations-limited-loops.c b/test/Analysis/idempotent-operations-limited-loops.c
new file mode 100644 (file)
index 0000000..e3043ee
--- /dev/null
@@ -0,0 +1,29 @@
+void always_warning() { int *p = 0; *p = 0xDEADBEEF; }
+
+// FIXME: False positive due to loop unrolling.  This should be fixed.
+
+int pr8403()
+{
+        int i;
+        for(i=0; i<10; i++)
+        {
+                int j;
+                for(j=0; j+1<i; j++)
+                {
+                }
+        }
+        return 0;
+}
+
+// RUN: %clang_cc1 -analyze -analyzer-store=region -analyzer-constraints=range -fblocks -analyzer-opt-analyze-nested-blocks -analyzer-check-objc-mem -analyzer-check-idempotent-operations -analyzer-max-loop 3 %s 2>&1 | FileCheck --check-prefix=Loops3 %s
+// RUN: %clang_cc1 -analyze -analyzer-store=region -analyzer-constraints=range -fblocks -analyzer-opt-analyze-nested-blocks -analyzer-check-objc-mem -analyzer-check-idempotent-operations -analyzer-max-loop 4 %s 2>&1 | FileCheck --check-prefix=Loops4 %s
+// RUN: %clang_cc1 -analyze -analyzer-store=region -analyzer-constraints=range -fblocks -analyzer-opt-analyze-nested-blocks -analyzer-check-objc-mem -analyzer-check-idempotent-operations %s 2>&1 | FileCheck --check-prefix=LoopsDefault %s
+
+// CHECK-Loops3: :1:37: warning: Dereference of null pointer
+// CHECK-Loops3: :11:27: warning: The left operand to '+' is always 0
+// CHECK-Loops3: 2 warnings generated
+// CHECK-Loops4: :1:37: warning: Dereference of null pointer
+// CHECK-Loops4: 1 warning generated.
+// CHECK-LoopsDefault: :1:37: warning: Dereference of null pointer
+// CHECK-LoopsDefault: 1 warning generated.
+