From: Ted Kremenek Date: Thu, 4 Sep 2008 00:02:34 +0000 (+0000) Subject: ccc-analyzer: X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9a3c7dae00402a60a9dbe918e310214c92c5baeb;p=clang ccc-analyzer: - Capture the STDERR output of 'clang' to a file for use with crash reporting. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55749 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/utils/ccc-analyzer b/utils/ccc-analyzer index c46b6e95d7..323d529fa8 100755 --- a/utils/ccc-analyzer +++ b/utils/ccc-analyzer @@ -32,7 +32,7 @@ sub GetPPExt { } sub ProcessClangFailure { - my ($Lang, $file, $Args, $HtmlDir, $ErrorType) = @_; + my ($Lang, $file, $Args, $HtmlDir, $ErrorType, $ofile) = @_; my $Dir = "$HtmlDir/crashes"; mkpath $Dir; my ($PPH, $PPFile) = tempfile("clang_crash_XXXXXX", @@ -46,6 +46,7 @@ sub ProcessClangFailure { print OUT "$ErrorType\n"; print OUT "@$Args\n"; close OUT; + system 'mv',$ofile,"$PPFile.output"; } ##----------------------------------------------------------------------------## @@ -109,18 +110,33 @@ sub Analyze { if (defined $ENV{'CCC_UBI'}) { push @CmdArgs,"--analyzer-viz-egraph-ubigraph"; } + + # Capture the STDERR of clang and send it to a temporary file. + # Capture the STDOUT of clang and reroute it to ccc-analyzer's STDERR. + # We save the output file in the 'crashes' directory if clang encounters + # any problems with the file. + my ($ofh, $ofile) = tempfile("clang_output_XXXXXX", DIR => $HtmlDir); + my $pid = fork(); + if ($pid == 0) { + open(STDOUT,">&", \*STDERR); + open(STDERR,">&", $ofh); + exec $Cmd, @CmdArgs; + } + close ($ofh); + wait; + my $Result = $?; + + # Did the command die because of a signal? + if ($Result & 127 and $Cmd eq $Clang and defined $HtmlDir) { + ProcessClangFailure($Lang, $file, \@CmdArgsSansAnalyses, $HtmlDir, + "Crash", $ofile); + } + elsif ($Result) { + ProcessClangFailure($Lang, $file, \@CmdArgsSansAnalyses, $HtmlDir, + "Parser Rejects", $ofile); + } - my $Result = system $Cmd,@CmdArgs; - - # Did the command die because of a signal? - if ($Result & 127 and $Cmd eq $Clang and defined $HtmlDir) { - ProcessClangFailure($Lang, $file, \@CmdArgsSansAnalyses, $HtmlDir, - "Crash"); - } - elsif ($Result) { - ProcessClangFailure($Lang, $file, \@CmdArgsSansAnalyses, $HtmlDir, - "Parser Rejects"); - } + `rm -f $ofile`; } ##----------------------------------------------------------------------------##