静态检查工具

news2024/9/23 5:30:55

0. 简介

静态检查是软件开发过程中的一个重要环节,它在代码执行之前分析源代码或编译后的代码,以识别潜在的错误、代码规范违规、安全漏洞等问题。静态检查的好处包括提高代码质量、减少bug、增强安全性、提升开发效率等。它能够帮助开发者在早期发现问题,减少后期调试的工作量,以及降低维护成本。我们很多常见的编译器无法识别的问题都可以通过静态检查识别可能存在的问题。

通过静态分析可以发现的错误类型包括:

• 未定义的行为

• 使用危险的代码模式

• 编码风格


静态分析应作为质量保证的补充。它不能取代任何;

• 精心设计

• 测试

• 动态分析

• 模糊

1. cppcheck

Cppcheck 是 C/C++ 代码的静态分析工具。它提供独特的代码分析来检测错误,并专注于检测未定义的行为和 危险的编码结构,即使它具有非标准语法(在嵌入式项目中很常见)。使用起来还是比较轻松地,即在vscode中安装这个扩展即可。最新的版本自带了一个 cpp checker 的库,因此无需额外下载,可以直接使用。

在这里插入图片描述


然后再用户设置中追加下面的代码(可选)

输出信息等级说明:
warning:为了预防bug防御性编程建议信息
style:编码格式问题(没有使用的函数、多余的代码等)
performance:建议优化该部分代码的性能
portability:移植性警告。该部分如果移植到其他平台上,可能出现兼容性问题
information:一些有趣的信息,可以忽略不看的。
unusedFunction:未使用的函数
missingInclide:缺少头文件

	"cpp-check-lint.cpplint.--enable": false,  //google C++ 代码风格检查
    "cpp-check-lint.cppcheck.--language=": "c",  //使用c语言进行检查
    "cpp-check-lint.cppcheck.--inline-suppr": false,  //取消内联
    "cpp-check-lint.cppcheck.--onsave": true,  //在文件保存时立刻检查该文件
    "cpp-check-lint.cppcheck.--enable=": "style",  //输出信息等级,可选为all, warning, style, performance, portability, information, unusedFunction, missingInclide
 ],

在这里插入图片描述

在需要检查一个文件时,可以右键可以进行检查,然后就可以在终端中看到对应的报错和警告了。

在这里插入图片描述


在实际的使用中我们可以看到有很多格式上的问题可以被检查出来。

这里可以用clang-format来规范化,首先需要安装版本

sudo apt install clang-format

然后可以查看clang的版本号,确保安装成功

clang-format --version

然后新建一个.clang-format文件,并放在对应repo的根目录下(可选)

---
Language:        Cpp
BasedOnStyle:  Google
AccessModifierOffset: -4
AlignAfterOpenBracket: Align
AlignConsecutiveMacros: false
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Left
AlignOperands:   true
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: false
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All
AllowShortLambdasOnASingleLine: All
AllowShortIfStatementsOnASingleLine: WithoutElse
AllowShortLoopsOnASingleLine: true
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: Yes
BinPackArguments: false
BinPackParameters: false
BraceWrapping:
  AfterCaseLabel:  false
  AfterClass:      false
  AfterControlStatement: false
  AfterEnum:       false
  AfterFunction:   false
  AfterNamespace:  false
  AfterObjCDeclaration: false
  AfterStruct:     false
  AfterUnion:      false
  AfterExternBlock: false
  BeforeCatch:     false
  BeforeElse:      false
  IndentBraces:    false
  SplitEmptyFunction: true
  SplitEmptyRecord: true
  SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Attach
BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit:     80
CommentPragmas:  '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: false
DisableFormat:   false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
  - foreach
  - Q_FOREACH
  - BOOST_FOREACH
IncludeBlocks:   Regroup
IncludeCategories:
  - Regex:           '^<ext/.*\.h>'
    Priority:        2
    SortPriority:    0
  - Regex:           '^<.*\.h>'
    Priority:        1
    SortPriority:    0
  - Regex:           '^<.*'
    Priority:        2
    SortPriority:    0
  - Regex:           '.*'
    Priority:        3
    SortPriority:    0
IncludeIsMainRegex: '([-_](test|unittest))?$'
IncludeIsMainSourceRegex: ''
IndentCaseLabels: true
IndentGotoLabels: true
IndentPPDirectives: None
IndentWidth:     4
IndentWrappedFunctionNames: false
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: false
MacroBlockBegin: ''
MacroBlockEnd:   ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Never
ObjCBlockIndentWidth: 2
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 1
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 200
PointerAlignment: Right
RawStringFormats:
  - Language:        Cpp
    Delimiters:
      - cc
      - CC
      - cpp
      - Cpp
      - CPP
      - 'c++'
      - 'C++'
    CanonicalDelimiter: ''
    BasedOnStyle:    google
  - Language:        TextProto
    Delimiters:
      - pb
      - PB
      - proto
      - PROTO
    EnclosingFunctions:
      - EqualsProto
      - EquivToProto
      - PARSE_PARTIAL_TEXT_PROTO
      - PARSE_TEST_PROTO
      - PARSE_TEXT_PROTO
      - ParseTextOrDie
      - ParseTextProtoOrDie
    CanonicalDelimiter: ''
    BasedOnStyle:    google
ReflowComments:  true
SortIncludes:    true
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInAngles:  false
SpacesInConditionalStatement: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
SpaceBeforeSquareBrackets: false
Standard:        Auto
StatementMacros:
  - Q_UNUSED
  - QT_REQUIRE_VERSION
TabWidth:        4
UseCRLF:         false
UseTab:          Never
...

然后可以在VScode中安装对应的插件

在这里插入图片描述

Visual Studio Code->File->Preferences->Settings:
Check on Editor:Format On Save

在这里插入图片描述

View->Command Palette

在以>开头的弹出对话框中输入setting,然后再setting.json中输入下面的代码,以指定格式

    "C_Cpp.clang_format_fallbackStyle": "{ BasedOnStyle: Google, IndentWidth: 4, TabWidth: 4, AccessModifierOffset: -4, BinPackArguments: false, BinPackParameters: false, AllowAllArgumentsOnNextLine: false, AllowAllParametersOfDeclarationOnNextLine: false, ColumnLimit: 100 }",
    "C_Cpp.clang_format_style": "{ BasedOnStyle: Google, IndentWidth: 4, TabWidth: 4, AccessModifierOffset: -4, BinPackArguments: false, BinPackParameters: false, AllowAllArgumentsOnNextLine: false, AllowAllParametersOfDeclarationOnNextLine: false, ColumnLimit: 100 }",

## …详情请参照[古月居](https://www.guyuehome.com/detail?id=1828052225820254209)

如果自行安装则需要在https://cppcheck.sourceforge.io/,下载二进制包或者 Linux 的安装包。然后安装即可。注意配置环境变量。使用时在需要扫描的目录下,直接使用cppcheck + 文件名即可。

> cppcheck main.cpp
Checking main.cpp ...

2. C/C++ Advanced Lint高级设置

sudo apt-get install llvm
sudo apt-get install clang
sudo apt-get install cppcheck

然后安装C/C++ Advanced Lint插件

在这里插入图片描述

然后就可以看到有问题的地方了

在这里插入图片描述

3. 参考链接

https://blog.csdn.net/qq_35333978/article/details/122347687

https://www.jianshu.com/p/bff12bb87b91

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2105708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【消息中间件】Kafka从入门到精通

1 Kafka入门 概念 架构 1.1 概述 1.1.1 初始Kafka Kafka是一个由Scala和Java语言开发的&#xff0c;经典高吞吐量的分布式消息发布和订阅系统&#xff0c;也是大数据技术领域中用作数据交换的核心组件之一。以高吞吐&#xff0c;低延迟&#xff0c;高伸缩&#xff0c;高可靠…

浙大数据结构:01-复杂度2 Maximum Subsequence Sum

数据结构MOOC PTA习题 01-复杂度2 Maximum Subsequence Sum #include <iostream> using namespace std; const int M 100005; int a[M]; int main() {int k;cin >> k;int f 1;for (int i 0; i < k; i){cin >> a[i];if (a[i] > 0)//如果出现大于0则…

zm-tree-org 数据量过大时,全部展开后,根节点点击收缩,树形消失

zm-tree-org 数据量过大时&#xff0c;全部展开后&#xff0c;根节点点击收缩&#xff0c;树形消失 <zm-tree-orgref"tree"on-expand"onExpand"</zm-tree-org>export default {methods: {onExpand(e, data) {<!-- 当为根节点,且根节点为闭合时…

web3.0区块链元宇宙是什么

Web3.0 什么是 Web3.0 Web3.0是指基于区块链的去中心化在线生态系统&#xff0c;代表了互联网的下一个阶段。它是由以太坊联合创始人Gavin Wood在2014年创造的概念。Web3.0的发展是随着用户权利的增加和在互联网中角色的重要性不断进化的。 从互联网的发展历程来看&#xff0…

elementUI根据列表id进行列合并@莫成尘

本文章提供了elementUI根据列表id进行列合并的demo&#xff0c;效果如图&#xff08;可直接复制代码粘贴&#xff09; <template><div id"app"><el-table border :data"tableList" style"width: 100%" :span-method"objectS…

[论文笔记]大模型微调数据配比策略

大模型微调数据配比策略 How Abilities in Large Language Models are Affected by Supervised Fine-tuning Data Composition https://arxiv.org/pdf/2310.05492 一、背景&#xff1a; 大模型是无监督的多任务学习器&#xff0c;其强大的泛化能力可以同时理解并执行多种任务…

Linux 进程等待与替换

✏️ 代码引入&#xff1a; #include <stdio.h> #include <unistd.h> // _exit()要此头文件&#xff0c;使用方法与 exit()类似 #include <stdlib.h> // exit(),要此头文件// int fun() //{ // printf("call fun function done!\n"); // retu…

3 html5之css新选择器和属性

要说css的变化那是发展比较快的&#xff0c;新增的选择器也很多&#xff0c;而且还有很多都是比较实用的。这里举出一些案例&#xff0c;看看你平时都是否用过。 1 新增的一些写法&#xff1a; 1.1 导入css 这个是非常好的一个变化。这样可以让我们将css拆分成公共部分或者多…

BrushNet重绘电商商品背景效果测试

&#x1f3a8;背景 之前写过一篇文章&#xff0c;简单的介绍了brushnet这个局部重绘节点&#xff0c;如何安装和使用可以参考我之前写的这篇文章&#xff0c;本篇重点测试下在背景生成这部分&#xff0c;brushnet是不是跟默认的inpaint有比较大的效果提升。 上一篇节点介绍内…

R语言数据统计分析与ggplot2高级绘图

R语言在数据统计分析领域具有广泛的应用&#xff0c;它提供了丰富的函数和扩展包&#xff0c;使得数据处理、分析和可视化变得高效而直观。 R语言特别适合进行描述性统计分析&#xff0c;这得益于其内置的多种函数和方法。例如&#xff0c;使用summary()函数可以轻松获取数据的…

【2024最新】Adobe Lightroom Classic安装教程(直接使用)

给大家分享一个Adobe Lightroom Classic的安装教程&#xff0c;下载链接在文章末尾&#xff0c;直接可用 介绍 Adobe Lightroom Classic 是一款专业的照片编辑和管理软件&#xff0c;专为摄影师和影像爱好者设计。它提供了一套全面的工具集&#xff0c;用于组织、编辑和分享照…

全网最适合入门的面向对象编程教程:45 Python实现常见数据结构-链表、树、哈希表、图和堆

全网最适合入门的面向对象编程教程&#xff1a;45 Python 实现常见数据结构-链表、树、哈希表、图和堆 摘要&#xff1a; 数据结构是计算机科学中的一种组织和存储数据的方式&#xff0c;它决定了数据的访问方式和操作效率&#xff0c;数据结构的选择和实现对程序的性能和设计…

Microk8s ingress启动失败, 10254端口被占用问题定位

问题描述 RHEL9 VM里安装了Microk8s&#xff0c;且使用了Nginx ingress Controller插件&#xff0c;443端口正常。 VM重启一次后&#xff0c;发现443端口没有LISTEN&#xff0c;不能对外提供服务。 定位过程 查看ingress pod状态&#xff0c;为CrashLoopBackOff # kubectl …

【Python篇】PyQt5 超详细入门级教程(中篇一)

文章目录 PyQt5入门级超详细教程中篇&#xff1a;信号槽机制与表格数据展示第4部分&#xff1a;事件处理与信号槽机制4.1 什么是信号与槽&#xff1f;4.2 信号与槽的基本用法4.3 信号与槽的基础示例代码详解&#xff1a; 4.4 处理不同的信号代码详解&#xff1a; 4.5 自定义信号…

【软考】设计模式之代理模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 适用性6. 优点7. 缺点8. java示例 1. 说明 1.代理模式&#xff08;Proxy Pattern&#xff09;。2.意图&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。3.通过提供与对象相同的接口来控制对这个对象的访问。4.是设计模…

kali——wpscan的使用

目录 前言 查看帮助&#xff08;-h&#xff09; ​编辑 常规扫描&#xff08;--url&#xff09; 破解用户名和密码 插件枚举 扫描插件漏洞 扫描主题漏洞 前言 wpscan 是 Kali Linux 自带工具&#xff0c;主要用于扫描WordPress网站的各种安全漏洞&#xff0c;包括Word…

深度学习TensorFlow框架

深度学习介绍 深度学习和机器学习区别 机器有人工参与&#xff0c;而深度学习是靠网络&#xff1b; 深度学习需要大量的数据集&#xff0c;训练神经网络需要大量的算力 机器学习有&#xff1a;朴素贝叶斯&#xff0c;决策树等 深度学习主要是神经网络 深度学习应用场景 CV&…

[数据集][目标检测]轮胎缺陷检测数据集VOC+YOLO格式2154张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2154 标注数量(xml文件个数)&#xff1a;2154 标注数量(txt文件个数)&#xff1a;2154 标注…

【爬虫软件】小红薯评论区采集工具

一、采集目标与应用场景 您好&#xff01;我利用Python技术自主研发了一款高效的爬虫软件&#xff0c;批量收集小红薯平台上的评论&#xff0c;包括主评论及其下的二级评论。 为了拓宽用户群体&#xff0c;让不具备编程基础的小白用户也能轻松上手&#xff0c;我开发成了界面…

Burp Suite Professional 2024.8 for macOS x64 ARM64 - 领先的 Web 渗透测试软件

Burp Suite Professional 2024.8 for macOS x64 & ARM64 - 领先的 Web 渗透测试软件 世界排名第一的 Web 渗透测试工具包 请访问原文链接&#xff1a;https://sysin.org/blog/burp-suite-pro-mac/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页…