1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
#!/usr/bin/env sh
libdir=$("@READLINK_CMD@" -f "$(dirname ${0})/@BIN_RELATIVE_LIBDIR@")
sharedir=$("@READLINK_CMD@" -f "$(dirname ${0})/@BIN_RELATIVE_SHAREDIR@")
HELP() {
echo "Usage: `basename $0` [options] [clang++-options]"
echo
echo "Static analyzer for C++/Qt code (https://invent.kde.org/sdk/clazy)"
echo
echo "Options:"
echo " --help print program help"
echo " --version print the program version"
echo " --standalone run clazy-standalone instead of clang"
echo " --list print a list of all available checkers, arranged by level"
echo " --explain [regexp] print explanations for the checker matching a regexp"
echo "or"
echo " --explain print explanations for all checkers"
echo
echo "Any of the options above will print the requested information and then exit."
echo
echo "Convenience Options:"
echo " --qtdeveloper Special option for building Qt5 itself resulting in fewer false positives"
echo " (this is the same as passing \"-Xclang -plugin-arg-clazy -Xclang qt-developer\")"
echo
echo "All other options are passed directly to clang++ and handled from there."
echo
echo "See the clang++ manual for a list of the very large set of options available"
echo
echo "Environment Variables:"
echo " CLANGXX Path to the clang++ executable to use"
echo
}
VERSION() {
echo "clazy version: @CLAZY_PRINT_VERSION@"
${CLANGXX:-@CLANGPP_EXECUTABLE@} --version | head -1 | awk '{printf("clang version: %s\n",$3)}'
}
PRLIST() {
echo ""
if ( test -d "$sharedir/doc/clazy/$1" )
then
echo "$2:"
ls -1 $sharedir/doc/clazy/$1/README* | awk -F/ '{printf(" %s\n", $NF)}' | sed s/README-// | sed s/\.md$// | sort
else
echo "There are no checkers available for $1"
fi
}
PRINFO() {
lst=`ls -1 $sharedir/doc/clazy/level*/README*$1* $sharedir/doc/clazy/manuallevel/README*$1* 2>/dev/null`
if ( test ! -z "$lst" )
then
for f in $lst
do
l=`echo $f | awk -F/ '{foo=NF-1; printf(" %s:%s\n", $foo,$NF)}'`
level=`echo $l | cut -d: -f1`
checker=`echo $l | cut -d: -f2 | sed s/README-// | sed s/\.md$//`
echo "== Explanation for checker $checker ($level) =="
cat $f
echo
done
else
echo "There is no explanation available for checker \"$1\""
echo "Run 'clazy --explain' to see the list of all available checkers."
fi
}
if ( test $# -gt 0 -a "$1" = "--help" )
then
HELP
exit
fi
if ( test $# -gt 0 -a "$1" = "--version" )
then
VERSION
exit
fi
if ( test $# -gt 0 -a "$1" = "--list" )
then
echo "List of available clazy checkers:"
PRLIST level0 "Checks from level0. Very stable checks, 100% safe, no false-positives"
PRLIST level1 "Checks from level1. Mostly stable and safe, rare false-positives"
PRLIST level2 "Checks form level2. Sometimes has false-positives (20-30%)"
#PRLIST level3 "Checks from level3. Not always correct, high rate of false-positives"
PRLIST manuallevel "Manual checks. Stability varies. must be explicitly enabled"
exit
fi
if ( test $# -gt 0 -a "$1" = "--explain" )
then
shift
PRINFO $@
exit
fi
ExtraClangOptions=""
if ( test $# -gt 0 -a "$1" = "--qtdeveloper" )
then
shift
ExtraClangOptions="-Xclang -plugin-arg-clazy -Xclang qt-developer"
fi
if ( test $# -gt 0 -a "$1" = "--visit-implicit-code" )
then
shift
ExtraClangOptions="-Xclang -plugin-arg-clazy -Xclang visit-implicit-code"
fi
case "$CLAZY_CHECKS" in
*jni-signatures*)
if [ -z "$ANDROID_NDK" ]
then
echo "To test JNI signatures you need to set ANDROID_NDK to your Android NDK installation."
exit
fi
ExtraClangOptions=$ExtraClangOptions" -idirafter"$ANDROID_NDK"/sysroot/usr/include"
;;
esac
ClazyPluginLib=ClazyPlugin@CMAKE_SHARED_LIBRARY_SUFFIX@
if ( test -f "$libdir/$ClazyPluginLib" )
then
# find plugin libraries in install dir
export LD_LIBRARY_PATH=$libdir:$LD_LIBRARY_PATH
export DYLD_LIBRARY_PATH=$libdir:$DYLD_LIBRARY_PATH
elif ( test -f "$(dirname $0)/lib/$ClazyPluginLib" )
then
# find plugin libraries in build dir
export LD_LIBRARY_PATH=$(dirname $0)/lib:$LD_LIBRARY_PATH
export DYLD_LIBRARY_PATH=$(dirname $0)/lib:$DYLD_LIBRARY_PATH
fi
if ( test $# -gt 0 -a "$1" = "--standalone" )
then
shift
if ( test -f "$(dirname $0)/clazy-standalone" )
then
# find binary in install dir
$(dirname $0)/clazy-standalone "$@"
else
# hope binary is in the expected build dir
$(dirname $0)/bin/clazy-standalone "$@"
fi
else
${CLANGXX:-@CLANGPP_EXECUTABLE@} -Qunused-arguments -Xclang -load -Xclang $ClazyPluginLib -Xclang -add-plugin -Xclang clazy $ExtraClangOptions "$@"
fi
|