[cfe-dev] Learning how to use and deploy 'scan-build'

Anna Zaks via cfe-dev cfe-dev at lists.llvm.org
Mon Nov 14 11:41:32 PST 2016


Great to hear that you found a solution!

Feel free to submit a patch; it might help others with the same setup:
http://llvm.org/docs/Phabricator.html
http://llvm.org/docs/DeveloperPolicy.html

Anna.
> On Nov 13, 2016, at 2:55 AM, Martin J. O'Riordan <Martin.ORiordan at movidius.com> wrote:
> 
> Following up on this, I have made a change to my local copy of ‘ccc-analyzer’ that compensates for the Windows vs Cygwin path differences.  In the subroutine ‘sub Analyze’ I have changed the lines:
>  
>     # Create arguments for doing static analysis.
>     if (defined $ResultFile) {
>       push @Args, '-o', $ResultFile;
>     }
>     elsif (defined $HtmlDir) {
>       push @Args, '-o', $HtmlDir;
>     }
> to:
>     # Create arguments for doing static analysis.
>     if (defined $ResultFile) {
>       push @Args, '-o', $ResultFile;
>     }
>     elsif (defined $HtmlDir) {
> +     # Convert the output path to the Windows form on Cygwin
> +     if ($^O =~/cygwin/) {
> +       my $winHtmlDir = `cygpath -m $HtmlDir`;
> +       $winHtmlDir =~ tr/\n\r//d;  # Strip newlines
> +       push @Args, '-o', $winHtmlDir;
> +     } else {
>         push @Args, '-o', $HtmlDir;
> +     }
>     }
>  
> I have used ‘tr’ rather than ‘chomp’ because I have found that ‘chomp’ does not always remove CRs and is not as robust as using this ‘tr’ pattern.  Also, I use the ‘-m’ option to ‘cygpath’ rather than ‘-w’ because it uses the ‘/’ character for directory path separators rather than ‘\’.  The latter causes all sorts of trouble in Perl, Python, Bash and so on; while Windows applications are perfectly happy with the ‘/’ character (WIN32’s file open functions accept either).
>  
> All the best and thanks to each of you for your advice and help,
>  
>             MartinO
>  
> From: Martin J. O'Riordan [mailto:martin.oriordan at movidius.com <mailto:martin.oriordan at movidius.com>] 
> Sent: 12 November 2016 21:48
> To: 'ganna at apple.com <mailto:ganna at apple.com>' <ganna at apple.com <mailto:ganna at apple.com>>
> Cc: 'Aleksei Sidorin' <a.sidorin at samsung.com <mailto:a.sidorin at samsung.com>>; 'cfe-dev' <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>>
> Subject: RE: [cfe-dev] Learning how to use and deploy 'scan-build'
>  
> Hi again.  I have solved the problem that I was having but it is obscure so I will explain here.
>  
> Turns out that the problem I am having is a consequence of Windows versus Cygwin paths.  Running the same scenario on Linux is fine (after I had an example with something worth reporting).
>  
> In summary the issue is the path that is passed using ‘-o’ to the Visual Studio built ‘clang.exe’ which only understands Windows paths, but at line #1490 in ‘scan-build’ the path is constructed using:
>  
> $Options{OutputDir} = abs_path($OutDir);
>  
> In my case the path for ‘-o check’ becomes:
>  
> /src/tests/ScanBuild/check
>  
> But in my Cygwin setup, ‘/src/’ is actually a ‘mount’ of the directory ‘S:\Projects\’ - I use mounts so that my scripts are portable across Linux and Windows systems.  I tend to live in the ‘bash’ shell on Windows and Linux.  If I was passing the path to ‘clang.exe’ from a Makefile, I would typically use ‘cygpath -m’ to get the Windows path, but because this is happening in the generic ‘scan-build’ Perl wrapper, it passes the Linux/Cygwin version of the path, but to the VS built ‘clang.exe’.
>  
> So the data for the reports “is” being created by ‘clang’, but it is being placed at:
>  
> D:\src\tests\ScanBuild\check
>  
> which is not the same place.  The when ‘scan-build’ tries to collate the data and generate the report, the directory Perl looks in is empty.  I can fix this, I just need to swot up my OS Perl knowledge and I should be able to fix it.  I may need to do something similar in ‘ccc-analyzer’.  I will feedback any changes that may be useful to others once I have it figured out.
>  
> Thanks for your help, I would never have found this if you hadn’t given me good pointers to prove that I could generate the PList files.
>  
>             MartinO
>  
> From: Martin J. O'Riordan [mailto:martin.oriordan at movidius.com <mailto:martin.oriordan at movidius.com>] 
> Sent: 12 November 2016 20:36
> To: 'ganna at apple.com <mailto:ganna at apple.com>' <ganna at apple.com <mailto:ganna at apple.com>>
> Cc: 'Aleksei Sidorin' <a.sidorin at samsung.com <mailto:a.sidorin at samsung.com>>; 'cfe-dev' <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>>
> Subject: RE: [cfe-dev] Learning how to use and deploy 'scan-build'
>  
> Thanks Anna,
>  
> Actually there was a typo in my message and I actually had the identifier ‘zero’ not the constant ‘0’:
> int main () {
>   int zero = 0;
>   return 5 / zero;
> }
> but I have changed this to just contain:
> int foo () {
>   int x = 0;
>   return 5/x;
> }
>  
> Compiling this as:
> clang++ --analyze testScanBuild.cpp
> does report the warning, and creates the file ‘testScanBuild.plist’ which on inspection appears to contain the expected diagnostic information, and compiling it as:
> clang++ -c testScanBuild.cpp
> does not produce a warning  (no ‘-Wall’ option).
>  
> I just changed my Makefile to simply:
> build:  testScanBuild.o
>  
> %o.%cpp:
>     $(CXX) -c $<
> and:
> scan-build --use-cc clang --use-cxx clang++ -v -v -v -o check --keep-empty make build
>  
> I had not realised that the analyzers would not produce a report if the compiler already warned.
>  
> Thanks again,
>  
>             MartinO
>  
> From: ganna at apple.com <mailto:ganna at apple.com> [mailto:ganna at apple.com <mailto:ganna at apple.com>] 
> Sent: 12 November 2016 19:54
> To: Martin.ORiordan at Movidius.com <mailto:Martin.ORiordan at Movidius.com>
> Cc: Aleksei Sidorin <a.sidorin at samsung.com <mailto:a.sidorin at samsung.com>>; cfe-dev <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>>
> Subject: Re: [cfe-dev] Learning how to use and deploy 'scan-build'
>  
> Please, use the examples I provided in the previous email. The analyzer tries to avoid reporting the issues that can be found by the compiler.
>  
> Annas-MBP-3:compiler-rt anna$ clang --analyze ~/tmp/ex.c
> /Users/anna/tmp/ex.c:6:11: warning: Division by zero
>   return 5/x + 5/0;
>          ~^~
> 1 warning generated.
> Annas-MBP-3:compiler-rt anna$ clang -fsyntax-only ~/tmp/ex.c
> /Users/anna/tmp/ex.c:6:17: warning: division by zero is undefined [-Wdivision-by-zero]
>   return 5/x + 5/0;
>                 ^~
> 1 warning generated.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20161114/083cf414/attachment.html>


More information about the cfe-dev mailing list