[PATCH modular] Add hooks to run a static analysis tool.
Peter Hutterer
peter.hutterer at who-t.net
Tue Dec 21 21:19:48 PST 2010
On Tue, 21 Dec 2010 23:57:30 -0500, Trevor Woerner <twoerner at gmail.com> wrote:
> From: Trevor Woerner <twoerner at gmail.com>
>
> I've added a new option to have a static analysis tool run over the code
> while processing each module/component. I wrote it specifically with
> the 'cppcheck' tool in mind but have hopefully made it generic enough
> that any tool could be substituted.
>
> The 'cppcheck' tool also comes with a reporting tool called
> 'cppcheck-htmlreport'. If 'cppcheck' is being used, the script will also
> look for this reporting tool to generate nice html-based reports.
>
> On the command-line specify the '--staticcheck' option to enable running
> a static checker over the code. This option has one required argument:
> a location into which to base the directory tree containing the reports.
>
> If the environment variable 'STATICCHECK' is defined, it is assumed to
> point to the static analysis tool to use, otherwise the script assumes
> and looks for the 'cppcheck' utility.
>
> If you want to pass different options to the static checker other than
> the defaults you can define them in the environment variable
> 'STATICCHECK_OPTIONS', but I think the defaults are sufficient.
>
> This option works well with the '-o' and '--modfile' options.
>
> E.g.
>
> util/modular/build.sh $PREFIX --staticcheck $HOME/reports
>
> Signed-off-by: Trevor Woerner <twoerner at gmail.com>
why not make --cmd to perform arbitrary commands instead of limiting it
to git and make? Was there a discussion on this before? I just went
through my email archive and only found ones that focused on git and
make, not on just running an arbitrary command.
Cheers,
Peter
> ---
> I saw the item the other day on lwn.net announcing a new project to add static
> analysis checks on the Debian project and thought it would be nice to provide
> a similar functionality to the X.Org codebase. Simply download, configure,
> and install the 'cppcheck' tool and its daughter tool 'cppcheck-htmlreport',
> use the --staticcheck option, provide a base directory for the reports
> and see what comes out!
>
> Hopefully these hooks have been written generically enough that you can
> substitute whatever other static analysis tools with which you're familiar
> (in case you don't like 'cppcheck' or want to try something else).
>
> build.sh | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 86 insertions(+), 0 deletions(-)
>
> diff --git a/build.sh b/build.sh
> index 8568083..2dacf96 100755
> --- a/build.sh
> +++ b/build.sh
> @@ -1,5 +1,7 @@
> #!/bin/sh
>
> +DEFAULT_STATICCHECK_OPTIONS="-v --enable=unusedFunction --force --xml"
> +
> envoptions() {
> cat << EOF
> Environment variables specific to build.sh:
> @@ -13,6 +15,10 @@ Environment variables specific to build.sh:
> Used to build the font path, search libraries and packages
> FONTPATH Path to fonts directories [\$PREFIX/\$LIBDIR/X11/fonts/misc/, ...]
> Picked-up by the xserver as a value for --with-default-font-path
> + STATICCHECK Specify static analysis tool to use if not the default [cppcheck]
> + STATICCHECK_OPTIONS
> + User-supplied options to static analysis tool to override the defaults
> + [$DEFAULT_STATICCHECK_OPTIONS]
>
> Environment variables defined by the GNU Build System:
> DESTDIR Path to the staging area where installed objects are relocated
> @@ -263,6 +269,43 @@ clone() {
> return 0
> }
>
> +# perform static anaysis of code
> +# arguments:
> +# $1 - module
> +# $2 - component (optional)
> +# returns:
> +# n/a
> +staticcheck_analysis() {
> + # preconds
> + if [ X"$1" = X ]; then
> + echo "staticcheck_analysis() required argument \$1 missing"
> + return
> + fi
> +
> + # skip modules which obviously don't have source code (proto & doc)
> + case X"$1" in
> + X"proto" | X"doc")
> + return
> + ;;
> + esac
> +
> + if [ X"$STATICCHECK" != X ]; then
> + report_dir=$STATICCHECK_PREFIX/$1/$2
> + mkdir -p $report_dir
> + echo "performing static analysis using '$STATICCHECK' with options '${STATICCHECK_OPTIONS="$DEFAULT_STATICCHECK_OPTIONS"}' on '$1/$2' and placing report in '$report_dir/report.xml'"
> + which tee > /dev/null 2>&1
> + if [ $? -eq 0 ]; then
> + $STATICCHECK ${STATICCHECK_OPTIONS="$DEFAULT_STATICCHECK_OPTIONS"} $1/$2 2>&1 | tee $report_dir/report.xml
> + else
> + $STATICCHECK ${STATICCHECK_OPTIONS="$DEFAULT_STATICCHECK_OPTIONS"} $1/$2 > $report_dir/report.xml 2>&1
> + fi
> + if [ $? -eq 0 ] && [ X"$STATICCHECK_REPORT" != X ]; then
> + echo "generating static check report using 'cppcheck-htmlreport'"
> + cppcheck-htmlreport --file=$report_dir/report.xml --report-dir=$report_dir
> + fi
> + fi
> +}
> +
> # perform processing of each module/component
> # arguments:
> # $1 - module
> @@ -308,6 +351,10 @@ process() {
> echo "$1/$2" >> $BUILT_MODULES_FILE
> fi
>
> + if [ X"$STATICCHECK" != X ]; then
> + staticcheck_analysis $1 $2
> + fi
> +
> old_pwd=`pwd`
> cd $SRCDIR
> if [ $? -ne 0 ]; then
> @@ -960,6 +1007,9 @@ usage() {
> echo " --check Run make check in addition \"all install\""
> echo " --clone Clone non-existing repositories (uses \$GITROOT if set)"
> echo " --cmd <cmd> Execute arbitrary git, gmake, or make command <cmd>"
> + echo " --staticcheck <report-prefix>"
> + echo " Perform static analysis on source, place results based"
> + echo " at <report-prefix>"
> echo " --modfile <file> Only process the module/components specified in <file>"
> echo ""
> echo "Usage: $basename -L"
> @@ -1095,6 +1145,42 @@ do
> ;;
> esac
> ;;
> + --staticcheck)
> + required_arg $1 $2
> + shift
> + STATICCHECK_PREFIX=$1
> +
> + # look for static analysis tool
> + if [ X"$STATICCHECK" = X ]; then
> + which cppcheck > /dev/null 2>&1
> + if [ $? -eq 0 ]; then
> + STATICCHECK=`which cppcheck`
> + fi
> + fi
> +
> + # make sure the tool is found and executable
> + if [ X"$STATICCHECK" = X ]; then
> + echo "No static analysis tool found"
> + shift
> + continue
> + fi
> + if [ ! -x $STATICCHECK ]; then
> + echo "The static analysis tool '$STATICCHECK' doesn't appear to be executable"
> + unset STATICCHECK
> + shift
> + continue
> + fi
> +
> + # look for static analysis reporting tool 'cppcheck-htmlreport'
> + # if using cppcheck as the static analysis tool
> + echo $STATICCHECK | grep cppcheck > /dev/null 2>&1
> + if [ $? -eq 0 ]; then
> + which cppcheck-htmlreport > /dev/null 2>&1
> + if [ $? -eq 0 ]; then
> + STATICCHECK_REPORT=1
> + fi
> + fi
> + ;;
> --modfile)
> required_arg $1 $2
> shift
> --
> 1.7.3.4.577.gf29db
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>
More information about the xorg-devel
mailing list