使用 OCLint进行静态代码分析:一个完整的配置示例

0. 概述

OCLint是一个静态代码分析工具,通过词法分析和语法树生成来解析C、C++和Objective-C代码。它应用预定义规则集,进行语义分析和静态检查,检测代码风格、复杂性、潜在错误、性能和安全问题。

1. 安装 oclint

下载 https://github.com/oclint/oclint/releases/download/v0.13.1/oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz

设置环境变量后即可运行

2. oclint配置文件

---
# 禁用的规则列表
disable-rules:
  - LongLine
  - LongMethod
  - HighNPathComplexity
  - HighCyclomaticComplexity
  - DeepNestedBlock
  - HighNcssMethod
  - LongParameterList

# 需要启用的规则
rules:
  # Code Style Rules
  - RedundantVoidArgument
  - UseBoolLiteral
  - UseEqualsDefault
  - UseNullptr
  - MissingOverride
  - ExplicitConstructor
  - CppStyleCasts
  - BracesAroundStatements
  - ClassNamingConvention
  - StructNamingConvention
  - TypedefNamingConvention
  - EnumNamingConvention
  - MacroParentheses
  - ForwardDeclarationNamespace
  - LongVariableName
  - ShortVariableName
  - SwitchStatementsShouldHaveDefault
  - UseContainerLiteral
  - UselessParentheses

  # Performance Optimization Rules
  - AvoidPrivateStaticMembers

  # Security Rules
  - CertDcl21Cpp

  # Potential Bugs
  - BoolPointerImplicitConversion
  - MisplacedWideningCast
  - NarrowingConversion
  - ReinterpretCast
  - UnconventionalAssignOperator
  - DeadCode
  - DeprecatedObjCImplementedProtocols
  - DuplicateMethodMatch
  - InvertedLogic
  - NilAssignedToNonPointer
  - RedundantConditionalOperator
  - RedundantIfStatement
  - RedundantNilCheck
  - ReturnFromFinallyBlock
  - UnreachableCode
  - UnusedMethodParameter
  - UnusedLocalVariable

  # Best Coding Practices
  - NonConstParameter
  - UndelegatedConstructor
  - MacroRepeatedSideEffects
  - ParameterReassignment
  - PreferEarlyExit
  - NestedBlockDepth
  - MagicNumber
  - MissingBreakInSwitchStatement
  - TooManyFields
  - TooManyMethods
  - TooManyParameters
  - UseEarlyExit

  # Miscellaneous
  - GotoStatement

3. 脚本详解

以下是对给定OCLint配置文件的解读:

3.1 禁用的规则列表

这些规则被禁用,是为了避免在代码分析过程中被检查到:

  1. LongLine - 禁用对代码行长度的检查。
  2. LongMethod - 禁用对方法长度的检查。
  3. HighNPathComplexity - 禁用对N路径复杂度的检查。
  4. HighCyclomaticComplexity - 禁用对圈复杂度的检查。
  5. DeepNestedBlock - 禁用对深层嵌套块的检查。
  6. HighNcssMethod - 禁用对方法的NCSS(非注释源代码语句)数量的检查。
  7. LongParameterList - 禁用对长参数列表的检查。

3.2 需要启用的规则

这些规则被启用,是为了在代码分析过程中进行检查:

代码风格
  1. RedundantVoidArgument - 检查冗余的void参数。
  2. UseBoolLiteral - 强制使用布尔字面量(true/false)。
  3. UseEqualsDefault - 使用=default指定默认构造函数。
  4. UseNullptr - 使用nullptr代替NULL。
  5. MissingOverride - 检查缺失的override关键字。
  6. ExplicitConstructor - 强制构造函数使用explicit关键字。
  7. CppStyleCasts - 使用C++风格的类型转换。
  8. BracesAroundStatements - 强制在语句周围使用大括号。
  9. SwitchStatementsShouldHaveDefault - 检查switch语句中是否有default分支。
  10. UseContainerLiteral - 使用容器字面量。
  11. UseEarlyExit - 优先使用提前返回。
代码复杂性
  1. NestedBlockDepth - 检查嵌套块的深度。
  2. LongVariableName - 检查变量名称是否过长。
  3. ShortVariableName - 检查变量名称是否过短。
  4. TooManyFields - 检查类中字段的数量是否过多。
  5. TooManyMethods - 检查类中方法的数量是否过多。
  6. TooManyParameters - 检查方法的参数数量是否过多。
命名规范
  1. ClassNamingConvention - 检查类的命名规范。
  2. StructNamingConvention - 检查结构体的命名规范。
  3. TypedefNamingConvention - 检查typedef的命名规范。
  4. EnumNamingConvention - 检查枚举的命名规范。
性能
  1. NonConstParameter - 检查非const参数。
  2. UndelegatedConstructor - 检查未委托的构造函数。
  3. AvoidPrivateStaticMembers - 避免私有静态成员。
安全性
  1. CertDcl21Cpp - CERT C++编程标准的规则。
  2. MacroParentheses - 检查宏定义中的括号。
  3. MacroRepeatedSideEffects - 检查宏定义中重复的副作用。
  4. ForwardDeclarationNamespace - 检查命名空间中的前向声明。
  5. BoolPointerImplicitConversion - 检查布尔指针的隐式转换。
  6. MisplacedWideningCast - 检查位置错误的扩宽类型转换。
  7. NarrowingConversion - 检查缩小类型转换。
  8. ReinterpretCast - 检查reinterpret_cast。
  9. UnconventionalAssignOperator - 检查非常规的赋值操作符。
其他
  1. DeadCode - 检查死代码。
  2. DeprecatedObjCImplementedProtocols - 检查废弃的ObjC实现的协议。
  3. DuplicateMethodMatch - 检查重复的方法匹配。
  4. GotoStatement - 检查goto语句。
  5. InvertedLogic - 检查反向逻辑。
  6. MagicNumber - 检查魔术数字。
  7. MissingBreakInSwitchStatement - 检查switch语句中缺失的break。
  8. NilAssignedToNonPointer - 检查将nil赋值给非指针。
  9. ParameterReassignment - 检查参数重新赋值。
  10. RedundantConditionalOperator - 检查冗余的条件操作符。
  11. RedundantIfStatement - 检查冗余的if语句。
  12. RedundantNilCheck - 检查冗余的nil检查。
  13. ReturnFromFinallyBlock - 检查finally块中的返回。
  14. UnreachableCode - 检查无法到达的代码。
  15. UnusedMethodParameter - 检查未使用的方法参数。
  16. UnusedLocalVariable - 检查未使用的局部变量。
  17. UselessParentheses - 检查无用的括号。

4. 检测执行

1. 使用 CMake 生成 compile_commands.json

为了使用 Cppcheck 的 --project 选项,你需要一个 compile_commands.json 文件。这个文件是一个编译数据库,包含项目中所有源文件的编译信息。
如果你的项目使用 CMake 构建,可以通过以下命令生成 compile_commands.json 文件:

cd /path/to/your/project
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .

运行上述命令后,会在项目的构建目录中生成一个 compile_commands.json 文件。

2. 运行 Oclint

  • .oclint配置文件放在代码工程根目录
  • 接着执行:oclint-json-compilation-database -p . -- -extra-arg=-std=c++14 -report-type html -o oclint_report.html

相关推荐

  1. python实现使用命令行进行testbed静态分析

    2024-06-08 16:48:04       28 阅读
  2. spring boot使用配置文件对静态变量进行赋值

    2024-06-08 16:48:04       62 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-08 16:48:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-08 16:48:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-08 16:48:04       82 阅读
  4. Python语言-面向对象

    2024-06-08 16:48:04       91 阅读

热门阅读

  1. src&href,fetch&ajax,cookie&session

    2024-06-08 16:48:04       30 阅读
  2. 设计模式之原型模式

    2024-06-08 16:48:04       24 阅读
  3. 计算机网络时延计算的单位换算问题

    2024-06-08 16:48:04       26 阅读
  4. 基于MBD开发汽车软件

    2024-06-08 16:48:04       29 阅读
  5. 贪心算法例子

    2024-06-08 16:48:04       30 阅读
  6. What floors can electric dust carts be used to clean?

    2024-06-08 16:48:04       30 阅读
  7. adb多设备多屏幕调试

    2024-06-08 16:48:04       25 阅读
  8. 【词法分析概要】

    2024-06-08 16:48:04       30 阅读