From: Anton Yartsev Date: Fri, 11 Sep 2015 20:41:09 +0000 (+0000) Subject: [analyzer] Improve behavior if Clang not found. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a1a0ff0dc322d5d7e1704ede5bd3ce4864d037d4;p=clang [analyzer] Improve behavior if Clang not found. - Eliminate 'No such file or directory at scan-build line ...' error if '$RealBin/bin/clang' or '$RealBin/clang' directory does not exist. - Eliminate 'Use of uninitialized value $Clang in concatenation (.) or string at scan-build line ...' error if help is displayed while $Clang was not found. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@247466 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/scan-build/scan-build b/tools/scan-build/scan-build index 1b968766dc..60da315dc2 100755 --- a/tools/scan-build/scan-build +++ b/tools/scan-build/scan-build @@ -1258,39 +1258,40 @@ LOADING CHECKERS: -load-plugin [plugin library] ENDTEXT - # Query clang for list of checkers that are enabled. - - # create a list to load the plugins via the 'Xclang' command line - # argument - my @PluginLoadCommandline_xclang; - foreach my $param ( @{$Options{PluginsToLoad}} ) { - push ( @PluginLoadCommandline_xclang, "-Xclang" ); - push ( @PluginLoadCommandline_xclang, "-load" ); - push ( @PluginLoadCommandline_xclang, "-Xclang" ); - push ( @PluginLoadCommandline_xclang, $param ); - } - - my %EnabledCheckers; - foreach my $lang ("c", "objective-c", "objective-c++", "c++") { - my $ExecLine = join(' ', qq/"$Clang"/, @PluginLoadCommandline_xclang, "--analyze", "-x", $lang, "-", "-###", "2>&1", "|"); - open(PS, $ExecLine); - while () { - foreach my $val (split /\s+/) { - $val =~ s/\"//g; - if ($val =~ /-analyzer-checker\=([^\s]+)/) { - $EnabledCheckers{$1} = 1; + if (defined $Clang && -x $Clang) { + # Query clang for list of checkers that are enabled. + + # create a list to load the plugins via the 'Xclang' command line + # argument + my @PluginLoadCommandline_xclang; + foreach my $param ( @{$Options{PluginsToLoad}} ) { + push ( @PluginLoadCommandline_xclang, "-Xclang" ); + push ( @PluginLoadCommandline_xclang, "-load" ); + push ( @PluginLoadCommandline_xclang, "-Xclang" ); + push ( @PluginLoadCommandline_xclang, $param ); + } + + my %EnabledCheckers; + foreach my $lang ("c", "objective-c", "objective-c++", "c++") { + my $ExecLine = join(' ', qq/"$Clang"/, @PluginLoadCommandline_xclang, "--analyze", "-x", $lang, "-", "-###", "2>&1", "|"); + open(PS, $ExecLine); + while () { + foreach my $val (split /\s+/) { + $val =~ s/\"//g; + if ($val =~ /-analyzer-checker\=([^\s]+)/) { + $EnabledCheckers{$1} = 1; + } } } } - } - # Query clang for complete list of checkers. - my @PluginLoadCommandline; - foreach my $param ( @{$Options{PluginsToLoad}} ) { - push ( @PluginLoadCommandline, "-load" ); - push ( @PluginLoadCommandline, $param ); - } - if (defined $Clang && -x $Clang) { + # Query clang for complete list of checkers. + my @PluginLoadCommandline; + foreach my $param ( @{$Options{PluginsToLoad}} ) { + push ( @PluginLoadCommandline, "-load" ); + push ( @PluginLoadCommandline, $param ); + } + my $ExecLine = join(' ', qq/"$Clang"/, "-cc1", @PluginLoadCommandline, "-analyzer-checker-help", "2>&1", "|"); open(PS, $ExecLine); my $foundCheckers = 0; @@ -1634,6 +1635,7 @@ if (!@ARGV) { } ProcessArgs(\@ARGV); +# All arguments are now shifted from @ARGV. The rest is a build command, if any. if (!@ARGV and !$RequestDisplayHelp) { ErrorDiag("No build command specified.\n\n"); @@ -1642,9 +1644,9 @@ if (!@ARGV and !$RequestDisplayHelp) { # Find 'clang' if (!defined $Options{AnalyzerDiscoveryMethod}) { - $Clang = Cwd::realpath("$RealBin/bin/clang"); + $Clang = Cwd::realpath("$RealBin/bin/clang") if (-d "$RealBin/bin/clang"); if (!defined $Clang || ! -x $Clang) { - $Clang = Cwd::realpath("$RealBin/clang"); + $Clang = Cwd::realpath("$RealBin/clang") if (-d "$RealBin/clang"); } if (!defined $Clang || ! -x $Clang) { if (!$RequestDisplayHelp && !$ForceDisplayHelp) {