PVS-Studio:支持编码标准MISRA C和MISRA C ++

PVS-Studio,MISRA C,MISRA C ++

从版本6.27开始,PVS-Studio静态代码分析器可以根据MISRA C和MISRA C ++标准对警告进行分类。 由于这些标准的支持,分析仪已变得可以有效地用于提高嵌入式程序的安全性,可移植性和可靠性。

今年,我们开始在PVS-Studio分析仪中支持CWESEI CERT等标准。 基本上,支持归结为根据这些标准在分析仪中已经实现的诊断的分类。 此外,已实施了几个新的诊断程序或扩展了几个旧的诊断程序以更完全满足这些标准。

PVS-Studio 诊断程序符合各种标准的符合性表:


现在是时候制定MISRA C和MISRA C ++标准了。 这些是由MISRA (汽车工业软件可靠性协会)创建的C和C ++软件开发标准。 该标准的目标是提高嵌入式程序的安全性,可移植性和可靠性。 标准文本已付款。

我们认为分析仪的强度足以在现有的大型项目中使用并开始使用。 您可以在代码的基础上运行PVS-Studio,检测旧错误,然后定期使用分析仪尽早发现新缺陷。

许多分析仪采用不同的路径并实施与编码标准相关的诊断。 他们建议如何更好地命名变量,提醒您在文件的开头插入注释,等等。 这是必要且有用的。 但是,在这种情况下,分析仪非常“嘈杂”,并生成大量警告,其中淹没了有关错误的警告。

我们决定将PVS-Studio用作搜索错误的分析器。 这就是他的竞争优势。 程序员可以在大型代码库上运行它,并确保他不会被关于代码设计的大量消息所淹没,并且能够专注于错误。

因此,我们最初对MISRA标准持批评态度,并且很长一段时间没有计划实施它们。 MISRA标准旨在简化和提高整个代码的质量,从而有助于防止错误。 也就是说,其中的大多数诊断都与编写代码的样式有关。 最好用一个例子来解释。

MISRA标准中有一条规则,该规则将if语句的主体括在花括号中。 在MISRA C中,这是规则15.6;在MISRA C ++中,它是6-4-1。 错误的代码示例:

if (i == bestOffs) continue; 

正确的代码是:

 if (i == bestOffs) { continue; } 

此类诊断不能应用于在Winodws,Linux或macOS操作系统的控制下编写的现有项目。 例如,仅上述关于大括号的规则为WinMerge项目提供了1947 V2507诊断操作 (MISRA C 15.6,MISRA C ++ 6-4-1)。 但是WinMerge是一个小项目! 在C和C ++中,只有大约250,000行代码。

直到2018年,PVS-Studio分析仪一直专注于测试在Windows,Linux和macOS上运行的桌面应用程序。 因此,对MISRA的支持几乎没有实际意义。 没有人会在现有的大型桌面项目中实施此标准。

自2018年我们开始支持嵌入式系统以来,一切都发生了变化。 今年,分析仪支持:

  • 窗户 IAR嵌入式工作台,用于ARM C,C ++的C / C ++编译器
  • Windows / Linux Keil µVision,DS-MDK,ARM编译器5/6 C,C ++
  • Windows / Linux 德州仪器Code Composer Studio,ARM代码生成工具C,C ++
  • Windows / Linux / macOS。 GNU Arm嵌入式工具链,Arm嵌入式GCC编译器,C,C ++

与桌面项目不同,许多嵌入式开发人员已经在编写项目时考虑了MISRA的建议,他们对我们分析仪的支持将对开发人员非常有用。

但是,我们仍然担心其中一位开发人员在不了解的情况下可能会认为我们通过在分析器中引入“奇怪的诊断”来“破坏”了分析器。 因此,MISRA诊断默认情况下处于关闭状态。 我们认为这是一个非常正确的决定。 仅当您确切知道它们的用途和使用方法时,才能包含这些诊断程序。

例如,对于应用程序程序员来说,可能不清楚为什么分析器突然禁止他们使用动态内存。 即 为什么突然之间您无法使用malloc函数或new运算符分配内存。 但是嵌入式设备的开发人员已经很好地理解了此类限制( V2511 )。 在某些连续运行的设备中,使用内存可能突然耗尽的程序确实是不可接受的。

因此,现在您可以安装或更新PVS-Studio并开始使用实现MISRA C和MISRA C ++中的规则的诊断程序。 支持的规则集不完整,但这不应成为开始使用PVS-Studio的障碍。 目前,还没有一个静态分析器可以完全实现所有MISRA规则。 将来,我们计划扩展在MISRA中实施的诊断规则集,并希望成为其支持完整性的领先工具。

要在Visual Studio或PVS-Studio Standalone实用程序中启用MISRA诊断,您需要在设置中将“已禁用”更改为“全部显示”。

启用MISRA

由于“禁用”意味着根本不会生成警告,也不会进入报告,因此需要重新启动分析。 默认情况下,设置为禁用模式,以减小报告的大小。 包含MISRA诊断程序可能导致大量操作,并带有报告的文件(* .plog文件)大大增加。

为了分析Linux和macOS操作系统中的项目,有一个实用程序pvs-studio-analyzer。 默认情况下,此处仅包含通用诊断程序(General Analysis,GA)。 可以使用-a选项启用其他规则:

 -a [MODE], --analysis-mode [MODE] MODE defines the type of warnings: 1 - 64-bit errors; 2 - reserved; 4 - General Analysis; 8 - Micro-optimizations; 16 - Customers Specific Requests; 32 - MISRA. Modes can be combined by adding the values Default: 4 

要启用GA和MISRA警报,您必须使用以下参数运行分析:

 pvs-studio-analyzer analyze ... -a 36 ... -o /path/to/report.log ... 

值36是4(GA-General Diagnostics)和32(MISRA)的按位或。

此外,建议创建多个具有不同警报类型的报告,例如:

 plog-converter -a GA:1,2 -t tasklist -o /path/to/ga_results.tasks /path/to/project.log plog-converter -a MISRA:1,2,3 -t tasklist -m misra -o /path/to/misra_results.tasks /path/to/project.log 

第一个ga_results.tasks报告将包含“高”和“中”置信度级别的常规警告。

第二个报告“ misra_results.tasks”将仅获得与所有级别的MISRA相关的警告。 “ -m misra”开关表示除PVS-Studio格式的数字外,该报告还将包含根据MISRA分类的诊断号。

文档中介绍了Linux和macOS中所有分析仪的启动模式以及报告格式。

PS:我们想通过选择MISRA作为PVS-Studio的发展方向之一来评估我们的猜测。 如果您对此主题感兴趣,请写信给我们 。 即使您尚不打算使用PVS-Studio,也请写信。 我们想问您一些澄清的问题。

附加链接:

  1. 下载PVS-Studio
  2. 如何在Linux和macOS上运行PVS-Studio
  3. PVS-Studio 6.22静态代码分析器适用于ARM编译器(Keil,IAR)
  4. PVS-Studio包括对GNU Arm嵌入式工具链的支持



如果您想与说英语的读者分享这篇文章,请使用以下链接:Andrey Karpov。 PVS-Studio:支持MISRA C和MISRA C ++编码标准

Source: https://habr.com/ru/post/zh-CN432660/


All Articles