文章目录
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 禁用的规则列表
这些规则被禁用,是为了避免在代码分析过程中被检查到:
- 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