#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ C 语言代码规范检查(《嵌入式C语言代码规范(V1.0)》可机械化校验的规则) 由 pre-commit 调用:python scripts/check_coding_standard.py ,发现违规退出码 1。 检查项(括号内为规范条款号): S1 (2.3.1) .h 文件必须有 XXX_H 格式的头文件保护宏(禁止 __ 双下划线前缀) S2 (5.2) 文件开头必须有文件头注释(含 模块名称 / 作者) S3 (3.4.1) #define 宏名必须全大写 + 下划线 + 数字 S4 (3.5.1) typedef 类型名必须以 _t 结尾 S5 (6.3.2) switch 必须包含 default 分支 S6 (7.5) 禁用不安全字符串函数 strcpy/strcat/sprintf/gets S7 (6.3.3) 禁止使用 goto S8 (4.1.1) 禁止 Tab 缩进(使用 4 个空格) S9 (5.3) 函数定义必须有函数注释(含「函数功能」) 语义类规则(函数长度、单一职责、错误处理、递归等)无法机械可靠判定,不在此脚本范围。 """ import re import sys # 顶层函数定义行:类型 名称 ( 参数 ),可选同行左大括号 FUNC_DEF_RE = re.compile( r'^[A-Za-z_][A-Za-z0-9_\s\*]*\s+[a-z_][a-z0-9_]*\s*\([^;{]*\)\s*\{?\s*$' ) CTRL_RE = re.compile(r'^\s*(if|for|while|switch|return|do|else)\b') def check_file(path): with open(path, 'r', encoding='utf-8', errors='replace') as f: text = f.read() lines = text.splitlines() v = [] # (行号或'-', 规则, 说明) # S1 (2.3.1) .h 头文件保护宏 if path.endswith('.h') and \ not re.search(r'#\s*ifndef\s+(?