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()函数会执行以下操作:
- 初始化【Variables to initialize】里面指定的变量
- 调【Initialization functions】里面指定的初始化函数
- 按任意的顺序调【Functions to call】里面指定的函数
如果没有指定以上操作,main()函数会执行以下操作:
- 初始化除了有关键字const和static以外的全局变量
- 按任意的顺序调代码里面没有被调用的函数。
由于自动产生的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…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...