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 <[email protected]>
> 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 <[email protected]>
> ---
> 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
_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel