#!/bin/bash /** * @file misra_checker.sh * @brief MISRA C compliance checker */ set -e # Script directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" # Color codes RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # MISRA configuration MISRA_VERSION="MISRA C:2012" MISRA_RULES="required" # required, advisory, all # Source directories SOURCE_DIRS=( "${PROJECT_ROOT}/kernel/src" "${PROJECT_ROOT}/drivers/src" "${PROJECT_ROOT}/middleware" "${PROJECT_ROOT}/applications" ) # Report directory REPORT_DIR="${PROJECT_ROOT}/build/misra" mkdir -p "${REPORT_DIR}" # Print banner echo -e "${BLUE}========================================${NC}" echo -e "${BLUE} MISRA C Compliance Checker${NC}" echo -e "${BLUE}========================================${NC}" echo -e " Version: ${YELLOW}${MISRA_VERSION}${NC}" echo -e " Rules: ${YELLOW}${MISRA_RULES}${NC}" echo "" # Check if cppcheck is available if ! command -v cppcheck >/dev/null 2>&1; then echo -e "${RED}Error: cppcheck not found${NC}" echo "Install with: sudo apt-get install cppcheck" exit 1 fi # Check if misra addon is available MISRA_ADDON="/usr/share/cppcheck/addons/misra.py" if [ ! -f "${MISRA_ADDON}" ]; then echo -e "${YELLOW}Warning: MISRA addon not found at ${MISRA_ADDON}${NC}" echo "Will use cppcheck with basic checks" USE_MISRA_ADDON=false else USE_MISRA_ADDON=true fi # Function to check directory check_directory() { local dir=$1 local report_file="${REPORT_DIR}/$(basename ${dir})_misra.txt" echo -e "${YELLOW}Checking ${dir}...${NC}" if [ "${USE_MISRA_ADDON}" = true ]; then cppcheck \ --enable=all \ --inconclusive \ --std=c11 \ --platform=arm32 \ --addon=misra \ --suppress=missingIncludeSystem \ --suppress=unusedFunction \ -I"${PROJECT_ROOT}/kernel/include" \ -I"${PROJECT_ROOT}/drivers/include" \ -I"${PROJECT_ROOT}/middleware" \ -I"${PROJECT_ROOT}/config" \ "${dir}" \ 2>&1 | tee "${report_file}" else cppcheck \ --enable=all \ --inconclusive \ --std=c11 \ --platform=arm32 \ --suppress=missingIncludeSystem \ --suppress=unusedFunction \ -I"${PROJECT_ROOT}/kernel/include" \ -I"${PROJECT_ROOT}/drivers/include" \ -I"${PROJECT_ROOT}/middleware" \ -I"${PROJECT_ROOT}/config" \ "${dir}" \ 2>&1 | tee "${report_file}" fi # Count violations local violations=$(grep -c "\[" "${report_file}" || true) echo -e " Found ${violations} potential violations" echo "" } # Check each source directory TOTAL_VIOLATIONS=0 for dir in "${SOURCE_DIRS[@]}"; do if [ -d "${dir}" ]; then check_directory "${dir}" fi done # Generate summary report SUMMARY_FILE="${REPORT_DIR}/summary.txt" echo "MISRA C Compliance Summary" > "${SUMMARY_FILE}" echo "=========================" >> "${SUMMARY_FILE}" echo "" >> "${SUMMARY_FILE}" echo "Date: $(date)" >> "${SUMMARY_FILE}" echo "Version: ${MISRA_VERSION}" >> "${SUMMARY_FILE}" echo "Rules: ${MISRA_RULES}" >> "${SUMMARY_FILE}" echo "" >> "${SUMMARY_FILE}" for report in "${REPORT_DIR}"/*_misra.txt; do if [ -f "${report}" ]; then dir_name=$(basename "${report}" _misra.txt) violations=$(grep -c "\[" "${report}" || true) echo "${dir_name}: ${violations} violations" >> "${SUMMARY_FILE}" fi done echo -e "${GREEN}========================================${NC}" echo -e "${GREEN} MISRA Check Complete${NC}" echo -e "${GREEN}========================================${NC}" echo -e "Summary: ${BLUE}${SUMMARY_FILE}${NC}"