cpplint 新增自定义checker介绍

简介: 通过为cpplint新增自定义规则,可以让 cpplint 更加贴合项目的编码规范,从而提高代码的质量和一致性。

cpplint 新增自定义规则

cpplint 介绍

cpplint 是一个用于检查 C/C++ 代码风格的工具,它基于 Google 的 C++ 编码规范。通过使用 cpplint,开发者可以确保代码的一致性和可读性,从而提高代码质量。

新增自定义规则

在使用 cpplint 的过程中,有时需要根据项目的特定需求新增自定义规则。可以通过修改 cpplint 的源代码的方式来实现。

源码简单分析

首先我们可以下载cpplint的源码,进行简单的分析。

其中cpplint.py是其实际执行的检测脚本。在脚本的最后我们可以找到其中的main函数。

def main():
  filenames = ParseArguments(sys.argv[1:])
  backup_err = sys.stderr
  try:
    # Change stderr to write with replacement characters so we don't die
    # if we try to print something containing non-ASCII characters.
    sys.stderr = codecs.StreamReader(sys.stderr, 'replace')

    _cpplint_state.ResetErrorCounts()
    for filename in filenames:
      ProcessFile(filename, _cpplint_state.verbose_level)
    # If --quiet is passed, suppress printing error count unless there are errors.
    if not _cpplint_state.quiet or _cpplint_state.error_count > 0:
      _cpplint_state.PrintErrorCounts()

    if _cpplint_state.output_format == 'junit':
      sys.stderr.write(_cpplint_state.FormatJUnitXML())

  finally:
    sys.stderr = backup_err

  sys.exit(_cpplint_state.error_count > 0)

if __name__ == '__main__':
  main()

在main函数中我们可以看到,实际调用了ProcessFile函数对每个文件进行分析。

查看ProcessFile函数的定义,如下:

def ProcessFile(filename, vlevel, extra_check_functions=None):
  """Does google-lint on a single file.

  Args:
    filename: The name of the file to parse.

    vlevel: The level of errors to report.  Every error of confidence
    >= verbose_level will be reported.  0 is a good default.

    extra_check_functions: An array of additional check functions that will be
                           run on each source line. Each function takes 4
                           arguments: filename, clean_lines, line, error
  """

通过函数定义与注释可知,此函数可接收一个函数数组extra_check_functions。

数组中的每个函数都可对源码进行检测,且每个函数接收相同的四个参数。

通过这个参数我们就可以新增自定义的检测规则了。

这里介绍一下函数的四个参数:

  • filename: 源码的文件名
  • clean_lines: 一个CleansedLines类的实例,包含了文件内容,从中可提取原始的行、删除注释的行和去掉了注释和常量字符的行。
  • line: 行号
  • error: 一个cpplint的错误类的实例

新增自定义checker

通过简单分析源码后,新增自定义checker的整体流程如下:

  1. 新增自定义checker函数,按实际规则编写。
  2. 定义extra_check_functions数组,将新增checker函数加入其中。
  3. 修改main函数,将ProcessFile函数调用修改为带extra_check_functions的版本。

此处以一个检测源码中是否包含中文的情况为例子,展示新增自定义cheker的流程:

  1. 在cpplint.py中新增CheckSourceChinese函数,函数定义如下:

    def CheckSourceChinese(filename, clean_lines, line, error):
     current_raw_line = clean_lines.raw_lines[line]
     if re.search(r'[\u4e00-\u9fa5]+', current_raw_line):
       error(filename, line, 'newchecker/chinese', 5,
             'Chinese characters are not allowed.')
    

    此函数会对文件的每一行都进行检测,此处中从clean_lines中获取了原始的行,因此不管是源码还是注释中出现中文都会报错。

  2. 定义extra_check_functions并新增CheckSourceChinese函数。

  3. 修改main函数,将ProcessFile函数调用修改为带extra_check_functions的版本。

    2、3步代码如下标绿处:

    def main():
     filenames = ParseArguments(sys.argv[1:])
     backup_err = sys.stderr
     try:
       # Change stderr to write with replacement characters so we don't die
       # if we try to print something containing non-ASCII characters.
       sys.stderr = codecs.StreamReader(sys.stderr, 'replace')
    
       _cpplint_state.ResetErrorCounts()
       extra_check_functions = [CheckSourceChinese,]
       for filename in filenames:
         ProcessFile(filename, _cpplint_state.verbose_level, extra_check_functions)
       # If --quiet is passed, suppress printing error count unless there are errors.
       if not _cpplint_state.quiet or _cpplint_state.error_count > 0:
         _cpplint_state.PrintErrorCounts()
    
       if _cpplint_state.output_format == 'junit':
         sys.stderr.write(_cpplint_state.FormatJUnitXML())
    
     finally:
       sys.stderr = backup_err
    
     sys.exit(_cpplint_state.error_count > 0)
    
    if __name__ == '__main__':
     main()
    

测试效果:

a.cpp:23:  Chinese characters are not allowed.  [newchecker/chinese] [5]

总结

通过新增自定义规则,可以让 cpplint 更加贴合项目的编码规范,从而提高代码的质量和一致性。

目录
相关文章
|
XML 安全 IDE
【C/C++ 实用工具】CppCheck:静态代码检测工具,让你的代码更安全
【C/C++ 实用工具】CppCheck:静态代码检测工具,让你的代码更安全
3706 2
|
存储 编译器 测试技术
CppCheck的使用
CppCheck的使用
1044 0
|
物联网 Python 网络性能优化
在ESP32上使用umqtt接入阿里云物联网平台
网络上已经有使用python 模拟设备接入阿里云,手里刚好有块ESP32的小板子,在上面跑过Alios Things,然后接入阿里云。但是终究感觉麻烦,有的时候只是做一个很简单的应用,跑os确实不太方便。
12437 1
|
3月前
|
人工智能 前端开发 算法
DeepCode:把论文和想法变成代码的 AI 工具
DeepCode 是香港大学开源的 AI 编码工具,通过多智能体协作实现论文转代码、需求转网站、描述转后端三大功能。采用 MIT 协议,已获 7900+ 星标。适合科研人员、独立开发者和技术学习者使用,能有效提升开发效率。
|
NoSQL IDE 开发工具
**《惊爆!揭开函数调用关系图的神秘面纱,让你的代码世界天翻地覆!》**
【8月更文挑战第16天】函数调用关系图是软件开发中的重要工具,帮助直观理解程序结构与逻辑流程,有效进行代码优化、调试及复杂系统理解。可通过静态分析工具(如SourceMonitor)在不运行代码情况下构建调用图,或利用动态跟踪(如GDB、Python的`sys.settrace`)在运行时记录调用顺序。集成开发环境(IDE)如Visual Studio亦提供相关功能。不同方法各有优势,可根据需求灵活选择。
730 4
|
9月前
|
存储 安全 Go
Map的遍历与判断键是否存在-《Go语言实战指南》
本文介绍了 Go 语言中对 `map` 的常见操作,包括遍历所有项和判断键是否存在。通过 `for range` 可以遍历 `map` 的键值对、仅键或仅值(需忽略键)。注意,`map` 遍历顺序是随机的。判断键是否存在时,使用双赋值语法 `value, ok := map[key]`,其中 `ok` 表示键是否存在。直接访问不存在的键会返回类型的零值,可能导致逻辑错误。掌握这些机制可更安全高效地处理键值对数据。
|
人工智能 搜索推荐 API
用于企业AI搜索的Bocha Web Search API,给LLM提供联网搜索能力和长文本上下文
博查Web Search API是由博查提供的企业级互联网网页搜索API接口,允许开发者通过编程访问博查搜索引擎的搜索结果和相关信息,实现在应用程序或网站中集成搜索功能。该API支持近亿级网页内容搜索,适用于各类AI应用、RAG应用和AI Agent智能体的开发,解决数据安全、价格高昂和内容合规等问题。通过注册博查开发者账户、获取API KEY并调用API,开发者可以轻松集成搜索功能。
【Qt 学习笔记】Qt常用控件 | 输入类控件 | Spin Box的使用及说明
【Qt 学习笔记】Qt常用控件 | 输入类控件 | Spin Box的使用及说明
1058 0
|
jenkins 持续交付
Jenkins Pipeline 流水线 - Parameters 参数化构建
Jenkins Pipeline 流水线 - Parameters 参数化构建
793 0