文章目录
- 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 禁用的规则列表
这些规则被禁用,是为了避免在代码分析过程中被检查到:
- LongLine – 禁用对代码行长度的检查。
- LongMethod – 禁用对方法长度的检查。
- HighNPathComplexity – 禁用对N路径复杂度的检查。
- HighCyclomaticComplexity – 禁用对圈复杂度的检查。
- DeepNestedBlock – 禁用对深层嵌套块的检查。
- HighNcssMethod – 禁用对方法的NCSS(非注释源代码语句)数量的检查。
- LongParameterList – 禁用对长参数列表的检查。
3.2 需要启用的规则
这些规则被启用,是为了在代码分析过程中进行检查:
代码风格
- RedundantVoidArgument – 检查冗余的void参数。
- UseBoolLiteral – 强制使用布尔字面量(true/false)。
- UseEqualsDefault – 使用=default指定默认构造函数。
- UseNullptr – 使用nullptr代替NULL。
- MissingOverride – 检查缺失的override关键字。
- ExplicitConstructor – 强制构造函数使用explicit关键字。
- CppStyleCasts – 使用C++风格的类型转换。
- BracesAroundStatements – 强制在语句周围使用大括号。
- SwitchStatementsShouldHaveDefault – 检查switch语句中是否有default分支。
- UseContainerLiteral – 使用容器字面量。
- UseEarlyExit – 优先使用提前返回。
代码复杂性
- NestedBlockDepth – 检查嵌套块的深度。
- LongVariableName – 检查变量名称是否过长。
- ShortVariableName – 检查变量名称是否过短。
- TooManyFields – 检查类中字段的数量是否过多。
- TooManyMethods – 检查类中方法的数量是否过多。
- TooManyParameters – 检查方法的参数数量是否过多。
命名规范
- ClassNamingConvention – 检查类的命名规范。
- StructNamingConvention – 检查结构体的命名规范。
- TypedefNamingConvention – 检查typedef的命名规范。
- EnumNamingConvention – 检查枚举的命名规范。
性能
- NonConstParameter – 检查非const参数。
- UndelegatedConstructor – 检查未委托的构造函数。
- AvoidPrivateStaticMembers – 避免私有静态成员。
安全性
- CertDcl21Cpp – CERT C++编程标准的规则。
- MacroParentheses – 检查宏定义中的括号。
- MacroRepeatedSideEffects – 检查宏定义中重复的副作用。
- ForwardDeclarationNamespace – 检查命名空间中的前向声明。
- BoolPointerImplicitConversion – 检查布尔指针的隐式转换。
- MisplacedWideningCast – 检查位置错误的扩宽类型转换。
- NarrowingConversion – 检查缩小类型转换。
- ReinterpretCast – 检查reinterpret_cast。
- UnconventionalAssignOperator – 检查非常规的赋值操作符。
其他
- DeadCode – 检查死代码。
- DeprecatedObjCImplementedProtocols – 检查废弃的ObjC实现的协议。
- DuplicateMethodMatch – 检查重复的方法匹配。
- GotoStatement – 检查goto语句。
- InvertedLogic – 检查反向逻辑。
- MagicNumber – 检查魔术数字。
- MissingBreakInSwitchStatement – 检查switch语句中缺失的break。
- NilAssignedToNonPointer – 检查将nil赋值给非指针。
- ParameterReassignment – 检查参数重新赋值。
- RedundantConditionalOperator – 检查冗余的条件操作符。
- RedundantIfStatement – 检查冗余的if语句。
- RedundantNilCheck – 检查冗余的nil检查。
- ReturnFromFinallyBlock – 检查finally块中的返回。
- UnreachableCode – 检查无法到达的代码。
- UnusedMethodParameter – 检查未使用的方法参数。
- UnusedLocalVariable – 检查未使用的局部变量。
- 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