当前位置: 首页 > 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…...

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 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...