Crypto++  5.6.3
Free C++ class library of cryptographic schemes
cryptest.sh
1 #!/bin/bash
2 
3 # cryptest.sh - written and placed in public domain by Jeffrey Walton and Uri Blumenthal.
4 # Copyright assigned to Crypto++ project.
5 
6 # This is a test script that can be used on some Linux/Unix/Apple machines
7 # to automate building the library and running the self test with various
8 # combinations of flags, options, and conditions.
9 
10 # Everything is tee'd into cryptest-result.txt. Change it to suite your taste. You
11 # should be able to use `egrep -a "(Error|error|FAILED|Illegal)" cryptest-result.txt`
12 # to quickly find errors and failures.
13 
14 # Set to suite your taste
15 TEST_RESULTS=cryptest-result.txt
16 BENCHMARK_RESULTS=cryptest-bench.txt
17 WARN_TEST_RESULTS=cryptest-warn-result.txt
18 
19 # Respect user's preferred flags, but filter the stuff we expliclty test
20 #if [ ! -z "CXXFLAGS" ]; then
21 # ADD_CXXFLAGS=$(echo "$CXXFLAGS" | sed 's/\(-DDEBUG\|-DNDEBUG\|-O[0-9]\|-Os\|-Og\|-fsanitize=address\|-fsanitize=undefined\|-DDCRYPTOPP_NO_UNALIGNED_DATA_ACCESS\|-DDCRYPTOPP_NO_UNALIGNED_DATA_ACCESS\|-DDCRYPTOPP_NO_BACKWARDS_COMPATIBILITY_562\)//g')
22 #else\
23 # ADD_CXXFLAGS=""
24 #fi
25 
26 # I can't seem to get the expression to work in sed on Apple. It returns the original CXXFLAGS.
27 # If you want to test with additional flags, then put them in ADD_CXXFLAGS below.
28 # ADD_CXXFLAGS="-mrdrnd -mrdseed"
29 ADD_CXXFLAGS=""
30 
31 IS_DARWIN=$(uname -s | grep -i -c darwin)
32 IS_LINUX=$(uname -s | grep -i -c linux)
33 IS_CYGWIN=$(uname -s | grep -i -c cygwin)
34 IS_MINGW=$(uname -s | grep -i -c mingw)
35 IS_OPENBSD=$(uname -s | grep -i -c openbsd)
36 
37 # We need to use the C++ compiler to determine if c++11 is available. Otherwise
38 # a mis-detection occurs on Mac OS X 10.9 and above. Below, we use the same
39 # Implicit Variables as make. Also see
40 # https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html
41 if [ -z "$CXX" ]; then
42  if [ "$IS_DARWIN" -ne "0" ]; then
43  CXX=c++
44  else
45  # Linux, MinGW, Cygwin and fallback ...
46  CXX=g++
47  fi
48 fi
49 
50 # Fixup
51 if [ "$CXX" == "gcc" ]; then
52  CXX=g++
53 fi
54 
55 # Fixup
56 if [ "$IS_OPENBSD" -ne "0" ]; then
57  MAKE=gmake
58 else
59  MAKE=make
60 fi
61 
62 if [ -z "$TMP" ]; then
63  TMP=/tmp
64 fi
65 
66 # Use the compiler driver, and not cpp, to tell us if the flag is consumed.
67 $CXX -x c++ -dM -E -std=c++11 - < /dev/null > /dev/null 2>&1
68 if [ "$?" -eq "0" ]; then
69  HAVE_CXX11=1
70 else
71  HAVE_CXX11=0
72 fi
73 
74 # OpenBSD 5.7 and OS X 10.5 cannot consume -std=c++03
75 $CXX -x c++ -dM -E -std=c++03 - < /dev/null > /dev/null 2>&1
76 if [ "$?" -eq "0" ]; then
77  HAVE_CXX03=1
78 else
79  HAVE_CXX03=0
80 fi
81 
82 # Set to 0 if you don't have UBsan
83 $CXX -x c++ -fsanitize=undefined adhoc.cpp.proto -o $TMP/adhoc > /dev/null 2>&1
84 if [ "$?" -eq "0" ]; then
85  HAVE_UBSAN=1
86 else
87  HAVE_UBSAN=0
88 fi
89 
90 # Fixup...
91 if [ "$IS_CYGWIN" -ne "0" ] || [ "$IS_MINGW" -ne "0" ]; then
92  HAVE_UBSAN=0
93 fi
94 
95 # Set to 0 if you don't have Asan
96 $CXX -x c++ -fsanitize=undefined adhoc.cpp.proto -o $TMP/adhoc > /dev/null 2>&1
97 if [ "$?" -eq "0" ]; then
98  HAVE_ASAN=1
99 else
100  HAVE_ASAN=0
101 fi
102 
103 # Fixup...
104 if [ "$IS_CYGWIN" -ne "0" ] || [ "$IS_MINGW" -ne "0" ]; then
105  HAVE_ASAN=0
106 fi
107 
108 #Final fixups for compilers liek GCC on ARM64
109 if [ "$HAVE_UBSAN" -eq "0" ] || [ "$HAVE_ASAN" -eq "0" ]; then
110  HAVE_UBAN=0
111  HAVE_ASAN=0
112 fi
113 
114 # Set to 0 if you don't have Valgrind. Valgrind tests take a long time...
115 HAVE_VALGRIND=$(which valgrind 2>&1 | grep -v "no valgrind" | grep -i -c valgrind)
116 
117 # Echo back to ensure something is not missed.
118 echo
119 echo "HAVE_CXX03: $HAVE_CXX03"
120 echo "HAVE_CXX11: $HAVE_CXX11"
121 echo "HAVE_ASAN: $HAVE_ASAN"
122 echo "HAVE_UBSAN: $HAVE_UBSAN"
123 
124 if [ "$HAVE_VALGRIND" -ne "0" ]; then
125  echo "HAVE_VALGRIND: $HAVE_VALGRIND"
126 fi
127 if [ "$IS_DARWIN" -ne "0" ]; then
128  echo "IS_DARWIN: $IS_DARWIN"
129  unset MallocScribble MallocPreScribble MallocGuardEdges
130 fi
131 if [ "$IS_LINUX" -ne "0" ]; then
132  echo "IS_LINUX: $IS_LINUX"
133 fi
134 if [ "$IS_CYGWIN" -ne "0" ]; then
135  echo "IS_CYGWIN: $IS_CYGWIN"
136 fi
137 if [ "$IS_MINGW" -ne "0" ]; then
138  echo "IS_MINGW: $IS_MINGW"
139 fi
140 
141 echo "User CXXFLAGS: $CXXFLAGS"
142 echo "Retained CXXFLAGS: $ADD_CXXFLAGS"
143 echo "Compiler:" $($CXX --version | head -1)
144 
145 TEST_BEGIN=$(date)
146 echo
147 echo "Start time: $TEST_BEGIN"
148 
149 ############################################
150 ############################################
151 
152 # Remove previous test results
153 rm -f "$TEST_RESULTS" > /dev/null 2>&1
154 touch "$TEST_RESULTS"
155 
156 rm -f "$BENCHMARK_RESULTS" > /dev/null 2>&1
157 touch "$BENCHMARK_RESULTS"
158 
159 rm -f "$WARN_RESULTS" > /dev/null 2>&1
160 touch "$WARN_RESULTS"
161 
162 ############################################
163 # Basic debug build
164 echo
165 echo "************************************" | tee -a "$TEST_RESULTS"
166 echo "Testing: debug, default CXXFLAGS" | tee -a "$TEST_RESULTS"
167 echo
168 
169 unset CXXFLAGS
170 "$MAKE" clean > /dev/null 2>&1
171 export CXXFLAGS="-DDEBUG -g2 -O2"
172 "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
173 ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
174 ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
175 
176 ############################################
177 # Basic release build
178 echo
179 echo "************************************" | tee -a "$TEST_RESULTS"
180 echo "Testing: release, default CXXFLAGS" | tee -a "$TEST_RESULTS"
181 echo
182 
183 unset CXXFLAGS
184 "$MAKE" clean > /dev/null 2>&1
185 export CXXFLAGS="-DNDEBUG -g2 -O2"
186 "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
187 ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
188 ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
189 
190 ############################################
191 # Basic debug build, DISABLE_ASM
192 echo
193 echo "************************************" | tee -a "$TEST_RESULTS"
194 echo "Testing: debug, default CXXFLAGS, DISABLE_ASM" | tee -a "$TEST_RESULTS"
195 echo
196 
197 unset CXXFLAGS
198 "$MAKE" clean > /dev/null 2>&1
199 export CXXFLAGS="-DDEBUG -g2 -O2 -DCRYPTOPP_DISABLE_ASM"
200 "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
201 ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
202 ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
203 
204 ############################################
205 # Basic release build, DISABLE_ASM
206 echo
207 echo "************************************" | tee -a "$TEST_RESULTS"
208 echo "Testing: release, default CXXFLAGS, DISABLE_ASM" | tee -a "$TEST_RESULTS"
209 echo
210 
211 unset CXXFLAGS
212 "$MAKE" clean > /dev/null 2>&1
213 export CXXFLAGS="-DNDEBUG -g2 -O2 -DCRYPTOPP_DISABLE_ASM"
214 "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
215 ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
216 ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
217 
218 ############################################
219 # c++03 debug build
220 if [ "$HAVE_CXX03" -ne "0" ]; then
221  echo
222  echo "************************************" | tee -a "$TEST_RESULTS"
223  echo "Testing: debug, c++03" | tee -a "$TEST_RESULTS"
224  echo
225 
226  unset CXXFLAGS
227  "$MAKE" clean > /dev/null 2>&1
228  export CXXFLAGS="-DDEBUG -g2 -O2 -std=c++03 $ADD_CXXFLAGS"
229  "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
230  ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
231  ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
232 fi
233 
234 ############################################
235 # c++03 release build
236 if [ "$HAVE_CXX03" -ne "0" ]; then
237  echo
238  echo "************************************" | tee -a "$TEST_RESULTS"
239  echo "Testing: release, c++03" | tee -a "$TEST_RESULTS"
240  echo
241 
242  unset CXXFLAGS
243  "$MAKE" clean > /dev/null 2>&1
244  export CXXFLAGS="-DNDEBUG -g2 -O2 -std=c++03 $ADD_CXXFLAGS"
245  "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
246  ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
247  ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
248 fi
249 
250 ############################################
251 # c++11 debug build
252 if [ "$HAVE_CXX11" -ne "0" ]; then
253  echo
254  echo "************************************" | tee -a "$TEST_RESULTS"
255  echo "Testing: debug, c++11" | tee -a "$TEST_RESULTS"
256  echo
257 
258  unset CXXFLAGS
259  "$MAKE" clean > /dev/null 2>&1
260  export CXXFLAGS="-DDEBUG -g2 -O2 -std=c++11 $ADD_CXXFLAGS"
261  "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
262  ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
263  ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
264 fi
265 
266 ############################################
267 # c++11 release build
268 if [ "$HAVE_CXX11" -ne "0" ]; then
269  echo
270  echo "************************************" | tee -a "$TEST_RESULTS"
271  echo "Testing: release, c++11" | tee -a "$TEST_RESULTS"
272  echo
273 
274  unset CXXFLAGS
275  "$MAKE" clean > /dev/null 2>&1
276  export CXXFLAGS="-DNDEBUG -g2 -O2 -std=c++11 $ADD_CXXFLAGS"
277  "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
278  ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
279  ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
280 fi
281 
282 ############################################
283 # Debug build, all backwards compatibility.
284 echo
285 echo "************************************" | tee -a "$TEST_RESULTS"
286 echo "Testing: debug, MAINTAIN_BACKWARDS_COMPATIBILITY" | tee -a "$TEST_RESULTS"
287 echo
288 
289 unset CXXFLAGS
290 "$MAKE" clean > /dev/null 2>&1
291 export CXXFLAGS="-DDEBUG -g2 -O2 -DCRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY $ADD_CXXFLAGS"
292 "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
293 ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
294 ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
295 
296 ############################################
297 # Release build, all backwards compatibility.
298 echo
299 echo "************************************" | tee -a "$TEST_RESULTS"
300 echo "Testing: release, MAINTAIN_BACKWARDS_COMPATIBILITY" | tee -a "$TEST_RESULTS"
301 echo
302 
303 unset CXXFLAGS
304 "$MAKE" clean > /dev/null 2>&1
305 export CXXFLAGS="-DNDEBUG -g2 -O2 -DCRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY $ADD_CXXFLAGS"
306 "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
307 ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
308 ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
309 
310 ############################################
311 # Debug build, init_priority
312 echo
313 echo "************************************" | tee -a "$TEST_RESULTS"
314 echo "Testing: debug, INIT_PRIORITY" | tee -a "$TEST_RESULTS"
315 echo
316 
317 unset CXXFLAGS
318 "$MAKE" clean > /dev/null 2>&1
319 export CXXFLAGS="-DDEBUG -g2 -O1 -DCRYPTOPP_INIT_PRIORITY=250 $ADD_CXXFLAGS"
320 "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
321 ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
322 ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
323 
324 ############################################
325 # Release build, init_priority
326 echo
327 echo "************************************" | tee -a "$TEST_RESULTS"
328 echo "Testing: release, INIT_PRIORITY" | tee -a "$TEST_RESULTS"
329 echo
330 
331 unset CXXFLAGS
332 "$MAKE" clean > /dev/null 2>&1
333 export CXXFLAGS="-DNDEBUG -g2 -O2 -DCRYPTOPP_INIT_PRIORITY=250 $ADD_CXXFLAGS"
334 "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
335 ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
336 ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
337 
338 ############################################
339 # Release build, no unaligned data access
340 # This test will not be needed in Crypto++ 5.7 and above
341 echo
342 echo "************************************" | tee -a "$TEST_RESULTS"
343 echo "Testing: release, NO_UNALIGNED_DATA_ACCESS" | tee -a "$TEST_RESULTS"
344 echo
345 
346 unset CXXFLAGS
347 "$MAKE" clean > /dev/null 2>&1
348 export CXXFLAGS="-DNDEBUG -g2 -O2 -DCRYPTOPP_NO_UNALIGNED_DATA_ACCESS $ADD_CXXFLAGS"
349 "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
350 ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
351 ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
352 
353 ############################################
354 # Release build, no backwards compatibility with Crypto++ 5.6.2.
355 # This test will not be needed in Crypto++ 5.7 and above
356 echo
357 echo "************************************" | tee -a "$TEST_RESULTS"
358 echo "Testing: release, NO_BACKWARDS_COMPATIBILITY_562" | tee -a "$TEST_RESULTS"
359 echo
360 
361 unset CXXFLAGS
362 "$MAKE" clean > /dev/null 2>&1
363 export CXXFLAGS="-DNDEBUG -g2 -O2 -DCRYPTOPP_NO_BACKWARDS_COMPATIBILITY_562 $ADD_CXXFLAGS"
364 "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
365 ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
366 ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
367 
368 ############################################
369 # Debug build, OS Independence
370 echo
371 echo "************************************" | tee -a "$TEST_RESULTS"
372 echo "Testing: debug, NO_OS_DEPENDENCE" | tee -a "$TEST_RESULTS"
373 echo
374 
375 unset CXXFLAGS
376 "$MAKE" clean > /dev/null 2>&1
377 export CXXFLAGS="-DDEBUG -g2 -O1 -DNO_OS_DEPENDENCE $ADD_CXXFLAGS"
378 "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
379 ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
380 ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
381 
382 ############################################
383 # Release build, OS Independence
384 echo
385 echo "************************************" | tee -a "$TEST_RESULTS"
386 echo "Testing: release, NO_OS_DEPENDENCE" | tee -a "$TEST_RESULTS"
387 echo
388 
389 unset CXXFLAGS
390 "$MAKE" clean > /dev/null 2>&1
391 export CXXFLAGS="-DNDEBUG -g2 -O2 -DNO_OS_DEPENDENCE $ADD_CXXFLAGS"
392 "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
393 ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
394 ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
395 
396 ############################################
397 # Debug build at -O3
398 echo
399 echo "************************************" | tee -a "$TEST_RESULTS"
400 echo "Testing: debug, -O3 optimizations" | tee -a "$TEST_RESULTS"
401 echo
402 
403 unset CXXFLAGS
404 "$MAKE" clean > /dev/null 2>&1
405 export CXXFLAGS="-DDEBUG -g2 -O3 $ADD_CXXFLAGS"
406 "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
407 ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
408 ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
409 
410 ############################################
411 # Release build at -O3
412 echo
413 echo "************************************" | tee -a "$TEST_RESULTS"
414 echo "Testing: release, -O3 optimizations" | tee -a "$TEST_RESULTS"
415 echo
416 
417 unset CXXFLAGS
418 "$MAKE" clean > /dev/null 2>&1
419 export CXXFLAGS="-DNDEBUG -g2 -O3 $ADD_CXXFLAGS"
420 "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
421 ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
422 ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
423 
424 ############################################
425 # Debug build at -Os
426 echo
427 echo "************************************" | tee -a "$TEST_RESULTS"
428 echo "Testing: debug, -Os optimizations" | tee -a "$TEST_RESULTS"
429 echo
430 
431 unset CXXFLAGS
432 "$MAKE" clean > /dev/null 2>&1
433 export CXXFLAGS="-DDEBUG -g2 -Os $ADD_CXXFLAGS"
434 "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
435 ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
436 ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
437 
438 ############################################
439 # Release build at -Os
440 echo
441 echo "************************************" | tee -a "$TEST_RESULTS"
442 echo "Testing: release, -Os optimizations" | tee -a "$TEST_RESULTS"
443 echo
444 
445 unset CXXFLAGS
446 "$MAKE" clean > /dev/null 2>&1
447 export CXXFLAGS="-DNDEBUG -g2 -Os $ADD_CXXFLAGS"
448 "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
449 ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
450 ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
451 
452 ############################################
453 # Debug build, UBSan, c++03
454 if [ "$HAVE_CXX03" -ne "0" ] && [ "$HAVE_UBSAN" -ne "0" ]; then
455  echo
456  echo "************************************" | tee -a "$TEST_RESULTS"
457  echo "Testing: debug, c++03, UBsan" | tee -a "$TEST_RESULTS"
458  echo
459 
460  unset CXXFLAGS
461  "$MAKE" clean > /dev/null 2>&1
462  export CXXFLAGS="-DDEBUG -g2 -O1 -std=c++03 $ADD_CXXFLAGS"
463  "$MAKE" ubsan | tee -a "$TEST_RESULTS"
464  ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
465  ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
466 fi
467 
468 ############################################
469 # Release build, UBSan, c++03
470 if [ "$HAVE_CXX03" -ne "0" ] && [ "$HAVE_UBSAN" -ne "0" ]; then
471  echo
472  echo "************************************" | tee -a "$TEST_RESULTS"
473  echo "Testing: release, c++03, UBsan" | tee -a "$TEST_RESULTS"
474  echo
475 
476  unset CXXFLAGS
477  "$MAKE" clean > /dev/null 2>&1
478  export CXXFLAGS="-DNDEBUG -g2 -O2 -std=c++03 $ADD_CXXFLAGS"
479  "$MAKE" ubsan | tee -a "$TEST_RESULTS"
480  ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
481  ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
482 fi
483 
484 ############################################
485 # Debug build, Asan, c++03
486 if [ "$HAVE_CXX03" -ne "0" ] && [ "$HAVE_ASAN" -ne "0" ]; then
487  echo
488  echo "************************************" | tee -a "$TEST_RESULTS"
489  echo "Testing: debug, c++03, Asan" | tee -a "$TEST_RESULTS"
490  echo
491 
492  unset CXXFLAGS
493  "$MAKE" clean > /dev/null 2>&1
494  export CXXFLAGS="-DDEBUG -g2 -O1 -std=c++03 $ADD_CXXFLAGS"
495  "$MAKE" asan | tee -a "$TEST_RESULTS"
496  ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
497  ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
498 fi
499 
500 ############################################
501 # Release build, Asan, c++03
502 if [ "$HAVE_CXX03" -ne "0" ] && [ "$HAVE_ASAN" -ne "0" ]; then
503  echo
504  echo "************************************" | tee -a "$TEST_RESULTS"
505  echo "Testing: release, c++03, Asan" | tee -a "$TEST_RESULTS"
506  echo
507 
508  unset CXXFLAGS
509  "$MAKE" clean > /dev/null 2>&1
510  export CXXFLAGS="-DNDEBUG -g2 -O2 -std=c++03 $ADD_CXXFLAGS"
511  "$MAKE" asan | tee -a "$TEST_RESULTS"
512  ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
513  ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
514 fi
515 
516 ############################################
517 # Release build, UBSan, c++11
518 if [ "$HAVE_CXX11" -ne "0" ] && [ "$HAVE_UBSAN" -ne "0" ]; then
519  echo "************************************" | tee -a "$TEST_RESULTS"
520  echo "Testing: c++11, UBsan" | tee -a "$TEST_RESULTS"
521  echo
522 
523  unset CXXFLAGS
524  "$MAKE" clean > /dev/null 2>&1
525  export CXXFLAGS="-DNDEBUG -g2 -O2 -std=c++11 $ADD_CXXFLAGS"
526  "$MAKE" ubsan | tee -a "$TEST_RESULTS"
527  ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
528  ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
529 fi
530 
531 ############################################
532 # Release build, Asan, c++11
533 if [ "$HAVE_CXX11" -ne "0" ] && [ "$HAVE_ASAN" -ne "0" ]; then
534  echo
535  echo "************************************" | tee -a "$TEST_RESULTS"
536  echo "Testing: c++11, Asan" | tee -a "$TEST_RESULTS"
537  echo
538 
539  unset CXXFLAGS
540  "$MAKE" clean > /dev/null 2>&1
541  export CXXFLAGS="-DNDEBUG -g2 -O2 -std=c++11 $ADD_CXXFLAGS"
542  "$MAKE" asan | tee -a "$TEST_RESULTS"
543  ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
544  ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
545 fi
546 
547 # For Darwin, we need to test both -stdlib=libstdc++ (GNU) and
548 # -stdlib=libc++ (LLVM) crossed with -std=c++03 and -std=c++11.
549 
550 ############################################
551 # Darwin, c++03, libc++
552 if [ "$HAVE_CXX03" -ne "0" ] && [ "$IS_DARWIN" -ne "0" ]; then
553  echo
554  echo "************************************" | tee -a "$TEST_RESULTS"
555  echo "Testing: Darwin, c++03, libc++ (LLVM)" | tee -a "$TEST_RESULTS"
556  echo
557 
558  unset CXXFLAGS
559  "$MAKE" clean > /dev/null 2>&1
560  export CXXFLAGS="-DNDEBUG -g2 -O2 -std=c++03 -stdlib=libc++ $ADD_CXXFLAGS"
561  "$MAKE" static cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
562  ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
563  ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
564 fi
565 
566 ############################################
567 # Darwin, c++03, libstdc++
568 if [ "$HAVE_CXX03" -ne "0" ] && [ "$IS_DARWIN" -ne "0" ]; then
569  echo
570  echo "************************************" | tee -a "$TEST_RESULTS"
571  echo "Testing: Darwin, c++03, libstdc++ (GNU)" | tee -a "$TEST_RESULTS"
572  echo
573 
574  unset CXXFLAGS
575  "$MAKE" clean > /dev/null 2>&1
576  export CXXFLAGS="-DNDEBUG -g2 -O2 -std=c++03 -stdlib=libstdc++ $ADD_CXXFLAGS"
577  "$MAKE" static cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
578  ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
579  ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
580 fi
581 
582 ############################################
583 # Darwin, c++11, libc++
584 if [ "$IS_DARWIN" -ne "0" ] && [ "$HAVE_CXX11" -ne "0" ]; then
585  echo
586  echo "************************************" | tee -a "$TEST_RESULTS"
587  echo "Testing: Darwin, c++11, libc++ (LLVM)" | tee -a "$TEST_RESULTS"
588  echo
589 
590  unset CXXFLAGS
591  "$MAKE" clean > /dev/null 2>&1
592  export CXXFLAGS="-DNDEBUG -g2 -O2 -std=c++11 -stdlib=libc++ $ADD_CXXFLAGS"
593  "$MAKE" static cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
594  ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
595  ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
596 fi
597 
598 ############################################
599 # Darwin, c++11, libstdc++
600 if [ "$IS_DARWIN" -ne "0" ] && [ "$HAVE_CXX11" -ne "0" ]; then
601  echo
602  echo "************************************" | tee -a "$TEST_RESULTS"
603  echo "Testing: Darwin, c++11, libstdc++ (GNU)" | tee -a "$TEST_RESULTS"
604  echo
605 
606  unset CXXFLAGS
607  "$MAKE" clean > /dev/null 2>&1
608  export CXXFLAGS="-DNDEBUG -g2 -O2 -std=c++11 -stdlib=libstdc++ $ADD_CXXFLAGS"
609  "$MAKE" static cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
610  ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
611  ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
612 fi
613 
614 ############################################
615 # Darwin, c++03, Malloc Guards
616 if [ "$IS_DARWIN" -ne "0" ] && [ "$HAVE_CXX03" -ne "0" ]; then
617  echo
618  echo "************************************" | tee -a "$TEST_RESULTS"
619  echo "Testing: Darwin, c++03, Malloc Guards" | tee -a "$TEST_RESULTS"
620  echo
621 
622  unset CXXFLAGS
623  "$MAKE" clean > /dev/null 2>&1
624  export CXXFLAGS="-DNDEBUG -g2 -O2 -std=c++03 $ADD_CXXFLAGS"
625  "$MAKE" static cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
626 
627  export MallocScribble=1
628  export MallocPreScribble=1
629  export MallocGuardEdges=1
630  ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
631  ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
632  unset MallocScribble MallocPreScribble MallocGuardEdges
633 fi
634 
635 ############################################
636 # Darwin, c++11, Malloc Guards
637 if [ "$IS_DARWIN" -ne "0" ] && [ "$HAVE_CXX11" -ne "0" ]; then
638  echo
639  echo "************************************" | tee -a "$TEST_RESULTS"
640  echo "Testing: Darwin, c++11, Malloc Guards" | tee -a "$TEST_RESULTS"
641  echo
642 
643  unset CXXFLAGS
644  "$MAKE" clean > /dev/null 2>&1
645  export CXXFLAGS="-DNDEBUG -g2 -O2 -std=c++11 $ADD_CXXFLAGS"
646  "$MAKE" static cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
647 
648  export MallocScribble=1
649  export MallocPreScribble=1
650  export MallocGuardEdges=1
651  ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
652  ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
653  unset MallocScribble MallocPreScribble MallocGuardEdges
654 fi
655 
656 # Try to locate a Xcode compiler for testing under Darwin
657 XCODE_COMPILER=$(find /Applications/Xcode*.app/Contents/Developer -name clang++ | head -1)
658 
659 ############################################
660 # Xcode compiler
661 if [ "$IS_DARWIN" -ne "0" ] && [ -z "$XCODE_COMPILER" ]; then
662  echo
663  echo "************************************" | tee -a "$TEST_RESULTS"
664  echo "Testing: Xcode Clang compiler" | tee -a "$TEST_RESULTS"
665  echo
666 
667  unset CXXFLAGS
668  "$MAKE" clean > /dev/null 2>&1
669  expot CXX="$XCODE_COMPILER"
670  export CXXFLAGS="-DNDEBUG -g2 -O2 -std=c++11 $ADD_CXXFLAGS"
671  "$MAKE" static cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
672  ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
673  ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
674 fi
675 
676 ############################################
677 # Benchmarks, c++03
678 if [ "$HAVE_CXX03" -ne "0" ]; then
679  echo
680  echo "************************************" | tee -a "$TEST_RESULTS"
681  echo "Testing: Benchmarks, c++03" | tee -a "$TEST_RESULTS"
682  echo
683 
684  unset CXXFLAGS
685  "$MAKE" clean > /dev/null 2>&1
686  export CXXFLAGS="-DNDEBUG -O3 -std=c++03 $ADD_CXXFLAGS"
687  "$MAKE" static cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
688  ./cryptest.exe b 3 2.4+1e9 2>&1 | tee -a "$BENCHMARK_RESULTS"
689 fi
690 
691 ############################################
692 # Benchmarks, c++11
693 if [ "$HAVE_CXX11" -ne "0" ]; then
694  echo
695  echo "************************************" | tee -a "$TEST_RESULTS"
696  echo "Testing: Benchmarks, c++11" | tee -a "$TEST_RESULTS"
697  echo
698 
699  unset CXXFLAGS
700  "$MAKE" clean > /dev/null 2>&1
701  export CXXFLAGS="-DNDEBUG -O3 -std=c++11 $ADD_CXXFLAGS"
702  "$MAKE" static cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
703  ./cryptest.exe b 3 2.4+1e9 2>&1 | tee -a "$BENCHMARK_RESULTS"
704 fi
705 
706 # For Cygwin, we need to test both PREFER_BERKELEY_STYLE_SOCKETS
707 # and PREFER_WINDOWS_STYLE_SOCKETS
708 
709 ############################################
710 # MinGW and PREFER_BERKELEY_STYLE_SOCKETS
711 if [ "$IS_MINGW" -ne "0" ]; then
712  echo
713  echo "************************************" | tee -a "$TEST_RESULTS"
714  echo "Testing: MinGW, PREFER_BERKELEY_STYLE_SOCKETS" | tee -a "$TEST_RESULTS"
715  echo
716 
717  unset CXXFLAGS
718  "$MAKE" clean > /dev/null 2>&1
719  export CXXFLAGS="-DNDEBUG -g2 -O2 -DPREFER_BERKELEY_STYLE_SOCKETS -DNO_WINDOWS_STYLE_SOCKETS $ADD_CXXFLAGS"
720  "$MAKE" static cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
721  ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
722  ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
723 fi
724 
725 ############################################
726 # MinGW and PREFER_WINDOWS_STYLE_SOCKETS
727 if [ "$IS_MINGW" -ne "0" ]; then
728  echo
729  echo "************************************" | tee -a "$TEST_RESULTS"
730  echo "Testing: MinGW, PREFER_WINDOWS_STYLE_SOCKETS" | tee -a "$TEST_RESULTS"
731  echo
732 
733  unset CXXFLAGS
734  "$MAKE" clean > /dev/null 2>&1
735  export CXXFLAGS="-DNDEBUG -g2 -O2 -DPREFER_WINDOWS_STYLE_SOCKETS -DNO_BERKELEY_STYLE_SOCKETS $ADD_CXXFLAGS"
736  "$MAKE" static cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
737  ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
738  ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
739 fi
740 
741 ############################################
742 # Valgrind, c++03. Requires -O1 for accurate results
743 if [ "$HAVE_CXX03" -ne "0" ] && [ "$HAVE_VALGRIND" -ne "0" ]; then
744  echo
745  echo "************************************" | tee -a "$TEST_RESULTS"
746  echo "Testing: Valgrind, c++03" | tee -a "$TEST_RESULTS"
747  echo
748 
749  unset CXXFLAGS
750  "$MAKE" clean > /dev/null 2>&1
751  export CXXFLAGS="-DNDEBUG -std=c++03 -g3 -O1 $ADD_CXXFLAGS"
752  "$MAKE" static cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
753  valgrind --track-origins=yes ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
754  valgrind --track-origins=yes ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
755 fi
756 
757 ############################################
758 # Valgrind, c++11. Requires -O1 for accurate results
759 if [ "$HAVE_VALGRIND" -ne "0" ] && [ "$HAVE_CXX11" -ne "0" ]; then
760  echo
761  echo "************************************" | tee -a "$TEST_RESULTS"
762  echo "Testing: Valgrind, c++11" | tee -a "$TEST_RESULTS"
763  echo
764 
765  unset CXXFLAGS
766  "$MAKE" clean > /dev/null 2>&1
767  export CXXFLAGS="-DNDEBUG -std=c++11 -g3 -O1 $ADD_CXXFLAGS"
768  "$MAKE" static cryptest.exe 2>&1 | tee -a "$TEST_RESULTS"
769  valgrind --track-origins=yes ./cryptest.exe v 2>&1 | tee -a "$TEST_RESULTS"
770  valgrind --track-origins=yes ./cryptest.exe tv all 2>&1 | tee -a "$TEST_RESULTS"
771 fi
772 
773 ############################################
774 ############################################
775 
776 if [ "$CXX" == "g++" ] && [ "$HAVE_CXX11" -ne "0" ]; then
777 
778  ############################################
779  # Basic debug build
780  echo
781  echo "************************************" | tee -a "$WARN_TEST_RESULTS"
782  echo "Testing: debug, c++11, elevated warnings" | tee -a "$WARN_TEST_RESULTS"
783  echo
784 
785  unset CXXFLAGS
786  "$MAKE" clean > /dev/null 2>&1
787  export CXXFLAGS="-DDEBUG -g2 -O2 -std=c++11 -DCRYPTOPP_NO_BACKWARDS_COMPATIBILITY_562 -Wall -Wextra -Wno-unknown-pragmas"
788  "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$WARN_TEST_RESULTS"
789 
790  ############################################
791  # Basic release build
792  echo
793  echo "************************************" | tee -a "$WARN_TEST_RESULTS"
794  echo "Testing: release, c++11, elevated warnings" | tee -a "$WARN_TEST_RESULTS"
795  echo
796 
797  unset CXXFLAGS
798  "$MAKE" clean > /dev/null 2>&1
799  export CXXFLAGS="-DNDEBUG -g2 -O2 -std=c++11 -DCRYPTOPP_NO_BACKWARDS_COMPATIBILITY_562 -Wall -Wextra -Wno-unknown-pragmas"
800  "$MAKE" static dynamic cryptest.exe 2>&1 | tee -a "$WARN_TEST_RESULTS"
801 fi
802 
803 ############################################
804 ############################################
805 
806 TEST_END=$(date)
807 
808 echo "************************************************" | tee -a "$TEST_RESULTS"
809 echo "************************************************" | tee -a "$TEST_RESULTS"
810 echo | tee -a "$TEST_RESULTS"
811 
812 echo "Testing started: $TEST_BEGIN" | tee -a "$TEST_RESULTS"
813 echo "Testing finished: $TEST_END" | tee -a "$TEST_RESULTS"
814 echo | tee -a "$TEST_RESULTS"
815 
816 COUNT=$(grep -a "Testing: " cryptest-result.txt | wc -l)
817 if [ "$COUNT" -eq "0" ]; then
818  echo "No configurations tested" | tee -a "$TEST_RESULTS"
819 else
820  echo "$COUNT configurations tested" | tee -a "$TEST_RESULTS"
821 fi
822 echo | tee -a "$TEST_RESULTS"
823 
824 # "FAILED" is from Crypto++
825 # "Error" is from the GNU assembler
826 # "error" is from the sanitizers
827 # "Illegal", "0 errors" and "suppressed errors" are from Valgrind.
828 COUNT=$(egrep -a '(Error|error|FAILED|Illegal)' cryptest-result.txt | egrep -v "( 0 errors|suppressed errors|memory error detector)" | wc -l)
829 if [ "$COUNT" -eq "0" ]; then
830  echo "No failures detected" | tee -a "$TEST_RESULTS"
831 else
832  echo "$COUNT errors detected" | tee -a "$TEST_RESULTS"
833  echo
834  egrep -an "(Error|error|FAILED|Illegal)" cryptest-result.txt
835 fi
836 echo | tee -a "$TEST_RESULTS"
837 
838 echo "************************************************" | tee -a "$TEST_RESULTS"
839 echo "************************************************" | tee -a "$TEST_RESULTS"