clang static analysis updated with tinderbox

Jeremy Huddleston jeremyhu at apple.com
Thu Apr 28 01:04:27 PDT 2011


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
         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:
+            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


More information about the xorg-devel mailing list