87 lines
2.9 KiB
Bash
Executable File
87 lines
2.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
script_folder="$(dirname $(readlink -f $0))"
|
|
|
|
# Initialize variables with defaults
|
|
source_folder="$script_folder/../speeduino" # -s, --source
|
|
out_folder="$script_folder/.results" # -o, --out
|
|
cppcheck_path="" # -c, --cppcheck
|
|
quiet=0 # -q, --quiet
|
|
output_xml=0 # -x, --xml
|
|
|
|
function parse_command_line() {
|
|
while [ $# -gt 0 ] ; do
|
|
case "$1" in
|
|
-s | --source) source_folder="$2" ;;
|
|
-o | --out) out_folder="$2" ;;
|
|
-c | --cppcheck) cppcheck_path="$2" ;;
|
|
-q | --quiet) quiet=1 ;;
|
|
-x | --xml) output_xml=1 ;;
|
|
-*)
|
|
echo "Unknown option: " $1
|
|
exit 1
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
}
|
|
|
|
parse_command_line "$@"
|
|
|
|
cppcheck_bin="${cppcheck_path}/cppcheck"
|
|
cppcheck_misra="${cppcheck_path}/addons/misra.py"
|
|
|
|
num_cores=`getconf _NPROCESSORS_ONLN`
|
|
let num_cores--
|
|
|
|
mkdir -p "$out_folder"
|
|
|
|
cppcheck_parameters=( --inline-suppr
|
|
--language=c++
|
|
--addon="$script_folder/misra.json"
|
|
--suppressions-list="$script_folder/suppressions.txt"
|
|
--platform=avr8
|
|
--cppcheck-build-dir="$out_folder"
|
|
-j "$num_cores"
|
|
-DCORE_AVR=1
|
|
-D__AVR_ATmega2560__
|
|
# This is defined in the AVR headers, which aren't included.
|
|
# cppcheck will not do type checking on unknown types.
|
|
# It's used a lot and it's unsigned, which can trigger a lot
|
|
# of type mismatch violations.
|
|
-Dbyte=uint8_t
|
|
# All violations from included libraries (*src* folders) are ignored
|
|
--suppress="*:*src*"
|
|
# No libdivide - analysis takes too long
|
|
-UUSE_LIBDIVIDE
|
|
# Don't parse the /src folder
|
|
-i "$source_folder/src"
|
|
"$source_folder/**.ino"
|
|
"$source_folder/**.cpp")
|
|
|
|
cppcheck_out_file="$out_folder/results.txt"
|
|
if [ $output_xml -eq 1 ]; then
|
|
cppcheck_out_file="$out_folder/results.xml"
|
|
cppcheck_parameters+=(--xml)
|
|
fi
|
|
|
|
# There is no way to tell the misra add on to skip certain headers
|
|
# libdivide adds 10+ minutes to each file so rename the folder
|
|
# before the scan
|
|
mv "$source_folder"/src/libdivide "$source_folder"/src/_libdivide
|
|
|
|
"$cppcheck_bin" ${cppcheck_parameters[@]} 2> $cppcheck_out_file
|
|
|
|
# Restore libdivide folder name after scan
|
|
mv "$source_folder"/src/_libdivide "$source_folder"/src/libdivide
|
|
|
|
# Count lines for Mandatory or Required rules
|
|
error_count=`grep -i "Mandatory - \|Required - " < "$cppcheck_out_file" | wc -l`
|
|
|
|
if [ $quiet -eq 0 ]; then
|
|
cat "$cppcheck_out_file"
|
|
fi
|
|
echo $error_count MISRA violations
|
|
echo $error_count > "$out_folder/error_count.txt"
|
|
|
|
exit 0 |