文章目录

    • 0. 概述
    • 1. 安装 oclint
    • 2. oclint配置文件
    • 3. 脚本详解
      • 3.1 禁用的规则列表
      • 3.2 需要启用的规则
        • 代码风格
        • 代码复杂性
        • 命名规范
        • 性能
        • 安全性
        • 其他
    • 4. 检测执行
      • 1. 使用 CMake 生成 `compile_commands.json`
      • 2. 运行 Oclint

0. 概述

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

1. 安装 oclint

下载 http://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
本站无任何商业行为
个人在线分享 » 使用 OCLint进行静态代码分析:一个完整的配置示例
E-->