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

MATLAB代码检查工具PolySpace

概述

PolySpace是MATLAB里面代码静态检查工具。通过检查源代码,可以确定可能在哪里发生潜在的运行时错误,例如算术溢出,缓冲区溢出等等。它最大的特点是可以检查车企常用的MISRA C标准,还免费,就让各大车企爱不释手。

Polyspace有两个软件,一个为Polyspace Bug Finder,一个为Polyspace Code Prover。两者都能执行错误检查,代码规则检查,测量代码质量,可以共用同一个工程。Polyspace Bug Finder通过分析代码的语义来执行静态检测,可以比较快执行完检测,一般用于开发人员快速查找尽量多的问题。Polyspace Code Prover通过抽象解析执行检测,是一种噪声分析方法,检查确认每一个操作是否有问题,执行速度比较慢,一般用于出示正式报告使用。

Polyspace通过工程来管理检测的源文件以及检测配置项等,所以执行检测必须得建立一个工程。此外,每个工程里面分很多模块,这样大型工程就可以把大量的文件按模块执行检测,减少每次的检测耗时。

新建工程

首先我们要新建工程

或者点击这里新建工程

Project name:工程名称

Project configuration:选择项目配置,可以选择使用模板【Use template】,Polyspace有预定义了几个模板,此外用户也可以创建自己的模板,以后我们应该是使用组内自己的模板,这样可以减少每次创建工程的配置时间。除了使用模板,用户也可以自己写脚本配置工程,这是高级功能。

Project language:选择项目分析的文件是哪一种编程语言写的代码。

Location:工程路径信息,如果你不像使用默认的路径,请确保不勾选【Use default location】,并在Location里面输入期望的路径,可以点击输入栏右边的打开文件夹并选择到对应的路径。

添加文件

需要给工程添加源文件和Include路径。在打工的工程界面,右击【Source】,选择【Add source】添加源文件。选择对应的文件或文件夹,点击【Add Source Files】如果要把文件夹里面的文件也包含进来,需要勾选【Add recurively】。

给工程添加Include路径,在工程界面当中,右击【Include】,选择【Add source】添加Include路径。弹出的界面如下图所示,选择对应的路径后,点击【Add Include Foloer】把路径添加到Include路径,如果需要把子目录也添加进来,请勾选【Add recurively】。

模块管理

用户可以创建自己的工程配置模板,在打开的工程界面,完成检测的配置后,在配置处右击弹出的下拉框里面,点击【Save As Template】即可把当前的配置(包含对应Module的配置以及Include路径)保存为模板。

保存的模块,下次创建工程时,可以使用该模板。使用前,选先导入用户模板。方法为:在选择模板界面点击【Add custom template…】选择之前保存的模板,然后在【Custom templates】下就会出现刚导入的模板,新建工程时,选择该模板就可以了。如果要删除模板,则可以在界面点击【Remove custom template】。

Polyspace Code Prover需要把一个工程的源文件放到一个Module或者几个Module分别单独检测。需要注意的是Polyspace Bug Finder不支持该功能,那么他就不支持新建Module和复制源文件到模块的功能。

源文件分模块Module的流程如下:在工程界面,点击工具栏的 开始创建模块;或者右击模块如Module_1,在弹出的界面选择【Creat New Module】开始创建模块。完成后,工程界面会出现一个新的模块【Module_x】,后面的x代表第几个Module。

Polyspace由于用Module分别单独检测,需要把对应的源文件复制到对应的Module下,这样只有在这个Module的源文件才会被这个Module检测。复制方法为:在工程界面的Source文件夹下,选择对应的文件,可以用Shift键或者Ctrl键支持多选文件,右击选择的源文件,在弹出的界面点击【Copy to】,然后选择对应的Module_x。

如果没有加入进来,在检测的时候就会报如下图的错误提示。

配置检测项

每个Module模块都需要单独配置检测项,每个配置都可以有差异。在工程界面,左键单击对应的配置,就可以进入配置的设置界面。下图所示,右边的【Configuration】就是配置界面,相关检测配置内容都在这个界面配置。

Target&Compiler

Target&Compiler配置主要是配置APP运行软硬件环境以及对应的编译器特殊功能。重点配置以下功能,其他功能按需配置。

【Target Operating system】:配置APP运行的操作系统

【Target Processor type】:配置APP运行的处理器

【Dialect】:配置编译器的特殊功能

【Respect C90 standard】:配置是否只支持C90标准,勾选时表示只支持C90标准,不勾选时表示支持C90和C99标准

Macros

Macros配置界面主要配置预处理宏定义和取消已有的宏定义,这主要是用于特定编译器内部定义了一些专有的宏定义(如某些编译器宏定义了__far关键字)。

Environment Settings

Environment Settings配置界面主要配置软件的其他环境信息。

【Code from DOS or Windows file system】:配置文件来源是哪个文件系统,用于识别路径是否区分大小写以及路径符号

【Continue with compile error】:勾选时,使能在编译错误时依旧继续,建议默认不勾选即可

【Command/script to apply to preprocessed files】:配置每个文件预处理后执行的脚本,没有这个需求的可以不配置.

【Include】:配置编译每个文件时,自动Include的文件。该配置可用于使用的编译器支持特定关键字时,代码使用了该关键字,但是Polyspace不支持该关键字的情况。通过手动模式把关键字写到一个头文件。配置方法为:点击右边的文件夹图标,在打开的界面选择对应的头文件。

Inputs&Stubbing

用于配置全部变量、指针、函数参数的数据约束输入以及Stubbing函数(如果检测文件依赖外部实现的函数,那么检测时需要设置Stubbing函数用于模拟实现调用的函数功能)。具体配置内容说明如下:

【Constraint setup】:配置全部变量、指针、函数参数的数据约束条件,通过点击【Edit】添加对应约速

【Ignore default initialization of global variables】:配置是否忽略默认C标准的含蓄初始化全局变量(没有明显的初始化变量,char 默认初始化为0,int 默认初始化为0,等等)。为了提高我们的代码安全性,我们要求所有的变量都必须明显地初始化,所以要勾选该选项,忽略C标准里面的默认初始化。

【No automatic stubbing】:配置是否不自动产生stubbing函数,可以用于发现未定义的函数,也可以用于手动定义stubbing函数。由于我们的APP使用底层的函数,这些底层函数是供应商提供的,我们没有底层函数的源文件,所以建议不勾选这个配置项,由polyspace自动产生stubbing函数。

【Functions to stub】:配置哪些函数为stubbing函数,当检测时不想再检测某一个确定的函数时,可以在此指定函数为stubbing函数。

Multitasking

本配置界面用于配置多任务相关的配置,配置界面如下所示,配置项说明如下:

【Enable automatic concurrency detection】:使能自动多任务检测,用于有标准的POSIX接口的多线程创建接口函数。

【Configure multitasking manually】:使能手动配置多任务,这些设置依赖于3.5.4 Verfication Assumptions配置为Verify whole application,但是由于我们的APP都只是一个模块,不是一个完成的应用,所以这个配置我们不需要配置。

Coding Standards & Code Metrics

本配置界面配置代码规则检查和代码质量测量,如下所示,各配置说明如下:

【Check MISRA C 2004】:勾选,则可以选择检查MISRA C 2004检查,然后选择对应的规则,可以选择custom然后点击【Edit】自定义检查条例或者装载以前定好的规则。由于NDS要求不同阶段必须支持哪些条例,所以我们应该是组内定好统一的勾选规则,大家复用这个规则即可。

【Check MISRA AC AGC】:自动生成的代码的检查规则,所以我们应该是选择勾选该规则

【Check MISRA C 2012】:NDS不要求该检查

【Check custom rules】:检查用户定义的其他规则,按需配置即可。

【Effective Boolean types】:定义制定哪个类型的数据为boolean类型

Code Prover Verification

Code Prover Verification里面及其子配置界面都是配置Code Prover 检测的相关定制行为。

Code Prover Verification界面配置代码检测整个代码还是只检测模块,由于我们开发的只是其中一个模块的APP,所以我们勾选【Verify module】。这样polyspace找不到main()函数的情况下,会自动生成一个main()函数,该main()函数会执行以下操作:

  1. 初始化【Variables to initialize】里面指定的变量
  2. 调【Initialization functions】里面指定的初始化函数
  3. 按任意的顺序调【Functions to call】里面指定的函数

如果没有指定以上操作,main()函数会执行以下操作:

  1. 初始化除了有关键字const和static以外的全局变量
  2. 按任意的顺序调代码里面没有被调用的函数。

由于自动产生的main()函数里面的调度函数顺序是随机的。所以如果不想调度的函数是随机的,请自己手动写一个main函数。

Precision

本配置主要配置检测的精度,如下所示,每个配置说明如下:

【Precision level】:指定检测精度等级,精度越高,耗时越久,目前使用默认的等级2即可

【Verification level】:指定源代码的检测次数,等级越高,耗时越久,目前使用默认等级level 2即可

【Verfication time limit】:指定检测超时时间,如果超时,检测停止,以小时为单位,如5.75表示5小时45分

【Retype variables of pointer types】:勾选时使能允许把指针强制转换为别的类型。为了防止指针越界,建议不要勾选该选项

【Retype symbols of integer types】:勾选时使能允许把一个整数强制转换为指针。由于我们一般不操作底层地址,所以建议不要勾选该选项。

Advanced Settings

本配置配置一些高级功能,说明如下:

【Command/script to apply after the end of the code verification】:选择检测结束后执行一个脚本,如果需要该功能,输入对应的脚本路径即可

【Automatic Orange Tester】:是否使能在代码检测结束后,针对Orange的结果执行动态检测以查找运行时错误。

【Number of automatic tests】:设置在代码检测结束后,Orange动态检测的次数

【Maximum loop iterations】:设置在代码检测结束后,Orange动态检测最大循环次数

【Maximum test time】:设置在代码检测结束后,Orange动态检测最长时间

【other】:可以输入其他的polyspace option​

执行检查

配置后检测项后,就可以执行检测了,步骤为:在工程界面,先点击对应的Module的对应配置,然后点击工具栏的 执行检测,同时会增加一个结果Result并且后面有个文件表示当前的检测状态[Running],表示进行中。检测正常结束时,状态会切换为[Completed];检测异常失败时,状态会切换为[Failed]。

生成的时候可以选择使用的是PolySpace Bug Finder或者PolySpace Code Prover,run all modules是将所有模块都运行一遍。

检测结果

检测结束后,在工程界面双击对应的检测结果,可以打开对应的检测结果界面【Result Summary】和【Result Details】。前者主要是罗列了结果的大纲,在【Result Summary】点击每条检测结果,可以在【Result Details】显示每条结果的详细说明。我们可以在【Result Details】界面添加相关内容,如:

【Severity】:为该Result分配一个风险等级

【Status】:为该Result分配一个状态

【Enter comment here】:添加注解信息

运行完毕之后,就能在Dashboard里面看到检查的结果。有风险错误数量比例饼状图,颜色越深风险越高。分析覆盖度柱状图,检查了多少个源文件,里面有多少个函数,通过的有多少个,不通过的有多少个。风险错误在各个文件的数量分布,不符合代码规范的地方在各个文件的标准分布。

想要看具体的每个错误可以进入到result list,里面列举出具体风险类型项,位置,数量等信息。点击进去,可以在Source窗口对照源代码分析问题。

Red checks  指示代码包含一个确定的错误,里面显示了一个  图标

Gray checks:指示有不可到达的代码,里面显示了一个  图标

Orange checks:指示在部分情况下,可能存在错误,里面显示了一个   图标

Green checks :指示在任何情况下,代码都不存在错误,里面显示了一个   图标

Coding rule violations:指示有违反了选定的代码规则,   显示违反了预定义的规则,  显示违反了客户自定义的规则

Code metrics :指示代码质量,如果违反了选择的代码质量阈值,会显示一个   图标

Global variables:显示发现的全局变量,带有 一个  图标。对于可能没有保护措施的全局变量,带有一个  图标,对于没有使用的全局变量,带有一个    图标。

譬如我故意写错一个地方,检查之后可以通过点击跳转,看到第9行的前面,第8行那里少了个分号。

检查终止问题

如果你的文件错误实在是太多,它会检查到中途便终止。

生成报告

Review完每个结果后,就可以生成检测报告了,点击菜单栏的【Reporting】→【Run Report…】打开生成报告界面。相关配置内容如下:

【Select Reports】:选择输出报告的模板

【Output folder】:选择输出报告存放到哪一个路径

【Output format】:选择输出的文件格式,如WORD、PDF等

相关文章:

MATLAB代码检查工具PolySpace

概述 PolySpace是MATLAB里面代码静态检查工具。通过检查源代码,可以确定可能在哪里发生潜在的运行时错误,例如算术溢出,缓冲区溢出等等。它最大的特点是可以检查车企常用的MISRA C标准,还免费,就让各大车企爱不释手。…...

FPGA设计之跨时钟域(CDC)设计篇(5)----同步FIFO的两种设计方法(计数器法/高位扩展法 | 手撕代码)

1、什么是FIFO? FIFO(First In First Out) 是一种先进先出的数据缓存器,在逻辑设计里面用的非常多。它是一种存储器结构,被广泛应用于芯片设计中。FIFO由存储单元队列或阵列构成,第一个被写入队列的数据也是第一个从队列中读出的数据。 FIFO 设计可以说是逻辑设计人员必须…...

快速掌握Vue:基础命令详解

1. Vue概述 Vue.js(读音 /vjuː/, 类似于 「view」) 是一套构建用户界面的 「渐进式框架」。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库…...

MySQL——索引(二)创建索引(1)创建表的时候创建索引

要想使用索引提高数据表的访问速度,首先要创建一个常引。创建索引的方式有三种,具体如下。 创建表的时候可以直接创建索引,这种方式最简单、方便,其基本的语法格式如下所示: CREATE TABLE 表名 (字段名 数据类型 [完整性约束条件…...

源代码加密怎么做?企业常用十款源代码加密软件排行榜

在数字化信息时代,源代码是企业的核心资产之一。保护源代码的安全不仅能防止知识产权泄露,还能保护企业的竞争优势。因此,源代码加密成为企业信息安全的重要环节。 源代码是软件的基础,包含了企业独特的技术和解决方案。未加密的源…...

python 文件打开、读、关闭练习

一、题目要求 二、代码实现 f open("D:\\workspace\\word.txt" , "r", encoding "UTF-8")# 方案一 # content f.read() # count content.count("itheima") # print(f"itmeiha在文件中出现了:{count}次")# 方案…...

迈向大规模小目标检测:综述与数据集

为了准确检测小目标,领域内现有方法大多基于通用目标检测范式进行针对性改进,根据这些改进所采用关键技术的不同,可以分为六种类别:(1)面向样本的方法;(2)基于尺度感知的…...

69、zabbix自动、代理、snmp监控

一、zabbix 1.1、自动发现 [roottest1 ~]# systemctl stop firewalld [roottest1 ~]# setenforce 0 [roottest3 ~]# vim /etc/hosts 192.168.168.21 test1 192.168.168.23 test3 [roottest1 ~]# vim /etc/hosts 192.168.168.21 test1 192.168.168.23 test3 ------------…...

搜索引擎设计:如何避免大海捞针般的信息搜索

搜索引擎设计:如何避免大海捞针般的信息搜索 随着互联网的发展,信息的数量呈爆炸式增长。如何在海量信息中快速、准确地找到所需信息,成为了搜索引擎设计中的核心问题。本文将详细探讨搜索引擎的设计原理和技术,从信息获取、索引…...

设计模式- 数据源架构模式

表数据入口(Table Data Gateway) 充当数据库表访问入口的对象。一个实例处理表中所有的行。 表数据入口包含了用于访问单个表或者视图的所有SQL,如选择、插入、更新、删除等。其他代码调用它的方法来实现所有与数据库的交互。 运行机制 表数据入口包括的每个方法…...

Unity 使用字符串更改Text指定文字颜色、大小、换行、透明

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、使用字符串改变文字属性的方法(一)修改颜色(二)修改大小(三)换行(四&…...

数字信号处理2: 离散信号与系统的频谱分析

文章目录 前言一、实验目的二、实验设备三、实验内容四、实验原理五、实验步骤1.序列的离散傅里叶变换及分析2.利用共轭对称性,设计高效算法计算2个N点实序列的DFT。3.线性卷积及循环卷积的实现及二者关系分析4.比较DFT和FFT的运算时间5.利用FFT求信号频谱及分析采样…...

20240805软考架构--------每日打卡题21-25

每日打卡题21-25答案 21、【2014年真题】 难度:一般 在UML提供的系统视图中, (1) 是逻辑视图的一次执行实例,描述了并发与同步结构; (2) 是最基本的需求分析模型。 (1&a…...

GPT-5:未来已来,你准备好了吗?

GPT-5 一年半后发布?对此你有何期待? IT之家6月22日消息,在美国达特茅斯工程学院周四公布的采访中,OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布,给出了肯定答案并表示将在一年半后发布。此外,穆…...

解决C#对Firebase数据序列化失败的难题

背景介绍 在当今的游戏开发领域,Unity与Firebase的结合日益普及。Firebase实时数据库提供了强大的数据存储和同步功能,使开发者能够轻松管理和使用数据。然而,在使用C#进行Firebase数据序列化和反序列化时,常常会遇到一些棘手的问…...

设计模式中的类关系

1. 依赖(Dependency) 定义:一个类使用到另一个类的实例,通常是通过方法参数、局部变量等。依赖关系是最弱的关系,因为它仅仅表示类之间的临时关联。 特征:在 UML 图中,依赖关系用带箭头的虚线…...

glibc的安装及MySQL的安全用户角色权限(twenty-one day)

一、glibc安装 mysql 清空/etc/目录下的my.cnf ls -l /etc/my.cnf rm -rf /etc/my.cnf yum -y remove mariadb find / -name "*mysql*" -exec rm -rf {} \; 安装mysql软件包 wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.33-li nux-glibc2.1…...

AttributeError: ‘ChatGLMTokenizer‘ object has no attribute ‘sp_tokenizer‘. 已解决

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 ☁️运维工程师的职责:监…...

徐州BGP机房与普通机房的区别有哪些?

BGP也被称为是边界网关协议,是运行在TCP上的一种自治系统的路由协议,能够用来处理因特网大小的网络协议,同时也是能够处理好不相关路由域之间的多路连接的协议,今天小编主要来聊一聊徐州BGP机房与普通机房之间的区别有哪些&#x…...

VBA 程序运行中禁用鼠标键盘

1. Application.Interactive False:Excel 将阻止键盘和鼠标的所有输入,但代码显示的对话框的输入不受影响。 True:打开交互模式。 下面的代码程序一旦运行就会限定在Excel的事先选定的单元格输出。 如果注释掉Application.Interactive F…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异&#xff…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...