使用 OCLint进行静态代码分析:一个完整的配置示例
文章目录
- 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
下载 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
相关文章:
使用 OCLint进行静态代码分析:一个完整的配置示例
文章目录 0. 概述1. 安装 oclint2. oclint配置文件3. 脚本详解3.1 禁用的规则列表3.2 需要启用的规则代码风格代码复杂性命名规范性能安全性其他 4. 检测执行1. 使用 CMake 生成 compile_commands.json2. 运行 Oclint 0. 概述 OCLint是一个静态代码分析工具,通过词…...
【Linux】线程的互斥
一、进程线程间的互斥相关的背景概念 临界资源:多线程执行流共享的资源就叫做临界资源临界区:每一个线程内部,访问临界资源的代码,就叫做临界区互斥:任何时刻,互斥保证有且只有一个执行流进入临界区&#…...
electron如何让你窗口总是显示在最前面【mac解决全屏窗口alwaysOnTop参数不起作用】
你创建了一个使用Electron框架的应用程序,并希望它在以下情况下始终保持可见: 在切换工作区(桌面)时可见在其他应用程序之上显示当其他应用程序全屏显示时,它也显示在顶部当Keynote处于演示模式时,它也能显示在顶部 特别是当Keynote处于演示模式时,要实现这一点比较困难…...
XR和Steam VR项目合并问题
最近有一个项目是用Steam VR开发的,里面部分场景是用VRTK框架做的,还有一部分是用SteamVR SDK自带的Player预制直接开发的。 这样本身没有问题,因为最终都是通过SteamVR SDK处理的,VRTK也管理好了SteamVR的逻辑,并且支…...
uni-app:利用Vue的原型对象Vue.prototype设置全局方法及其引用
一、在main.js中设置方法checkPermission绑定到Vue.prototype 核心代码 Vue.prototype.$checkPermission function(username) {console.log(Checking permission for:, username); }; 完整代码 import App from ./App// 添加 checkPermission 方法到 Vue.prototype 上,检查…...
django接入djangorestframework-simplejwt步骤
版本:django 4.2 python: 3.8 安装 pip install djangorestframework-simplejwtuser子应用models.py文件 from django.db import models from django.contrib.auth.models import AbstractUserclass User(AbstractUser):mobile models.CharField(max_length11, u…...
前端工程化工具系列(十)—— Browserslist:浏览器兼容性配置工具
Browserslist 是一个能够在不同的前端工具间共享目标浏览器的配置,各工具根据该配置进行代码转译等操作。 具体的这些前端工具为:Autoprefixer、Babel、postcss-preset-env、eslint-plugin-compat、stylelint-no-unsupported-browser-features、postcss-…...
双列集合底层源码
tips: 竖着的箭头:重写 横着的箭头:继承...
【Ardiuno】实验使用ESP32连接Wifi(图文)
ESP32最为精华和有特色的地方当然是wifi连接,这里我们就写程序实验一下适使用ESP32主板连接wifi,为了简化实验我们这里只做了连接部分,其他实验在后续再继续。 由于本实验只要在串口监视器中查看结果状态即可,因此电路板上无需连…...
优化家庭网络,路由器无线中继配置全攻略(中兴E1600无线中继设置/如何解决没有预埋有线网络接口的问题/使用闲置路由实现WIFI扩展)
文章目录 📖 介绍 📖🏡 演示环境 🏡📒 网络优化 📒📒 操作步骤 📒💡适用场景🚨 常见问题及解决方案⚓️ 相关链接 ⚓️📖 介绍 📖 在现代家庭生活中,WiFi已经渗透到我们生活的每一个角落,成为了日常生活中不可或缺的一部分。然而,不少用户常常遇到W…...
【ArcGIS微课1000例】0114:基于DEM地形数据整体抬升或下降高程
相关阅读:【GlobalMapper精品教程】083:基于DEM整体抬升或下降地形高程的两种方式 文章目录 一、任务分析二、栅格计算器简介三、地形整体修改四、注意事项一、任务分析 打开软件,加载配套实验数据中的0112.rar中的dem数据,如下所示,dem的高程范围为256.75~342.37米,现在…...
AGP4+ 打包运行闪退,AGP7+ 正常(has code but is marked native or abstract)
问题 安装应用,点击图标启动立马闪退! 诡异的闪退:AGP4 打包运行闪退,AGP7 正常 unity 导出的 Android 日志两个主要点: com.android.boot.App 是 Android 的 application 子类,程序入口 java.lang.Class…...
ChatGPT3.5和ChatGPT4.0、ChatGPT4o对比
一、ChatGPT3.5、ChatGPT4.0、ChatGPT4o对比 目前ChatGPT有三个主要版本,分别是ChatGPT3.5、ChatGPT4.0、ChatGPT4o,这三个版本之间有什么差异呢? 对比项ChatGPT3.5ChatGPT4.0ChatGPT4o参数数量1750亿约1万亿未公开输入文本文本、图片文本、…...
【知识拓展】HTTP、WebSocket 和 RPC:区别与使用场景详解
在工作中,HTTP、WebSocket 和 RPC 是三种常见的协议或通信方式,根据资料查阅,本文主要记录它们的区别及其适用的使用场景 HTTP(超文本传输协议) 概述 HTTP(Hypertext Transfer Protocol)是一…...
C语言printf( ) 函数和 scanf( ) 函数格式符的修饰符 “*”有什么作⽤?
一、问题 在 printf( ) 函数和 scanf( ) 函数的格式修饰符有很多,以浮点型数据为例,有%f、%lf、 %3.0f、%.4f等。不同的修饰符表示不同的含义,那么修饰符“*”有什么含义呢? 二、解答 下⾯通过例⼦来证明⼀下这个格式符在 printf…...
java 使用WebClient发送https请求
核心逻辑 绕过ssl证书检查 具体操作 话不多说上代码 // 构建WebClient public static WebClient createWebClient() throws SSLException {SslContext context SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).build();HttpClient htt…...
Python 中的内存管理机制
Python 的内存管理机制主要由两个部分组成:垃圾回收机制和引用计数。 垃圾回收机制主要负责检测和回收不再被使用的内存。Python 使用的是自动垃圾回收机制,也就是说程序员不需要手动释放内存。Python 的垃圾回收机制采用了引用计数的方法来追踪和回收不…...
Mac电脑重置网络命令
在Mac电脑上重置网络设置可以通过终端命令来实现。以下是几种方法,包括刷新DNS缓存、重置网络接口,以及重置Wi-Fi设置。 刷新DNS缓存 要刷新DNS缓存,可以使用以下命令: sudo dscacheutil -flushcache; sudo killall -HUP mDNSR…...
C++期末复习总结(2)
目录 1.运算符重载 2.四种运算符重载 (1)关系运算符的重载 (2) 左移运算符的重载 (3)下标运算符的重载 (4)赋值运算符的重载 3.继承的方式 4.继承的对象模型 5.基类的构造 6…...
[word] word大括号怎么打两行 #其他#其他#微信
word大括号怎么打两行 Word给用户提供了用于创建专业而优雅的文档工具,帮助用户节省时间,并得到优雅美观的结果。 一直以来,Microsoft Office Word 都是最流行的文字处理程序。 作为 Office 套件的核心程序, Word 提供了许多易…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
