]> granicus.if.org Git - clang/commitdiff
[analyzer] Add 'prune-paths' config option to disable path pruning.
authorJordan Rose <jordan_rose@apple.com>
Sat, 26 Jan 2013 01:28:15 +0000 (01:28 +0000)
committerJordan Rose <jordan_rose@apple.com>
Sat, 26 Jan 2013 01:28:15 +0000 (01:28 +0000)
This should be used for testing only. Path pruning is still on by default.

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

include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
lib/StaticAnalyzer/Core/AnalyzerOptions.cpp
lib/StaticAnalyzer/Core/BugReporter.cpp
test/Analysis/diagnostics/no-prune-paths.c [new file with mode: 0644]

index 4643c67b7002fd110b8bd3d0465f108fcc244f37..c84f6c3768c0530748ab86c22b9c4ead5790f37a 100644 (file)
@@ -297,6 +297,13 @@ public:
   /// option, which accepts the values "true" and "false".
   bool shouldAvoidSuppressingNullArgumentPaths();
 
+  /// Returns whether irrelevant parts of a bug report path should be pruned
+  /// out of the final output.
+  ///
+  /// This is controlled by the 'prune-paths' config option, which accepts the
+  /// values "true" and "false".
+  bool shouldPrunePaths();
+
   // Returns the size of the functions (in basic blocks), which should be
   // considered to be small enough to always inline.
   //
index 193e3b875d48f9b5c74d5478a74aac6c8f68d05a..e2dedb4ac89d71bcefa8a0e2a813f521cd957dd2 100644 (file)
@@ -186,3 +186,7 @@ unsigned AnalyzerOptions::getMaxTimesInlineLarge() {
 bool AnalyzerOptions::shouldSynthesizeBodies() {
   return getBooleanOption("faux-bodies", true);
 }
+
+bool AnalyzerOptions::shouldPrunePaths() {
+  return getBooleanOption("prune-paths", true);
+}
index 38069a56ac7a6a0b7640cd7940a681efe82890b0..473472872b18579105a3fac079a72119d92f5947 100644 (file)
@@ -2123,7 +2123,8 @@ bool GRBugReporter::generatePathDiagnostic(PathDiagnostic& PD,
     // Remove messages that are basically the same.
     removeRedundantMsgs(PD.getMutablePieces());
 
-    if (R->shouldPrunePath()) {
+    if (R->shouldPrunePath() &&
+        getEngine().getAnalysisManager().options.shouldPrunePaths()) {
       bool hasSomethingInteresting = RemoveUnneededCalls(PD.getMutablePieces(),
                                                          R);
       assert(hasSomethingInteresting);
diff --git a/test/Analysis/diagnostics/no-prune-paths.c b/test/Analysis/diagnostics/no-prune-paths.c
new file mode 100644 (file)
index 0000000..fab5cf8
--- /dev/null
@@ -0,0 +1,21 @@
+// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-output=text -verify %s
+// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-output=text -analyzer-config prune-paths=false -DNPRUNE=1 -verify %s
+
+// "prune-paths" is a debug option only; this is just a simple test to see that
+// it's being honored.
+
+void helper() {
+  extern void foo();
+  foo();
+}
+
+void test() {
+  helper();
+#if NPRUNE
+  // expected-note@-2 {{Calling 'helper'}}
+  // expected-note@-3 {{Returning from 'helper'}}
+#endif
+
+  *(volatile int *)0 = 1; // expected-warning {{Dereference of null pointer}}
+  // expected-note@-1 {{Dereference of null pointer}}
+}