主要内容

MISRA C++:2023 Rule 6.7.1

Local variables shall not have static storage duration

自 R2024b 起

描述

Local variables shall not have static storage duration. 1

理由

多个线程或函数可以同时访问具有 static 存储期的对象。在不同函数间共享对局部对象的访问权限可能导致多个函数同时读取或写入同一个对象,从而引发数据争用和未定义行为。

此规则不适用于 constconstexpr 对象。

Polyspace 实现

如果您使用 static 关键字声明局部对象或局部匿名联体合,则 Polyspace® 会报告违反了此规则。

例外情况是,如果您使用此关键字声明局部对象 constconstexpr,则 Polyspace 不会报告违反此规则。

故障排除

如果您预期会出现违规,而 Polyspace 未报告该违规,请参阅诊断为何编码规范违规未按预期显示

示例

全部展开

在此示例中,当您使用 static 关键字声明局部对象时,Polyspace 会报告违反了此规则。

int GLOBAL_COUNTER = 0;      // Compliant- static global object

class myClass
{
	static myClass &create() //static local function
	{
		static myClass app;   //Noncompliant
		return app;
	}
};

int myFunc(myClass a)
{
	int iterator = 0;          // Compliant
	static int static_counter = 0;   // Noncompliant
	static constexpr float PI = 3.1416;  // Compliant by exception- constexpr
	//...
}

作为例外,具有 constexpr 存储期的 static 局部对象不违反此规则。

检查信息

组:基本概念
类别:必需
PQL 名称:std.misra_cpp_2023.R6_7_1

版本历史记录

在 R2024b 中推出


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.