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
|
#!/bin/sh
#
# cppcheck.sh - run cppcheck on smartmontools $srcdir
#
# Home page of code is: https://www.smartmontools.org
#
# Copyright (C) 2019-21 Christian Franke
#
# SPDX-License-Identifier: GPL-2.0-or-later
#
# $Id: cppcheck.sh 5316 2022-02-09 08:02:23Z samm2 $
#
set -e
myname=$0
usage()
{
echo "Usage: $myname [-v|-q] [-c CPPCHECK] [-jJOBS] [--library=CFG] [--platform=TYPE] [FILE ...]"
exit 1
}
# Parse options
jobs=
v=
cppcheck="cppcheck"
library="--library=posix"
platform="--platform=unix64"
unused_func=",unusedFunction"
while true; do case $1 in
-c) shift; test -n "$1" || usage; cppcheck=$1 ;;
-j?*) jobs=$1; unused_func= ;;
-q) v="-q" ;;
-v) v="-v" ;;
--platform=*) platform=$1 ;;
--library=*) library=$1 ;;
-*) usage ;;
*) break ;;
esac; shift; done
# Set file list from command line or $srcdir
if [ $# -ne 0 ]; then
files=$(echo "$@")
files_v=$files
unused_func=
else
srcdir=${myname%/*}
if [ "$srcdir" = "$myname" ]; then
echo "$myname: \$srcdir not found" >&2
exit 1
fi
cd "$srcdir" || exit 1
files_v="*.cpp *.h os_win32/*.cpp os_win32/*.h"
files=$(echo $files_v)
case $files in
*\**) echo "$myname: Not run from \$srcdir" >&2; exit 1 ;;
esac
fi
# Check cppcheck version
ver=$("$cppcheck" --version) || exit 1
ver=${ver##* }
case $ver in
1.8[56]|2.[237]) ;;
*) echo "$myname: cppcheck $ver not tested with this script" ;;
esac
# Build cppcheck settings
enable="warning,style,performance,portability,information${unused_func}"
sup_list="
#warning
syntaxError:drivedb.h
#style
asctime_rCalled:utility.cpp
asctime_sCalled:utility.cpp
ftimeCalled
readdirCalled
strtokCalled
unusedStructMember
unusedFunction:sg_unaligned.h
unmatchedSuppression
"
suppress=
for s in $sup_list; do
case $s in
\#*) continue ;;
unusedFunction:*) test -n "$unused_func" || continue ;;
unmatchedSuppression) test $# -ne 0 || continue ;;
esac
suppress="${suppress}${suppress:+ }--suppress=${s%%#*}"
done
defs="\
-U__KERNEL__
-U__LP64__
-U__VERSION__
-U_NETWARE
-DBUILD_INFO=\"(...)\"
-UCLOCK_MONOTONIC
-DENOTSUP=1
-DHAVE_ATTR_PACKED
-DHAVE_CONFIG_H
-DSG_IO=1
-DSMARTMONTOOLS_SVN_REV=\"r1\"
-DSMARTMONTOOLS_ATTRIBUTELOG=\"/file\"
-DSMARTMONTOOLS_SAVESTATES=\"/file\"
-DSMARTMONTOOLS_DRIVEDBDIR=\"/dir\"
-DSOURCE_DATE_EPOCH=1665402854
-Umakedev
-Ustricmp"
# Print brief version of command
cat <<EOF
cppcheck-$ver \\
--enable=$enable \\
$library \\
$platform \\
... \\
$(echo "$defs" | sed 's,$, \\,')
$(for s in $suppress; do echo " $s \\"; done)
$files_v
EOF
# Run cppcheck with swapped stdout<>stderr
"$cppcheck" \
$v \
$jobs \
--enable="$enable" \
--template='{file}:{line}: {severity}: ({id}) {message}' \
--force \
--inline-suppr \
--language=c++ \
$library \
$platform \
$defs \
$suppress \
$files \
3>&2 2>&1 1>&3 3>&-
|