[cfe-commits] r163925 - /cfe/trunk/tools/scan-build/scan-build

Jordan Rose jordan_rose at apple.com
Fri Sep 14 11:59:04 PDT 2012


Author: jrose
Date: Fri Sep 14 13:59:03 2012
New Revision: 163925

URL: http://llvm.org/viewvc/llvm-project?rev=163925&view=rev
Log:
scan-build: Determine the location of the clang binary before printing help.

We need the clang executable to print the list of available checkers.

Modified:
    cfe/trunk/tools/scan-build/scan-build

Modified: cfe/trunk/tools/scan-build/scan-build
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/scan-build/scan-build?rev=163925&r1=163924&r2=163925&view=diff
==============================================================================
--- cfe/trunk/tools/scan-build/scan-build (original)
+++ cfe/trunk/tools/scan-build/scan-build Fri Sep 14 13:59:03 2012
@@ -1135,73 +1135,74 @@
 }
 
 # Query clang for complete list of checkers.
-pipe(FROM_CHILD, TO_PARENT);
-my $pid = fork();
-if ($pid == 0) {
-  close FROM_CHILD;
-  open(STDOUT,">&", \*TO_PARENT);
-  open(STDERR,">&", \*TO_PARENT);
-  exec $Clang, ('-cc1', @PluginsToLoad , '-analyzer-checker-help');
-}
-close(TO_PARENT);
-my $foundCheckers = 0;
-while(<FROM_CHILD>) {
-  if (/CHECKERS:/) {
-    $foundCheckers = 1;
-    last;
-  }
-}
-if (!$foundCheckers) {
-  print "  *** Could not query Clang for the list of available checkers.";
-}
-else {
-  print("\nAVAILABLE CHECKERS:\n\n");
-  my $skip = 0;
+if (defined $Clang && -x $Clang) {
+  pipe(FROM_CHILD, TO_PARENT);
+  my $pid = fork();
+  if ($pid == 0) {
+    close FROM_CHILD;
+    open(STDOUT,">&", \*TO_PARENT);
+    open(STDERR,">&", \*TO_PARENT);
+    exec $Clang, ('-cc1', @PluginsToLoad , '-analyzer-checker-help');
+  }
+  close(TO_PARENT);
+  my $foundCheckers = 0;
   while(<FROM_CHILD>) {
-    if (/experimental/) {
-      $skip = 1;
-      next;
-    }
-    if ($skip) {
-      next if (!/^\s\s[^\s]/);
-      $skip = 0;
-    }
-    s/^\s\s//;
-    if (/^([^\s]+)/) {
-      # Is the checker enabled?
-      my $checker = $1;
-      my $enabled = 0;
-      my $aggregate = "";
-      foreach my $domain (split /\./, $checker) {
-        $aggregate .= $domain;
-        if ($EnabledCheckers{$aggregate}) {
-          $enabled =1;
-          last;
-        }
-        # append a dot, if an additional domain is added in the next iteration
-        $aggregate .= ".";
+    if (/CHECKERS:/) {
+      $foundCheckers = 1;
+      last;
+    }
+  }
+  if (!$foundCheckers) {
+    print "  *** Could not query Clang for the list of available checkers.";
+  }
+  else {
+    print("\nAVAILABLE CHECKERS:\n\n");
+    my $skip = 0;
+    while(<FROM_CHILD>) {
+      if (/experimental/) {
+        $skip = 1;
+        next;
+      }
+      if ($skip) {
+        next if (!/^\s\s[^\s]/);
+        $skip = 0;
       }
+      s/^\s\s//;
+      if (/^([^\s]+)/) {
+        # Is the checker enabled?
+        my $checker = $1;
+        my $enabled = 0;
+        my $aggregate = "";
+        foreach my $domain (split /\./, $checker) {
+          $aggregate .= $domain;
+          if ($EnabledCheckers{$aggregate}) {
+            $enabled =1;
+            last;
+          }
+          # append a dot, if an additional domain is added in the next iteration
+          $aggregate .= ".";
+        }
       
-      if ($enabled) {
-        print " + ";
+        if ($enabled) {
+          print " + ";
+        }
+        else {
+          print "   ";
+        }
       }
       else {
         print "   ";
       }
+      print $_;
     }
-    else {
-      print "   ";
-    }
-    print $_;
-  } 
+    print "\nNOTE: \"+\" indicates that an analysis is enabled by default.\n"
+  }
+  waitpid($pid,0);
+  close(FROM_CHILD);
 }
-waitpid($pid,0);
-close(FROM_CHILD);
 
 print <<ENDTEXT
 
- NOTE: "+" indicates that an analysis is enabled by default.
-
 BUILD OPTIONS
 
  You can specify any build option acceptable to the build command.
@@ -1456,11 +1457,6 @@
   $displayHelp = 1;
 }
 
-if ($displayHelp) {
-  DisplayHelp();
-  exit 1;
-}
-
 # Find 'clang'
 if (!defined $AnalyzerDiscoveryMethod) {
   $Clang = Cwd::realpath("$RealBin/bin/clang");
@@ -1468,8 +1464,10 @@
     $Clang = Cwd::realpath("$RealBin/clang");
   }
   if (!defined $Clang || ! -x $Clang) {
-    DieDiag("error: Cannot find an executable 'clang' relative to scan-build." .
-   	        "  Consider using --use-analyzer to pick a version of 'clang' to use for static analysis.\n");
+    if (!$displayHelp) {
+      DieDiag("error: Cannot find an executable 'clang' relative to scan-build." .
+   	          "  Consider using --use-analyzer to pick a version of 'clang' to use for static analysis.\n");
+    }
   }
 } 
 else {  
@@ -1493,6 +1491,11 @@
   }
 }
 
+if ($displayHelp) {
+  DisplayHelp();
+  exit 1;
+}
+
 $ClangCXX = $Clang;
 $ClangCXX =~ s/\-\d+\.\d+$//;
 $ClangCXX .= "++";





More information about the cfe-commits mailing list