【LINT】cpplint修改版:自定义编码风格检查工具lint
github:https://github.com/skullboyer/code-check
Code Check
- 本仓介绍的内容涉及代码静态检查和编码风格检查
- 但主要放在编码风格检查,lint是基于google编码风格检查cpplint的修改版,起别名也是为了区别
- lint较于cpplint优势如下:
- lint支持自定义编码风格检查(通过配置文件),而非cpplint特定于google风格
- lint支持生成结果文件通过cppcheck上位机查看和跳转
仓说明
. |————doc (说明文档及过程文件) | |————exe (打包好的可执行程序) | |————git_hook (嵌入git的钩子文件) | |————.scripts (特殊用法的脚本) | |____lint.py (cpplint修改版)
应用场景
- 嵌入git,在提交阶段进行检查
将git_hook中的文件放在自己项目的.git/hooks路径下,下次提交时便会触发代码检查
- 独立使用,基于特定的文件或文件夹
将.scripts中的脚本lint_folder.sh和format_cpplint.sh放在要检查的目录同一级,将exe文件夹放在上一级即可
- 嵌入jenkins进行自动化构建检查
借用cppcheck上位机可以方便解析lint检查的结果
确保检查后的.xml放置在刚检查文件夹的上一级,再使用cppcheck打开方可实现跳转
用法
./lint.exe --help Syntax: lint [--verbose=#] [--output=vs7] [--filter=-x,+y,...] [--counting=total|toplevel|detailed] [--root=subdir] [--linelength=digits] [--headers=x,y,...] [--quiet][--help][--useage][--generate][--about] <file> [file] ... Option: output=vs7 output is formate: 'emacs', 'vs7', 'eclipse' verbose=# output level: 0-5, message less than [verbose] will not be printed quiet Don't print anything if no errors are found filter=-x,+y,... To see a list of all the categories used in cpplint, pass no arg: --filter= Examples: --filter=-whitespace,+whitespace/braces --filter=whitespace,runtime/printf,+runtime/printf_format --filter=-,+build/include_what_you_use counting=total Error statistics style. The total number of errors found is always printed total => Total errors found: toplevel => Category 'whitespace' errors found: detailed => Category 'whitespace/parens' errors found: root=subdir The root directory used for deriving header guard CPP variable. Examples: code directory: src/chrome/browser/ui/browser/ No flag => CHROME_BROWSER_UI_BROWSER_H_ --root=chrome => BROWSER_UI_BROWSER_H_ --root=chrome/browser => UI_BROWSER_H_ --root=.. => SRC_CHROME_BROWSER_UI_BROWSER_H_ linelength=digits Code line length, default: 120 characters. extensions=extension,extension,... The allowed file extensions that cpplint will check Examples: --extensions=hpp,cpp headers=x,y,... Examples: --headers=hpp,hxx --headers=hpp help Displays short usage information and exits. useage Displays detaile usage information and exits. generate Generate lint config file 'LINT.cfg' and exits about Displays version information and exits.
配置文件
- 生成自定义编码风格配置文件LINT.cfg
$ ./lint.exe --generate The LINT.cfg configuration file is generated successfully.
- 配置文件说明
# Copyright (c) 2022 skull.gu@gmail.com. All rights reserved. # Stop searching for additional config files. set noparent # Specifies the line of code for the project linelength=120 # Error filter # -: filter, +: pass filter=+whitespace/preprocess # It's not worth lint-gardening the file. exclude_files=doc # The root directories are specified relative to CPPLINT.cfg dir root= # The header extensions headers= # rule.1 # Naming rules for file names # 0: indifferent, 1: pure lowercase, 2: lowercase +_, 3: lowercase + digit +_, 4: uppercase, 5: uppercase + digit +_ # default: 3 lint_file_naming= # rule.2 # Whether copyright is required at the beginning of the file # start of file # -1: forbidden, 0: indifferent, 1: required # default: 1 lint_copyright_sof= # rule.3 # Whether a new line is required at the end of the file # end of file # -1: forbidden, 0: indifferent, 1: required # default: 1 lint_newline_eof= # rule.4 # Whether to disable TAB # -1: forbidden, 0: indifferent # default: -1 lint_use_tab= # rule.5 # The code line length # 0: indifferent, >0: length # default: 120 lint_line_length= # rule.6 # The number of lines in the function body # 0: indifferent, >0: length # default: 80 lint_function_line= # rule.7 # Number of Spaces to indent code. # 0: indifferent, >0: length # default: 4 lint_space_indent= # rule.8 # Whether extra space at the end of a line is allowed # -1: forbidden, 0: indifferent # default: -1 lint_space_eol= # rule.9 # Whether to allow multiple instructions in a row # -1: forbidden, 0: indifferent # default: -1 lint_multiple_cmd= # rule.10 # Whether blocks of code are required to use curly braces # -1: forbidden, 0: indifferent, 1: required # default: 1 lint_block_braces= # rule.11 # Whether to leave a space before or after the keyword # -1: forbidden, 0: indifferent, 1: required # default: 1 lint_space_keyword= # rule.12 # Whether to require 1 space before and after the operator # -1: forbidden, 0: indifferent, 1: required # default: 1 lint_space_operator= # rule.13 # Whether to ask preprocessor keyword '#include|#define|if|#elif|#ifdef|#ifndef|#endif' thus # 0: indifferent, 1: required # default: 1 lint_preprocess_thus= # rule.14 # For preprocessor keyword '#include|#define|if|#elif|#ifdef|#ifndef|#endif' allow space after '#' # -1: forbidden, 0: indifferent # default: -1 lint_preprocess_space= # rule.15 # Code Style selection # 1. K&R # if () { # a = b; # } # 2. Allman # if () # { # a = b; # } # 3. Whitesmiths # if () # { # a = b; # } # 4. GNU # if () # { # a = b; # } # default: 1 lint_code_style= # rule.16 # The function name is lowercase +_ # 0: indifferent, 1: required # default: 1 lint_func_naming= # rule.17 # Macro naming rules # 0: indifferent, 1: uppercase +_, 2: uppercase + number +_ # default: 1 lint_macro_naming= # rule.18 # Enum naming rules # 0: indifferent, 1: uppercase +_, 2: uppercase + number +_ # default: 1 lint_enum_naming= # rule.19 # Whether devil numbers are allowed # -1: forbidden, 0: indifferent # default: -1 lint_devil_numbers= # rule.20 # Comment style selection # 0: indifferent, 1: //, 2: /**/ # default: 0 lint_comment_style= # rule.21 # Whether to disallow more than one consecutive blank line # 0: indifferent, 1: forbidden # default: 1 lint_blank_line= # rule.22 # Whether the type conversion using C-style cast (static_cast | const_cast | reinterpret_cast) # 0: indifferent, 1: required # default: 0 lint_cstyle_cast= # rule.23 # Whether to disallow multiple code statements on the same line # eg: "a = 1; b = 2;", "if (1) { c = 3; }" # 0: indifferent, 1: forbidden # default: 1 lint_multiple_code= # rule.24 # Whether comments are required after '#endif' # 0: indifferent, 1: required # default: 0 lint_comment_endif=
- 配置文件的与Lint存放在同一级目录,一般是在项目顶级目录
- 在Lint时会读取配置文件,其中的选项参数决定检查的规则,如果没有找见配置文件则Lint使用默认配置进行规则检查
进展说明
- 文件名命名规则
[DONE]
- 文件首是否要求书写版权
[DONE]
- 文件尾是否要求新行
[DONE]
- 是否允许使用TAB
[DONE]
- 代码行长度要求
[DONE]
- 函数体行数要求
[DONE]
- 代码缩进空格数
[DONE]
- 行尾多余空格是否允许
[DONE]
- 是否允许一行出现多条指令
[DONE]
- 是否要求代码块(if|else|for|while)使用花括号 [1]
[DONE]
- 是否要求关键字前后留1个空格
[DONE]
- 是否要求运算符前后留1个空格(实现了部分)
[TODO]
- 是否要求预处理关键字'#include|#>define|if|#elif|#if>def|#ifn>def|#endif'顶格
[DONE]
- 是否允许预处理关键字'#include|#>define|if|#elif|#if>def|#ifn>def|#endif'井号后有空格
[DONE]
- 代码风格选择(实现了'K&R', 'Allman')
[TODO]
- 函数名命名规则为小写+_
[DONE]
- 宏命名规则
[DONE]
- 枚举命名规则 [1]
[DONE]
- 是否允许出现魔鬼数字
[DONE]
- 注释风格选择
[DONE]
- 是否禁止连续空行超过1行
[DONE]
- 类型转换是否使用C-style cast(static_cast|const_cast|reinterpret_cast)
[DONE]
- 是否禁止多条代码语句在同一行
[DONE]
- '#endif'后是否要求带注释
[DONE]
其他
- 使用pyinstaller工具将python文件打包成可执行文件,优势:只要windows环境就能运行
[注]:python2.7不能直接安装,需要特定版本:pip2 install pyinstaller==3.2.1
- 大家在使用过程中,发现任何bug及改进点欢迎提
issue
反馈给我
再牛逼的梦想也架不住傻逼似的坚持
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)