@@ -67,43 +67,45 @@ CPPCHECK_OPTS+=" --cppcheck-build-dir=.out ."
67
67
RETURN=0
68
68
CLANG_FORMAT=$( which clang-format)
69
69
if [ $? -ne 0 ]; then
70
- echo " [!] clang-format not installed. Unable to check source file format policy." >&2
71
- exit 1
70
+ echo " [!] clang-format not installed. Unable to check source file format policy." >&2
71
+ exit 1
72
72
fi
73
73
74
74
CPPCHECK=$( which cppcheck)
75
75
mkdir -p .out
76
76
if [ $? -ne 0 ]; then
77
- echo " [!] cppcheck not installed. Unable to perform static analysis." >&2
78
- exit 1
77
+ echo " [!] cppcheck not installed. Unable to perform static analysis." >&2
78
+ exit 1
79
79
fi
80
80
81
- # Expected Cppcheck version is 1.90+
82
- # First, Cppcheck 2.x
83
- if [ -z " $( $CPPCHECK --version | grep -E ' ^Cppcheck\s2' ) " ]; then
84
- # Second, Cppcheck 1.x
85
- CPPCHECK_VER=$( $CPPCHECK --version | sed -Ee ' s/Cppcheck 1.([0-9]+)/\1/;q' )
86
- if [ $CPPCHECK_VER -lt 90 ]; then
87
- echo " [!] cppcheck version must be at least 1.90." >&2
88
- echo -e " Check 'Developer Info' for building Cppcheck from source:\n" \
89
- " https://cppcheck.sourceforge.net/devinfo/" >&2
90
- exit 1
91
- fi
81
+ # Check that cppcheck's version is at least 1.90.
82
+ cppcheck_ver=$( " $CPPCHECK " --version)
83
+ if echo " $cppcheck_ver " | grep -qE ' ^Cppcheck\s2' ; then
84
+ : # Version 2.x is acceptable.
85
+ else
86
+ # For version 1.x, extract the minor version and compare.
87
+ minor_version=$( echo " $cppcheck_ver " | sed -Ee ' s/Cppcheck 1\.([0-9]+)/\1/;q' )
88
+ if [ " $minor_version " -lt 90 ]; then
89
+ echo " [!] cppcheck version must be at least 1.90." >&2
90
+ echo -e " See Developer Info for building cppcheck from source:\n"
91
+ echo -e " https://cppcheck.sourceforge.io/devinfo/" >&2
92
+ exit 1
93
+ fi
92
94
fi
93
95
94
96
ASPELL=$( which aspell)
95
97
if [ $? -ne 0 ]; then
96
- echo " [!] aspell not installed. Unable to do spelling check." >&2
97
- exit 1
98
+ echo " [!] aspell not installed. Unable to do spelling check." >&2
99
+ exit 1
98
100
fi
99
101
if [ -z " $( aspell dump dicts | grep -E ' ^en$' ) " ]; then
100
- echo " [!] aspell-en not installed. Unable to do spelling check." >&2
101
- exit 1
102
+ echo " [!] aspell-en not installed. Unable to do spelling check." >&2
103
+ exit 1
102
104
fi
103
105
104
106
DIFF=$( which colordiff)
105
107
if [ $? -ne 0 ]; then
106
- DIFF=diff
108
+ DIFF=diff
107
109
fi
108
110
109
111
if command -v sha1sum > /dev/null 2>&1 ; then
117
119
118
120
FILES=$( git diff --cached --name-only --diff-filter=ACMR | grep -E " \.(c|cpp|h)$" )
119
121
for FILE in $FILES ; do
120
- nf=$( git checkout-index --temp $FILE | cut -f 1)
121
- tempdir=$( mktemp -d) || exit 1
122
- newfile=$( mktemp ${tempdir} /${nf} .XXXXXX) || exit 1
123
- basename=$( basename $FILE )
124
-
125
- source=" ${tempdir} /${basename} "
126
- mv $nf $source
127
- cp .clang-format $tempdir
128
- $CLANG_FORMAT $source > $newfile 2>> /dev/null
129
- $DIFF -u -p -B --label=" modified $FILE " --label=" expected coding style" \
130
- " ${source} " " ${newfile} "
131
- r=$?
132
- rm -rf " ${tempdir} "
133
- if [ $r != 0 ] ; then
134
- echo " [!] $FILE does not follow the consistent coding style." >&2
135
- RETURN=1
136
- fi
137
- if [ $RETURN -eq 1 ]; then
138
- echo " " >&2
139
- echo " Make sure you indent as the following:" >&2
140
- echo " clang-format -i $FILE " >&2
141
- echo
142
- fi
122
+ nf=$( git checkout-index --temp $FILE | cut -f 1)
123
+ tempdir=$( mktemp -d) || exit 1
124
+ newfile=$( mktemp ${tempdir} /${nf} .XXXXXX) || exit 1
125
+ basename=$( basename $FILE )
126
+
127
+ source=" ${tempdir} /${basename} "
128
+ mv $nf $source
129
+ cp .clang-format $tempdir
130
+ $CLANG_FORMAT $source > $newfile 2>> /dev/null
131
+ $DIFF -u -p -B \
132
+ --label=" modified $FILE " --label=" expected coding style" \
133
+ " ${source} " " ${newfile} "
134
+ r=$?
135
+ rm -rf " ${tempdir} "
136
+ if [ $r != 0 ] ; then
137
+ echo " [!] $FILE does not follow the consistent coding style." >&2
138
+ RETURN=1
139
+ fi
140
+ if [ $RETURN -eq 1 ]; then
141
+ echo " " >&2
142
+ echo " Make sure you indent as the following:" >&2
143
+ echo " clang-format -i $FILE " >&2
144
+ echo
145
+ fi
143
146
done
144
147
145
148
if [ ! -z " ${FILES[*]} " ]; then
146
- echo " Following files need to be cleaned up:"
147
- echo " ${FILES[*]} "
149
+ echo " Following files need to be cleaned up:"
150
+ echo " ${FILES[*]} "
148
151
fi
149
152
150
153
$SHA1SUM -c scripts/checksums 2> /dev/null > /dev/null
151
154
if [ $? -ne 0 ]; then
152
- echo " [!] You are not allowed to change the header file queue.h or list.h" >&2
153
- exit 1
155
+ echo " [!] You are not allowed to change the header file queue.h or list.h" >&2
156
+ exit 1
154
157
fi
155
158
156
159
# Prevent unsafe functions
@@ -159,26 +162,26 @@ banned="([^f]gets\()|(sprintf\()|(strcpy\()"
159
162
status=0
160
163
for file in $( git diff --staged --name-only | grep -E " \.(c|cc|cpp|h|hh|hpp)\$ " )
161
164
do
162
- filepath=" ${root} /${file} "
163
- output=$( grep -nrE " ${banned} " " ${filepath} " )
164
- if [ ! -z " ${output} " ]; then
165
- echo " Dangerous function detected in ${filepath} "
166
- echo " ${output} "
167
- echo
168
- echo " Read 'Common vulnerabilities guide for C programmers' carefully."
169
- echo " https://security.web.cern.ch/security/recommendations/en/codetools/c.shtml"
170
- RETURN=1
171
- fi
165
+ filepath=" ${root} /${file} "
166
+ output=$( grep -nrE " ${banned} " " ${filepath} " )
167
+ if [ ! -z " ${output} " ]; then
168
+ echo " Dangerous function detected in ${filepath} "
169
+ echo " ${output} "
170
+ echo
171
+ echo " Read 'Common vulnerabilities guide for C programmers' carefully."
172
+ echo " https://security.web.cern.ch/security/recommendations/en/codetools/c.shtml"
173
+ RETURN=1
174
+ fi
172
175
done
173
176
174
177
# static analysis
175
178
echo " Running static analysis..."
176
179
$CPPCHECK $CPPCHECK_OPTS > /dev/null
177
180
if [ $? -ne 0 ]; then
178
- RETURN=1
179
- echo " " >&2
180
- echo " Fail to pass static analysis." >&2
181
- echo
181
+ RETURN=1
182
+ echo " " >&2
183
+ echo " Fail to pass static analysis." >&2
184
+ echo
182
185
fi
183
186
184
187
# non-ASCII filenames are not allowed.
187
190
if test $( git diff --cached --name-only --diff-filter=A -z $against |
188
191
LC_ALL=C tr -d ' [ -~]\0' | wc -c) ! = 0
189
192
then
190
- cat << \EOF
193
+ cat << \EOF
191
194
ERROR: Attempt to add a non-ASCII file name.
192
195
This can cause problems if you want to work with people on other platforms.
193
196
To be portable it is advisable to rename the file.
194
197
EOF
195
- RETURN=1
198
+ RETURN=1
196
199
fi
197
200
198
201
exit $RETURN
0 commit comments