clang static analysis updated with tinderbox

Dirk Wallenstein halsmit at t-online.de
Fri Apr 29 01:35:03 PDT 2011


On Thu, Apr 28, 2011 at 01:04:27AM -0700, Jeremy Huddleston wrote:
> I'm in the process of updating my tinderboxes to run clang static analysis and upload the results.  Currently only yuffie (XQuartz) has data available, and I'll be updating my linux tinerboxes in the next few days once yuffie is going smoothly.  Hopefully cjb can integrate this a bit nicer into the tinderbox.x.org site, but for now, you can see it on my p.fd.o webspace:
> 
> http://people.freedesktop.org/~jeremyhu/analyzer/
> 
> I've started going through the list (some patches already sent to xorg-devel for font-util and iceauth), but help is always welcome.  There are some tests where"we know better".  For those, hopefully the _X_UNUSED and _X_NONNULL macros will help tag things appropriately.  For the other cases (rand() security concerns), we can use ifdef-foo to silence the analyzer:
> 
> #ifndef __clang_analyzer__
> // Code not to be analyzed
> #endif
> 
> The changes to jhbuild are minor (comments welcome before I send it off to gnome bugzilla).
> 
> Thanks,
> Jeremy
> 
> 
> 
> 
> From 8784873bb86f92cab7d0341892f5db4343eb68a0 Mon Sep 17 00:00:00 2001
> From: Jeremy Huddleston <jeremyhu at apple.com>
> Date: Thu, 28 Apr 2011 00:55:13 -0700
> Subject: [PATCH] Support running scan-build (Clang Static Analyzer) with
>  autotools projects
> 
> http://clang-analyzer.llvm.org
> 
> Signed-off-by: Jeremy Huddleston <jeremyhu at apple.com>
> ---
>  jhbuild/config.py             |    3 ++-
>  jhbuild/defaults.jhbuildrc    |    6 ++++++
>  jhbuild/modtypes/autotools.py |   12 +++++++++---
>  3 files changed, 17 insertions(+), 4 deletions(-)
> 
> diff --git a/jhbuild/config.py b/jhbuild/config.py
> index f13e303..3e20436 100644
> --- a/jhbuild/config.py
> +++ b/jhbuild/config.py
> @@ -58,7 +58,8 @@ _known_keys = [ 'moduleset', 'modules', 'skip', 'tags', 'prefix',
>                  'jhbuildbot_mastercfg', 'use_local_modulesets',
>                  'ignore_suggests', 'modulesets_dir', 'mirror_policy',
>                  'module_mirror_policy', 'dvcs_mirror_dir', 'build_targets',
> -                'cmakeargs', 'module_cmakeargs' ]
> +                'cmakeargs', 'module_cmakeargs',
> +                'scan_build', 'module_scan_build', 'scan_buildargs', 'scan_build_outputdir' ]
>  
>  env_prepends = {}
>  def prependpath(envvar, path):
> diff --git a/jhbuild/defaults.jhbuildrc b/jhbuild/defaults.jhbuildrc
> index 7abe832..f9c34b7 100644
> --- a/jhbuild/defaults.jhbuildrc
> +++ b/jhbuild/defaults.jhbuildrc
> @@ -89,6 +89,12 @@ interact      = True   # whether to interact with the user.
>  quiet_mode    = False  # whether to display running commands output
>  progress_bar  = True   # whether to display a progress bar when running in quiet mode
>  
> +# Run clang static analyzer (scan-build), scan_build_outputdir has subdirectories for each module id
> +scan_build    = False
> +module_scan_build = {}
> +scan_buildargs = '-v'
> +scan_build_outputdir = '/tmp/jhbuild_scan_build'
> +
>  # checkout modes. For VCS directories, it specifies how the checkout
>  # is done. We can also specify checkout modes for specific modules
>  checkout_mode = 'update'
> diff --git a/jhbuild/modtypes/autotools.py b/jhbuild/modtypes/autotools.py
> index 215df91..ff7a068 100644
> --- a/jhbuild/modtypes/autotools.py
> +++ b/jhbuild/modtypes/autotools.py
> @@ -121,13 +121,14 @@ class AutogenModule(Package, DownloadableModule):
>          if self.autogen_template:
>              template = self.autogen_template
If this is configured, %(scan_build) won't be added. Would it make sense
to add it independently, after this branching?

>          else:
> -            template = ("%(srcdir)s/%(autogen-sh)s --prefix %(prefix)s"
> +            template = ("%(scan_build)s%(srcdir)s/%(autogen-sh)s --prefix %(prefix)s"
>                          " --libdir %(libdir)s %(autogenargs)s ")
>  
>          autogenargs = self.autogenargs + ' ' + self.config.module_autogenargs.get(
>                  self.name, self.config.autogenargs)
>  
> -        vars = {'prefix': buildscript.config.prefix,
> +        vars = {'scan_build': self.scan_build_template(buildscript),
> +                'prefix': buildscript.config.prefix,
>                  'autogen-sh': self.autogen_sh,
>                  'autogenargs': autogenargs}
>                  
> @@ -210,13 +211,18 @@ class AutogenModule(Package, DownloadableModule):
>          buildscript.set_action(_('Building'), self)
>          makeargs = self.makeargs + ' ' + self.config.module_makeargs.get(
>                  self.name, self.config.makeargs)
> -        cmd = '%s %s' % (os.environ.get('MAKE', 'make'), makeargs)
> +        cmd = '%s%s %s' % (self.scan_build_template(buildscript), os.environ.get('MAKE', 'make'), makeargs)
>          buildscript.execute(cmd, cwd = self.get_builddir(buildscript),
>                  extra_env = self.extra_env)
>      do_build.depends = [PHASE_CONFIGURE]
>      do_build.error_phases = [PHASE_FORCE_CHECKOUT, PHASE_CONFIGURE,
>              PHASE_CLEAN, PHASE_DISTCLEAN]
>  
> +    def scan_build_template(self, buildscript):
> +        if self.name in buildscript.config.module_scan_build or buildscript.config.scan_build:
I would say the module specific setting should override the global one,
something like:

    if buildscript.config.module_scan_build.get(self.name, buildscript.config.scan_build):

> +            return 'scan-build %s -o %s/%s ' % (buildscript.config.scan_buildargs, buildscript.config.scan_build_outputdir, self.name)
> +        return ''
> +
>      def skip_check(self, buildscript, last_phase):
>          if not self.check_target:
>              return True
> -- 
> 1.7.4.4

-- 
Cheers,
  Dirk


More information about the xorg-devel mailing list