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

Martin J. O'Riordan via cfe-dev cfe-dev at lists.llvm.org
Sun Nov 13 02:55:05 PST 2016


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] 
Sent: 12 November 2016 21:48
To: 'ganna at apple.com' <ganna at apple.com>
Cc: 'Aleksei Sidorin' <a.sidorin at samsung.com>; 'cfe-dev' <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] 
Sent: 12 November 2016 20:36
To: '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] 
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/20161113/7e756c81/attachment.html>


More information about the cfe-dev mailing list