当前位置: 首页 > news >正文

使用 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 禁用的规则列表

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

  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进行静态代码分析:一个完整的配置示例

文章目录 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 提供了许多易…...

【python】python指南(二):命令行参数解析器ArgumentParser

一、引言 对于算法工程师来说,语言从来都不是关键,关键是快速学习以及解决问题的能力。大学的时候参加ACM/ICPC一直使用的是C语言,实习的时候做一个算法策略后台用的是php,毕业后做策略算法开发,因为要用spark&#x…...

香橙派 Orange AIpro 测评记录视频硬件解码

香橙派 Orange AIpro 测评记录视频硬件解码 香橙派官网:http://www.orangepi.cn/ 收到了一块Orange Pi AIpro开发板,记录一下我的测评~测评简介如下:1.连接网络2.安装流媒体进行硬件解码测试3.安装IO测试 简介 Orange Pi AI Pro 是香橙派联合…...

四天工作制,比你想象的更近了一点

原文:Andrew Keshner - 2024.05.30 软件公司、大型企业甚至警察部门都在试验这一看似遥不可及的概念。 教育软件公司 Kuali 的会议精简,除非绝对必要,员工尽量避免安排会议。即使有会议,也鼓励员工跳过与自己工作无关的部分。在…...

(UE4.26)UE4的FArchive序列化入门

前言 序列化(Serialize)和反序列化(UnSerialize)是程序领域常见的概念。对于这两个词汇我理解的是 序列化(Serialize): 变量值(int, float, string等基本类型, 或者Array,Map,或者更复杂的复合体)存储为一个文件(二进制流, 二进制文件, json, xml等格式…...

Inpaint9.1软件下载附加详细安装教程

软件简介: Inpaint 是个人开发者Max开发的图片处理软件,可以高效去除水印,修复照片等。使用方法和操作都很简单,非常适合不会PS等软件的小白用户。 安 装 包 获 取 地 址: Iinpaint win版:​​https://souurl.cn/b…...

Unity 集成 FMOD 音频管理插件 2.02

Unity 集成 FMOD 音频管理插件 2.02 3. 集成教程:3.1 设置Unity项目3.2 设置FMOD项目3.3 设置 FMOD for Unity3.4 添加声音:卡丁车引擎3.5 添加声音:氛围3.6 添加声音:音乐3.7 删除现有音频3.8 下一步 10. 脚本 API 参考10.1 基础…...

Linux下线程的互斥与同步详解

🤖个人主页:晚风相伴-CSDN博客 💖如果觉得内容对你有帮助的话,还请给博主一键三连(点赞💜、收藏🧡、关注💚)吧 🙏如果内容有误或者有写的不好的地方的话&…...

【栈】736. Lisp 语法解析

本文涉及知识点 栈 LeetCode736. Lisp 语法解析 给你一个类似 Lisp 语句的字符串表达式 expression,求出其计算结果。 表达式语法如下所示: 表达式可以为整数,let 表达式,add 表达式,mult 表达式,或赋值的变量。表达…...

什么时候用C而不用C++?

做接口只用C,千万别要C。C是编译器敏感的,一旦导出的接口里有 std::string这些东西,以及类,注定了要为各个编译器的各个版本准备独立的库。 刚好我有一些资料,是我根据网友给的问题精心整理了一份「C的资料从专业入门…...

unix环境编程编程扫描版:深度解析与实践指南

unix环境编程编程扫描版:深度解析与实践指南 在探索Unix环境编程的广阔天地时,我们如同行走在一条充满未知与奇遇的旅程中。本篇文章将从四个方面、五个方面、六个方面和七个方面,深入剖析Unix环境编程的精髓,帮助读者在编程的海…...

最新新闻热点及观点/电子商务沙盘seo关键词

set(集合) 直接创建一个空集合set_empty set() print(set_empty) # set() 根据参数创建# 根据参数 set_argument set(42,345,ry) print(set_argument) # 这样会报错,因为set只允许有一个参数 根据列表来创建set_list set([11,11,45,11,ee]) print(set…...

做视频素材哪个网站好/百度网站关键词排名助手

作用 tf.concat( values, axis, name‘concat’) 输入张量的数据沿axis 维度合并 举例使用 &#xff08;1&#xff09;沿着0维度合并 t1 [[1, 2, 3], [4, 5, 6]] t2 [[7, 8, 9], [10, 11, 12]] tf.concat([t1, t2], 0)<tf.Tensor: shape(4, 3), dtypeint32, numpy arra…...

办公设备网站推广怎么做/网络游戏推广平台

导入tensorflow模块失败&#xff0c; with python2 pip show tensorflow 检查是否安装 python test.py 测试 with python3 pip3 show tensorflow 检查是否安装 python3 test.py 测试 test.py import tensorflow as tf import numpy as npc np.array([[3.,4], [5.,6], …...

建设一个网站要多少钱/抚顺网络推广

网站微信登录&#xff0c;做起来挺简单的&#xff0c;我们做这个&#xff0c;首页是要去看微信文档&#xff0c;文档看懂了&#xff0c;然后理清楚逻辑&#xff0c;怎么进行绑定贵公司的账号&#xff0c;业务那块要理清楚&#xff01; 首先&#xff0c;微信官方告诉我们&#…...

渭南网站建设wifi/哈尔滨网站推广

多进程应用大批量的数据是非常舒服的一件事情。 处理之前理解两个概念&#xff1a;孤儿进程和僵尸进程 孤儿进程&#xff1a; 是指父进程在fork出子进程后&#xff0c;自己先完了。这个问题很尴尬&#xff0c;因为子进程从此变得无依无靠、无家可归&#xff0c;变成了孤儿。用术…...

网站如何做二级域名/百度网站提交了多久收录

1、一个plugin中只有一个application 2、rcp4中的application不用自己写类实现&#xff0c;已经包含在application。xmi文件中 3、rcp3创建的项目在rcp4中可以接着开发。 4、perpective添加view不显示 如果在开发中发现&#xff0c;没有打包发布之前&#xff0c;如论运行applic…...