From: Ted Kremenek Date: Fri, 25 Feb 2011 22:00:40 +0000 (+0000) Subject: Enhance scan-build to print out available analyses using new checker registration... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ba90e8a12e6e8889035ed57fb49b40b9cd4ef990;p=clang Enhance scan-build to print out available analyses using new checker registration model. This isn't totally complete. Right now scan-build uses some heuristics to determine which checkers are enabled by default, but it cannot always tell which checkers are not enabled. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@126521 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/scan-build/scan-build b/tools/scan-build/scan-build index 80585b1f7c..f7e521f49e 100755 --- a/tools/scan-build/scan-build +++ b/tools/scan-build/scan-build @@ -1005,12 +1005,95 @@ ADVANCED OPTIONS: cost of speed. ENDTEXT -# FIXME: Print out available analyesis. +# Query clang for list of checkers that are enabled. +my %EnabledCheckers; +foreach my $lang ("c", "objective-c", "objective-c++", "c++") { + pipe(FROM_CHILD, TO_PARENT); + my $pid = fork(); + if ($pid == 0) { + close FROM_CHILD; + open(STDOUT,">&", \*TO_PARENT); + open(STDERR,">&", \*TO_PARENT); + exec $Clang, ('--analyze', '-x', $lang, '-', '-###'); + } + close(TO_PARENT); + while() { + foreach my $val (split /\s+/) { + $val =~ s/\"//g; + if ($val =~ /-analyzer-checker\=([^\s]+)/) { + $EnabledCheckers{$1} = 1; + } + } + } + waitpid($pid,0); + close(FROM_CHILD); +} + +# 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', '-analyzer-checker-help'); +} +close(TO_PARENT); +my $foundCheckers = 0; +while() { + 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() { + if (/core\.experimental/ or /debug\./ or /unix.experimental/ or /cocoa.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; + } + } + + if ($enabled) { + print " + "; + } + else { + print " "; + } + } + else { + print " "; + } + print $_; + } +} +waitpid($pid,0); +close(FROM_CHILD); print <= 2) { $ENV{'CCC_ANALYZER_VERBOSE'} = 1; } - if ($Verbose >= 3) { $ENV{'CCC_ANALYZER_LOG'} = 1; } - if ($AnalyzeHeaders) { push @AnalysesToRun,"-analyzer-opt-analyze-headers"; } - if ($AnalyzerStats) { push @AnalysesToRun, '-analyzer-stats'; } - if ($MaxLoop > 0) { push @AnalysesToRun, '-analyzer-max-loop ' . $MaxLoop; } @@ -1289,11 +1376,9 @@ $ENV{'CCC_ANALYZER_ANALYSIS'} = join ' ',@AnalysesToRun; if (defined $StoreModel) { $ENV{'CCC_ANALYZER_STORE_MODEL'} = $StoreModel; } - if (defined $ConstraintsModel) { $ENV{'CCC_ANALYZER_CONSTRAINTS_MODEL'} = $ConstraintsModel; } - if (defined $OutputFormat) { $ENV{'CCC_ANALYZER_OUTPUT_FORMAT'} = $OutputFormat; }